CIL はオブジェクト指向のアセンブリ言語であり、完全にスタックベースです。そのバイトコードはネイティブ コードに変換されるか、最も一般的には仮想マシンによって実行されます。
なぜ CIL が必要なのですか? CIL の代わりに C# をネイティブ コードに変換することはできませんか? すべての .Net 言語が CIL にコンパイルされる場合、IL の代わりに C# が使用されないのはなぜですか? CIL は C# や VB よりも表現力がありますか?
CIL はオブジェクト指向のアセンブリ言語であり、完全にスタックベースです。そのバイトコードはネイティブ コードに変換されるか、最も一般的には仮想マシンによって実行されます。
なぜ CIL が必要なのですか? CIL の代わりに C# をネイティブ コードに変換することはできませんか? すべての .Net 言語が CIL にコンパイルされる場合、IL の代わりに C# が使用されないのはなぜですか? CIL は C# や VB よりも表現力がありますか?
質問はより一般的です:なぜ中間言語が必要なのですか? 多くの最新の高水準言語が中間形式にコンパイルされ、その後ネイティブ コードに解釈/JIT されるのはなぜですか?
まず、独自の中間言語を使用しているのは .NET だけではないことに注意してください。Java には、他にも多くの言語/プラットフォームがあります。
このアプローチを支持する理由はいくつかあります。最も重要なのは、中間言語がランタイム環境のアーキテクチャを抽象化することです。特定のアーキテクチャに結び付けられるのではなく、いくつかの抽象化を使用します (たとえば、物理マシンにはレジスタがありますが、CIL にはレジスタがありません。CIL には、しばしば物理レジスタに JIT されるローカル変数があります)。
抽象化は、セキュリティとパフォーマンスについての推論がはるかに簡単であることを意味します。たとえば、J. Kennedy と D. Syme によって証明された、CIL が型安全であるという正式な定理があります。また、抽象的な中間形式は、プラットフォームのネイティブ コードよりもコンパクトになる可能性があります。もう 1 つの利点は、実際の実行で現在のシステムに関する情報を使用できることです。たとえば、32 ビット環境と 64 ビット環境で実行されたまったく同じ CIL を、64 ビット レジスタの可用性を反映して、異なるネイティブ コードに JIT することができます。
http://en.wikipedia.org/wiki/P-code_machine
C# は中間言語としては適していません。CIL と C# はどちらもチューリング完全です。つまり、他のプログラミング言語を C# と CIL の両方にコンパイルできますが、C# はあまりにも抽象的で高レベルです。したがって、一部の非オブジェクト言語を C# (関数型言語、宣言型言語) にコンパイルするには、多くの C# コードが必要になる可能性があり、実際の実行は、すべての高レベル言語がまったく同じ抽象的であるがそれでも対象とするシナリオと比較して遅くなります。ネイティブ コードに効果的に JIT できる非常に低レベルの中間言語。
これが、CIL に C# にはない機能が含まれている理由です。たとえば、CIL はメソッド ポインターと末尾の呼び出しをサポートしていますが、C# は両方を必要としません。一方、C# には、 CIL には存在しないプロパティの概念があります。これは、プロパティが、言語に表現力を導入するのではなく、言語に何らかの利便性を導入するのではなく、単なる構文糖衣と見なすことができるためです。