私はC#について多くの論争を読んでいますが、その中には解釈されていると言われるものもあればそうでないものもあります。私はそれがMSILにコンパイルされていることを知っているし、プロセッサなどに応じて実行時にJITed ...それはVM(.NET)を実行する必要がある方法でまだ解釈されていませんか?C#が解釈されない場合、なぜVMが必要ですか?
答えて
VMはマイクロプロセッサの抽象化に過ぎません。それは単なる定義であり、実際には存在しません。私。 VM上でコードを実行することはできません。ただし、ILコードを生成することはできます。利点は、言語コンパイラが異なる種類の実プロセッサについての詳細を知る必要がないことです。 C#やVBなどのさまざまな.NET言語はILを生成するため、このレベルで互換性があります。これは、一般的な型システムのような他の規約と共に、VBコードから生成されたDLLをC#プログラムで使用することを可能にします。
ILは、.NETアプリケーションを実行するときにWindows上でコンパイルされ、Monoであらかじめコンパイルすることもできます。どちらの場合も、ネイティブ実際のプロセッサーのマシンコードが生成されます。この完全にコンパイルされたコードは、REALマイクロプロセッサー上で実行されます。
異なるアスペクトは、作成する必要があるコンパイラーの数です。あなたはn個の言語を持っていて、メートルプロセッサアーキテクチャ上でそれらを実行したい場合は、N言語ツーIL示すコンパイラ+ MIL-にネイティブコード示すコンパイラを必要としています。この中間抽象レイヤーがなければ、n×mが必要です。これはちょうどn + mよりはるかに多い数になる可能性があります。
"完全にコンパイルされたこのコードはREALマイクロプロセッサで実行されます" ... trueですが、ILから派生したものではなく、仮想マシンの動作を実装する追加コードも実行されます(C#では.NET Common Language Runtime ) –
はい、[CLR](https://en.wikipedia.org/wiki/Common_Language_Runtime)は、読み込み、JITコンパイルのリンク、セキュリティの側面、メモリ管理などを管理します。しかし、私はそれをVMではなく、一種のオペレーティングシステムと比較します。 –
短い答えはいいえです.VMの要件は、それが解釈されたことを示すものではありません。
VMには、ILをネイティブマシンコードに変換するJITコンパイラが含まれています。また、C#プログラムが依存する.NETクラスライブラリも含まれています。また、ダイナミックリンクなどに関わる他のメカニズムも含まれています(Windows DLLメカニズムの上に構築されていますが、.NETはWindowsが提供する機能を超えてVMに実装されています)。
CLI
は、特定のタイプのシステム、これらのタイプのすべての操作のセマンティクス、メモリモデル、および実行時メタデータを定義します。
上記をすべて提供するために、生成されたコードの計測が行われなければなりません。単純な例の1つは、32ビットより大きい数値がサポートされ、浮動小数点演算が各アーキテクチャの仕様に従って動作することです。
さらに、メモリ割り当ての正しい動作を保証するために、CLR
コードの実行中にメタデータ、静的初期化、ジェネリック型のインスタンス化などの追加のプロセスを正しく管理する必要があります。これはすべてVMによって処理され、CPUによって容易には提供されません。
例えばウィキペディアからの引用、:
CLRは、メモリ管理、型の安全性や例外処理などの追加サービスを提供します。
- 1. VB6コンパイルされたアプリケーションでVB5 VMが必要なのはなぜですか?
- 2. なぜminikubeにVMが必要なのですか
- 3. @Entityがある場合、なぜ "annotatedClasses"が必要ですか?
- 4. 検証が '設定されていない場合(sys.argv)'が必要なのはなぜですか?
- 5. ifステートメントがtrueに評価されない場合(必要な場合でも)
- 6. なぜこの場合負のマージンが必要なのか
- 7. なぜHaskellのこのタイプの注釈が必要ですか?
- 8. C/C++にセミコロンが必要なのはなぜですか?
- 9. sqlクエリで結果が返されない(必要な場合)エラーなし
- 10. DelphiのSharemem - 必要がない場合
- 11. 整数が解釈されない
- 12. マニフェストファイルにインテントフィルタが既にある場合、なぜifelseが必要ですか?
- 13. なぜ/きれいなターゲットが必要なのですか?
- 14. フィジカルウェブに場所が必要なのはなぜですか?
- 15. C++ 11でweak_ptrが必要なのはなぜですか?
- 16. C#WPFグリッドの列が正しく解釈されない
- 17. 必要なフラグがない場合、コンパイルが失敗する
- 18. イメージが返された場合は、cvReleaseImageが必要ですか?
- 19. Mongoose自体にスキーマがない場合、Mongooseにスキーマが必要なのはなぜですか?
- 20. なぜ.Net HttpClientの投稿要求が遅いのですか(フィドラーが実行されていない場合)?
- 21. C - なぜstrcpy()が必要なのですか?
- 22. なぜlibstdC++が必要なのですか? C++標準ライブラリの
- 23. アクチベータクラス/ "Bundle-Activator"がプラグインに必要な場合とそうでない場合
- 24. Thymeleafが必要な場合はセットが必要
- 25. LLVM:CallGraphWrapperPassが必要な場合、Clangは実行されません
- 26. C#のテスト - 例外がスローされない場合、ExpectedExceptionタグ付きメソッドが渡すのはなぜですか?
- 27. なぜブロックが実行されていない場合
- 28. ページビルダーがWordPressにある場合、テーマはなぜ必要ですか?
- 29. angular2にjQueryが必要な場合
「解釈済み==はVMを必要としていますか? VMを定義することなくソースコードから解釈することができます(一部のPLTユーザーはすべての言語がVMだと主張するかもしれませんが、一般的な使用法には適合しません)、抽象的に定義されているコンパイルによってのみ実装される "マシンコード方言。それ以外にも、MSILは解釈されるでしょう - C#は明示的にMSILにコンパイルされています。 – delnan
あなたは、Javaについて同じ質問をすることができると思います – sebagomez
@sebastian Javaは "本当に"移植性があります。それはC# – GETah