別の言語の概念をエミュレートすることから、どのような問題が生じる可能性がありますか?


12

あなたの言語が何らかの概念、たとえばオブジェクト指向、または関数呼び出しをサポートしていない場合、ウェブ上で何度も読みましたが、この他のコンテキストでは良い習慣と考えられているので、それを行うべきです。

私が今目にすることができる唯一の問題は、他のプログラマーがあなたのコードを通常とはあまりにも異なって見つけ、彼らがプログラムするのを難しくしているかもしれないということです。これから他にどんな問題が生じると思いますか?


3
人々はあなたをからかうでしょう、一つの理由:-)
カールビーレフェルト

ネストされた関数パーサーをDからjavaに一度翻訳しましたが、これまでに書いたコードの中で最もクリーンなものではないことを認めます(インターフェイスとその内部で定義されたいくつかのクラスを持つ1つの大きな関数)
ラチェットフリーク

回答:


23

問題の1つは、他の言語で行う方法で何かを表現するために多くのコードを記述しているのに、使用する言語でより簡単な方法があることです。

たとえば、Stack Overflowの回答では、.NET Frameworkで使用される概念であるコードコントラクトを、それらをサポートしないPHPで部分的にエミュレートする方法を説明しました。単純な配列でも同じことができるので、私は結局何もせずにたくさんのコードを書くことになりました。

より一般的には、各言語には独自の文化、独自のベストプラクティス、独自のスタイルがあります。

  • CのようにC#コードを書き始めると、見苦しくなります。

  • Haskellの使用を余儀なくされたJava開発者としてHaskellを理解するが、その長所を理解したくなく、Javaの概念を複製したいだけなら、私が書くコードは苦しむでしょう。

言語を強化しようとしても何も問題はありません(たとえば、F#のように測定単位を導入して C#を強化します)が、やりすぎている場合は、実際にニーズに合った別の言語を選択してください。


+1良い答えです。また、F#のように測定単位をC#に追加した追加の検索用語に感謝します。

2
Javaの使用を余儀なくされたために一度仕事を辞めた人として、私の2セントです。Haskellは、あなたがちょうど陥りたい1つの素敵なブラックホールのようなものです-そして実際の1つとは異なり、あなたはまだ物語を語るために生きています:)
Cetin Sert

クライアント側のJavaScriptなどの選択肢がない場合を除き、別の言語を選択する必要があります。(それでも、選択肢がないということは、プロトタイプ言語でクラスベースのOOPエミュレーションを実装する言い訳にはなりません。言語の仕組みを学ぶだけの方がはるかに効率的です。)
kojiro

@kojiro:または別の仕事。PHPの使用を余儀なくされたとき、私自身も同じ問題を抱えていました。また、独自のコンパイラーの作成など、言語の変更を常に試みていました。それほどクレイジーではない解決策は、私の仕事を変えて、PHPを使用しないプロジェクトでのみ作業を開始することでした。
アルセニムルゼンコ

1
@Cetin Sert:同意してください、Haskellは素晴らしい言語です。しかし、誰かがそれを学びたくないし、関数型プログラミングを理解していないなら、Haskellを高く評価することは難しいでしょう。
アルセニムルゼンコ

10

読みやすさの低下はそれだけで十分な問題です。それは、あなたからの広範なトレーニングなしであなたのプロジェクトを維持する可能性のある人々のプールを劇的に減少させます。

加えて、

  • 外国のパラダイムを実装すると、その使用による潜在的な節約よりも費用がかかる場合があります
  • 外部機能の適応にバグがあり、メンテナンスのコストが増加する可能性があります
  • 外部機能の適応により、テクノロジスタックがネイティブ実装に必要な限界を超える可能性があります。

2
私はかつてバニラCでC ++ダイナミックディスパッチ(仮想テーブルなど)をエミュレートする必要があり、まさにこの問題に遭遇しました。
来るストーム

4

紙に書かれているほど良い考えではありません。

例1:あなたが十分な年齢であれば、Cが町の新しい子供であった時代を思い出すかもしれません。PascalとAdaのプログラマーは、Cの簡潔なオープンとクローズの中括弧が好きではありませんでした。彼らは定義しbeginendブレースを開き、ブレースを閉じ、そして出来上がり!CAda!残念な結果は、AdaまたはCの観点からはfromいものでした。

例2、パーソナル:Common Lisp Object Systemで私が本当に気に入っていることの1つは、メソッドの前、後、および周辺です。それらは複数の場所で非常に便利です。そのため、いくつかの選択した場所でこの概念をC ++でエミュレートしました。これらのコンストラクトをC ++でエミュレートする唯一の方法は、派生クラスの開発者に、コード内の適切な場所で同じ名前の親クラスのメソッドを呼び出すことを要求することです。これは、私のクラスから派生した開発者に、C ++プログラミングとは少し異質で、おそらくC ++プログラミングのグレインに反する要件を課しました。この要件がどれほどよく文書化されていても、人々はガイドラインに従わなかっただけです。なぜなら、それはC ++パラダイムにまったく適合していなかったからです。


2

別の言語の概念をエミュレートすることから、どのような問題が生じる可能性がありますか?

漏れやすい抽象化。


回答にさらに詳細を含めるといいかもしれません。この記事は、抽象化が重要なパフォーマンス最適化のキャプチャに失敗した場合に関するものですが、一貫性のないコーナーケースの動作と一貫性のない保証から大きな問題が生じると思います。後者の例は、out実際にそれらをサポートしないフレームワークでパラメーターをエミュレートしようとするC#の試みです。C#は、すべての関数が常にすべてのoutパラメーターに書き込むことを想定していますが、C#メソッドによって呼び出される非C#メソッドはそのような保証を提供しません。
supercat 14

1

非常に難しい場合があります。C#からJavaアプリケーションにLINQを実装しようとしていることを想像してください。または、レキシカルクロージャーを言語に追加するだけではどうですか?新しいコンパイラを作成する必要があります。これにより、新しい言語が作成されます。

または、独自の言語を実装する必要がない場合は、最初にコードブロックまたはラムダ関数またはクロージャーまたは関数を持たない言語で高次関数(mapなど)を使用してコレクションメソッドを実装しようとすることを想像してください。クラスオブジェクト。高階関数はすべてインターフェイスとして宣言し、明示的に実装する必要があり、クロージャーでキャプチャされるすべての状態は実装クラスに明示的に保存する必要があります。それは非常に多くの余分なタイピングであり、読むのが非常に難しいので、しばしばそれは価値がありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.