NETフレームワークに出荷されたものにマッピングされていない言語データ型の可能性は?

StackOverflow https://stackoverflow.com/questions/4513044

  •  12-10-2019
  •  | 
  •  

質問

誰かが知っていますか 管理されています Common Type System/FCL/BCLにマッピングされていない専門データ型または出荷された.NET等価型(System.String、System.Int32などの出荷標準型タイプを持っていない専門データ型を含む.NETに実装されたプログラミング言語)?

この質問は、誰かがコンパイラを移植するという観点から来る可能性があります(私はそうしていませんが)。

特殊な型のためにBCL/FCLの外側に新しいデータ型を作成する言語と同じくらい簡単ですか?もしそうなら、これは、Visual BasicやC#など、すべての組み込みのデータ型をBCL/FCLにマッピングすることに慣れているプログラミング言語間の相互運用性を妨げますか?

何らかの種類のあいまいな言語コンパイラが、出荷されたフレームワークに暗黙的なデータ型の1つを直接マッピングしない.NETに移植されている場合、この状況が生じるかもしれないと想像できます。

この状況はどのようにサポートされていますか、または一般的に許可されていますか?コンパイラと共通言語ランタイムの期待はどうなりますか?

役に立ちましたか?

解決

Delphi for .NETは、Delphi言語のクラス変数(クラスタイプへの参照を保持できます)、仮想クラスメソッド、および仮想コンストラクター(クラス参照を介して呼び出される)という概念を実装しました。これらのどれもCLRに直接アナログを持っていません - CLRの静的メソッドは仮想ではなく、コンストラクターは仮想ではありません。

CLRにはランタイムタイプ情報のこのような豊富なスープがあるため、これらのアーティファクトはCLRで厳密に必要はありません。コンパイル時に正確なタイプを知らないコードの実行時にタイプのインスタンスを作成する場合は、反射またはその他のテクニックでそれを行うことができます。 Delphi言語のこれらの機能は、ランタイムタイプの情報が制限されているネイティブにコンパイルされたWin32製品から生まれました。これはすべて、DLRのようなものが登場するずっと前に、.NET 1.0と1.1に実装されました。

これらのDelphi言語の機能は、反射を使用してCLRでエミュレートできますが、パフォーマンスの理由から、Delphiで宣言されたすべてのクラスタイプのサイドカーである「メタクラス」タイプを作成することにより、ILで直接実装することを選択しました。 DelphiコードがDelphiクラスタイプをクラス参照変数に割り当てた場合、ILコードを生成して、対応するMETAクラスのSingletonインスタンスを変数に割り当てました。クラス参照変数を介した仮想メソッド呼び出しは、メタクラスインスタンスのIL仮想メソッド呼び出しとしてコードゲンであり、対応するクラスタイプの実際の静的メソッド実装にバウンスしました。これにより、クラス仮想メソッド呼び出しは、コールを行うために使用されるインスタンスのタイプに適した実装を呼び出すことができます)と最小限のランタイムパフォーマンスコストで動作することができました。この実装もタイプセーフで検証可能でした。

これらの仮想クラスのメソッド機能は、Delphi構文で宣言されたクラスにのみ適用され、Delphi構文でのみ使用可能です。メタタイプは、他の.NET言語がDelphiで作成されたクラスを使用するときに(おそらく)それらを無視するように、非CLSに準拠しているとマークされたと思います。他の.NET言語は、これらのDelphi固有の言語機能を利用できませんでした(開発者が実際に決定され、足場を登って登って、醜い名前のメタクラスに適切な呼び出しを行うことができない限り)

一般に、他の言語があなたの言語によって作成された/CLSアーティファクトを使用することを期待してはなりません。他の言語があなたの言語によって作成されたものを利用したい場合は、CLS準拠の用語で合理的な方法で表現できる方法であなたの特別なソースを表現する方法を把握する必要があります。それは特別なソースの性質に応じて不可能かもしれません。

Delphi仮想クラスメソッドは、通常の静的方法として他の.NET言語で利用できました。多型の性質は、CLS(または他の言語)が単に概念を表現できないため、他の.NET言語にさらされていませんでした。

理想的には、すべての言語は、考えられるすべての構成を等しく表現することができます。しかし、実際にはそうではありません。いくつかのグラフ機能は、デカルト座標で表現しやすくなりますが、他のグラフは極座標を使用して非常に簡素化されます。同じことが言語のプログラミングにも当てはまります。

CLRに実装されている場合でも、自分の言語で新しい表現手段を発明しても構いません。言語のコードが他の人から呼び出されることを期待している場合、あなたのタイプがあなたの言語の外で作業するプログラマーにとって、あなたのタイプの見た目の明確な定義を維持してください。あなたの実装には二重性があります:あなたの言語のユーザーに物事がどのように見えるか、そしてあなたの言語以外のユーザーに物事がどのように見えるか。

脚注:Delphi Prismの.NETのNew Delphi製品に当てはまるとは思わない。 Delphi Prismが仮想クラスの方法をサポートしているとは思わない。

他のヒント

あまり。どの言語にも成功するためにコモディティハードウェアで実行できるようにする必要があるという究極の負担があります。 CTSは、現在のハードウェアで効率的に処理できるタイプの非常に優れたモデルです。

必要なのは、言語のタイプシステムとCLIのシステムとの間に適応するためのランタイムサポートの大きな塊です。古典的な例は、PythonやRubyなどの動的言語のランタイムサポートシステムであるDLRです。基本的に、そのような言語通訳も同様にしなければならないことを行い、同等のパフォーマンスを持っています。ところで、すべてが純粋なC#コードです。

このようなランタイムサポートライブラリは、言語にまったく利用できない機能があると、遅くなる場合があります。たとえば、複数の継承。 CLRとJITコンパイラによってネイティブに「サポート」されています。 MIを使用し、 /CLRオプションを使用してC ++コンパイラを介して実行する標準的な準拠C ++プログラムについて取得でき、実行時にジャストインタイムコンパイルされる純粋なILを含むアセンブリになります。想像力の広がりによって、結果をマネージドプログラムと呼ぶことはできませんが、検証可能ではなく、ガベージコレクターを使用しません。それを解決するのは、複数の継承をエミュレートする必要があるサポートライブラリを必要とするでしょう。可能です、私はそれが競争力があるとは思わない。

さて、C ++/CLIがあります。そこでは、.NETには表示されないC ++クラスを作成できます。それはあなたが望んでいるものですか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top