2012-03-04 6 views
2

私はC#について多くの論争を読んでいますが、その中には解釈されていると言われるものもあればそうでないものもあります。私はそれがMSILにコンパイルされていることを知っているし、プロセッサなどに応じて実行時にJITed ...それはVM(.NET)を実行する必要がある方法でまだ解釈されていませんか?C#が解釈されない場合、なぜVMが必要ですか?

+3

「解釈済み==はVMを必要としていますか? VMを定義することなくソースコードから解釈することができます(一部のPLTユーザーはすべての言語がVMだと主張するかもしれませんが、一般的な使用法には適合しません)、抽象的に定義されているコンパイルによってのみ実装される "マシンコード方言。それ以外にも、MSILは解釈されるでしょう - C#は明示的にMSILにコンパイルされています。 – delnan

+0

あなたは、Javaについて同じ質問をすることができると思います – sebagomez

+0

@sebastian Javaは "本当に"移植性があります。それはC# – GETah

答えて

23

VMはマイクロプロセッサの抽象化に過ぎません。それは単なる定義であり、実際には存在しません。私。 VM上でコードを実行することはできません。ただし、ILコードを生成することはできます。利点は、言語コンパイラが異なる種類の実プロセッサについての詳細を知る必要がないことです。 C#やVBなどのさまざまな.NET言語はILを生成するため、このレベルで互換性があります。これは、一般的な型システムのような他の規約と共に、VBコードから生成されたDLLをC#プログラムで使用することを可能にします。

ILは、.NETアプリケーションを実行するときにWindows上でコンパイルされ、Monoであらかじめコンパイルすることもできます。どちらの場合も、ネイティブ実際のプロセッサーのマシンコードが生成されます。この完全にコンパイルされたコードは、REALマイクロプロセッサー上で実行されます。


異なるアスペクトは、作成する必要があるコンパイラーの数です。あなたはn個の言語を持っていて、メートルプロセッサアーキテクチャ上でそれらを実行したい場合は、N言語ツーIL示すコンパイラ+ MIL-にネイティブコード示すコンパイラを必要としています。この中間抽象レイヤーがなければ、n×mが必要です。これはちょうどn + mよりはるかに多い数になる可能性があります。

+0

"完全にコンパイルされたこのコードはREALマイクロプロセッサで実行されます" ... trueですが、ILから派生したものではなく、仮想マシンの動作を実装する追加コードも実行されます(C#では.NET Common Language Runtime ) –

+0

はい、[CLR](https://en.wikipedia.org/wiki/Common_Language_Runtime)は、読み込み、JITコンパイルのリンク、セキュリティの側面、メモリ管理などを管理します。しかし、私はそれをVMではなく、一種のオペレーティングシステムと比較します。 –

1

短い答えはいいえです.VMの要件は、それが解釈されたことを示すものではありません。

VMには、ILをネイティブマシンコードに変換するJITコンパイラが含まれています。また、C#プログラムが依存する.NETクラスライブラリも含まれています。また、ダイナミックリンクなどに関わる他のメカニズムも含まれています(Windows DLLメカニズムの上に構築されていますが、.NETはWindowsが提供する機能を超えてVMに実装されています)。

1

CLR(仕様CLIの実装)を参照している可能性があります。

CLIは、特定のタイプのシステム、これらのタイプのすべての操作のセマンティクス、メモリモデル、および実行時メタデータを定義します。

上記をすべて提供するために、生成されたコードの計測が行われなければなりません。単純な例の1つは、32ビットより大きい数値がサポートされ、浮動小数点演算が各アーキテクチャの仕様に従って動作することです。

さらに、メモリ割り当ての正しい動作を保証するために、CLRコードの実行中にメタデータ、静的初期化、ジェネリック型のインスタンス化などの追加のプロセスを正しく管理する必要があります。これはすべてVMによって処理され、CPUによって容易には提供されません。

例えばウィキペディアからの引用、:

CLRは、メモリ管理、型の安全性や例外処理などの追加サービスを提供します。

関連する問題