web-dev-qa-db-ja.com

言語の相互運用性を処理する最良の方法

バックグラウンド

F#などの言語では、他のほとんどの.NET言語との直接の相互運用が可能です。たとえば、C#で記述されたクラスをF#で直接使用したり、C#から直接F#コードを呼び出したりすることができます。

F#では、モジュールは、静的クラスに対応するCIL命令、クラス階層へのADT(抽象クラ​​ス+サブクラス)などにコンパイルされます。これにより、相互運用が容易になりますが、言語機能にいくつかの制限があります。

たとえば、F#はOCamlやSMLのような高次モジュール(または型クラスなどの「類似した」メカニズム)をサポートしていません。これが重要であるかどうかは主観的ですが、それはポリモーフィックコードを書くためのオプションを制限します(OO言語の一部を使用せずに)。

一部のインターフェースによる相互運用性

もちろん、代替手段は言語の主要部分の相互運用性の問題を無視せず、特定の相互運用性インターフェースを作成します。これは一方向または双方向です。

たとえば、F#のような言語では、代替設計は次のようになります。

  • 今日のように、F#がC#クラスを直接使用できるようにします。このようにして、.NETライブラリの使用は依然として簡単です。
  • 機能的なF#コードに直接アクセスするC#の機能を無視します。これにより、現在言語設計に課せられているいくつかの制限が取り除かれます-このようにして、より高次のモジュールや型クラスなどを備えた、より強力な型システムを簡単にサポートできます。
  • C#がOO F#の一部に直接アクセスできるようにします。したがって、C#からF#ライブラリにアクセスできるようにしたい場合は、それらを細くする必要がありますOOラッパー。

これにはいくつかのケースで少し作業が必要になりますが、私の経験では、F#ライブラリをC#で使用する場合、ほとんどの人がOOラッパーを設計することになると思います。

F#ライブラリにOOラッパーがない場合でも、自分で作成することは可能です(F#では明らかに)。

より極端な場合、このインターフェイスは双方向であり、F#は一部のインターフェイスを介して.NETクラスにしかアクセスできませんが、この場合、このような制限を課す理由はほとんどありません。しかし、他の言語については、それはオプションかもしれません-例えば、あなたが純粋な言語かそのような何かを書きたかったなら。

実際の質問:長所と短所

  • これらのアプローチのそれぞれの長所と短所は何ですか?
  • それは技術的に実行不可能または非現実的でしょうか?
  • C#が、CLRなどを「誤用」しているアセンブリと相互運用することは不可能でしょうか? (注意、質問は.NET固有ではなく、ScalaなどのJVM言語や、あなたが最もよく知っているものに基づいて回答することもできます)
  • 推測されたアプローチを使用した言語はありますか? (.NETから.NETのような上位レベルで、低レベルのコードなどへのFFIを持つ言語だけではありません)
5
nilu

問題の1つは、モデルへのプログラミングです。もう1つの問題は、マシンへのプログラミングです。したがって、モデルにプログラミングして、あらゆる種類の特別な機能を維持する中間コンパイルを作成できます。その場合、中間体はマシンをプログラムするものである必要があります。マシンの理解を拡張したり、コードの実行内容をダウングレードしたりするための互換性を提供するサポートライブラリが提供される追加のコードが存在する場合があります。

C#からの関数コードを無視しても、F#は改善されません。 F#は現在、機能強化されたOcaml(ただし.Netエコシステム用)と同様のスタイルでモデル化しており、ランタイムとタイプシステムを操作するF#の状況です。そのランタイムで表現できるものを拡張すると、すべての言語にメリットがあります。

デリゲートは実行の単位を具体化するために使用される1つのメソッドクラスのように設計されているため、C#のラムダ関数のようなものは既に薄くラップされています。 F#は、静的メソッドを含むクラスと同様にモジュールを使用します。これはすべて無料です。


ある言語を別の言語から切り離すことは不可能ではありません。言語の相互運用を困難にすることは現実的ではありません。その理由は、ランタイムを拡張して改善し、より多くの言語を許可し、クロスライブラリの使用を促進することです。特にC#では、型システムに公開された適切な値を使用できる場合に呼び出すことができるライブラリに制限はありません。コードは安全でなく、そのようにマークされる可能性があります。 (おそらく将来の機能によって)コードを高度なものとしてマークし、ILで実行できるより多くのことを実行できるようにすることができます。

チェックのコードベースを管理してコンパイラとジェネレータの追加機能をサポートする問題は、見つかったいくつかの有用なコードパターンを具体化することです。したがって、タイプがジェネリックである場合、コンパイラーは解決可能な可能性であるすべての種類のすべてのタイプのバージョン、または使用に基づく遅延ジッタージェネレーターを生成します。次に、種類が考慮されることを保証するものについて考えますか?使用法または含まれるスコープのテーブルルックアップだけですか?

簡単な答えは時間と欲望です。外部の影響力が問題や時間についてのさまざまな意見を表明しているため、それらの問題に自分自身が割り当てられているため、オプションを検討することは主要な著者の注意を引くようになります。 usersvoiceサイトが役立ちます。私自身は、何をどのようにコードを書くかを超えて拡張する衛生的なマクロに関心があります。ありがとうございました。良い一日。

1
Yemi Bedu