0

私は .net フレームワークの理論的概念を学んでいます (wiki と google を使用)。このwiki の画像からわかるように、.net フレームワークでのコンパイルおよび実行プロセスの主要な (そして最も基本的な) ビューでは、c#、j#、vb.net などのさまざまなソース コードがコンパイルされて、 CLIコード(共通中間言語コード)と呼ばれるプラットフォームに依存しないバイトコード。これは、ネイティブコードと呼ばれるプラットフォーム依存のコードにコンパイルされます(または解釈されますか?)。このコードは、特定のプラットフォームで問題なく簡単に実行できるように作成されています。しかし、ソースコードからバイトコードへのコンパイル段階の詳細な説明については、ここで説明されているように混乱しました。私の質問は次のとおりです。

  1. CIL コードがこのアセンブリ、PE 形式、およびマニフェストに格納されているのはなぜですか?
  2. 彼らは何ですか?
  3. それをネイティブの実行可能コードに直接変換してみませんか。また、CIL コードは 1) バイトコード (実行可能コードに解釈される) にコンパイルされることにも言及されています。または 2) バイナリ実行可能コードに。
  4. .net がこれら 2 つの手法を個別に適用するプラットフォームの例を挙げていただけますか? 簡単な言葉で説明してください。

前もって感謝します。

4

1 に答える 1

0

PE 形式は、exe および dll の構造です。もともとはネイティブ コード用に設計されたものです。それを再利用すると、ウィンドウを書き直す必要がなくなり、代わりに「.netフラグ」をファイルに入れ、それが設定されている場合、OSはネットランタイムにフロントエンドから「実行する」ように指示します(あなたのように)デスクトップのアイコンをダブルクリックすると、変更が透過的になります。

あなたは、IL のミッション ステートメントの理由を詳しく説明しました。それが実際に何を意味するのかを知りたい場合は、mono プロジェクトを見てください。

IL は解釈されません。IL へのコンパイル段階が 2 つあるだけです (必要に応じて生の IL を記述できます)。次に、IL からネイティブに 1 つ。利点は数多くありますが、.net 言語がいくつあるかを簡単に確認できます。それらはすべて .IL にコンパイルされ、各ターゲット アーキテクチャ (たとえば 32/64 ビット) ごとにネイティブへの 1 つの IL があります。したがって、6 つの .net 言語と 4 つの OS/アーキテクチャ、つまり 10 個のプログラムを作成して維持する必要があるとすると、IL がなければ実質的に 24 個になります...

.net ランタイムは、JIT コンパイルと呼ばれるものを実行します。あなたが参照する最初の時間は、車アセンブリの Car クラスを言い、それは Car をネイティブ コードにコンパイルし、それ以降はそれを使用します。アプリを起動してバイクだけを見ると、車はコンパイルされません。それは素晴らしいことですが、コンパイルには時間がかかり、場合によっては時間がかかりすぎることがあります。そのため、NGEN と呼ばれるツールがあり、多くをコンパイルするだけです。これはインストールの一部として行うため、JIT コストはかかりません。

あなたがJITに解釈されることについて提供したリンクは、私の意見では少し誤解を招くものです。IL インタープリターを使用できない理由は確かにありませんが、それはフレームワークの機能ではありません。JustInTime コンパイルは、通常発生するものです。ただし、できることは、方程式からJITを取り除いて、exe / dllの完全なコンパイルを行うNGENというツールを使用することです。頻繁ではありませんが、JIT の固有の遅延が問題になる可能性があります。NGEN は基本的に事前にすべてを手動でコンパイルするため、コンパイルによってアプリが遅れる必要はありません。

于 2012-05-14T15:28:34.063 に答える