web-dev-qa-db-ja.com

インタプリタvsコンパイラvs仮想マシン

インタプリタ、コンパイラ、VMについて質問があります

インタプリタとコンパイラの違いはわかりましたが、VIRTUAL MACHINESと前の2つの違いは何ですか?インタプリタとコンパイラに対するVMの長所と短所は何ですか?

どうもありがとう

26
DodoSombrero

仮想マシンは、コンパイラやインタプリタに完全に代わるものではありません。実装されているVMの数であるJITコンパイラについて考えていると思います。

仮想マシン自体は、その名前が示すとおりです。実際には存在しないマシン(プロセッサ)です。たとえば、ほとんどのプロセッサには、メモリ割り当てを処理する固有の方法や、タイプの知識がありません。 Java VMただし、特定のクラスのインスタンスを割り当てるnew命令があります。VMは、これが、VMの基本的な操作単位である独自のオペコードに値する言語で十分に重要な概念であると判断しました。

独自の命令セットを作成する利点は、一般に、長いコンパイル/最適化時間と遅いインタープリターの間のギャップを埋めることです。たとえば、Javaクラスをコンパイルする場合、レジスタ割り当てやインライン化、またはその従来のコンパイラの処理を行う必要はありません。JITは後でそれを行いますが、十分な回数実行し、プログラムの実行全体に分散するコードの一部。JVMの命令セットはJavaに十分近いため、最初のコンパイルは高速で、シンプルで高速です。 Javaソースコードとは異なり、VM用に読み取ります。

インタプリタとJITコンパイラのトレードオフは、通常、実行時のパフォーマンスと開発時間の関係です。 JITの開発にはかなり時間がかかりますが、インタプリタの実行にはかなり時間がかかります。ただし、スクリプトや中小規模のWebサイトなど、多くの場合、プログラムはJITを使用する利点を実際に確認するのに十分な時間実行されません。

VMwareのようなソフトウェアについても言及する必要があります。これも仮想マシンですが、実際のハードウェアでも使用される命令セットを使用しています。これは、物理的に存在しないマシンのふりをするという点で、言語VMと同じ基本概念ですが、実際には異なり、非常に複雑です。

25
parkovski

分かりやすい英語

Compilerは、ある言語を別の言語に変換します。たとえば、C#をILに、Javaをバイトコードに、C++をバイナリマシンコードに。コンパイル段階では実行されません。

Interpreterは、ソースファイルから一度に1行を解釈(実行)します。 PHP、Perl、その他のスクリプト言語など

仮想マシンはいくつかのことを参照できますが、私が知っている2つは次のとおりです。

  • Hyper-VXen などのハイパーバイザー関連の仮想マシン。これらにより、単一のハードウェアで複数のOSを実行できます
  • Java仮想マシン共通言語ランタイム のようなソフトウェアランタイム。このソフトウェアを使用すると、プラットフォームに依存しない中間言語(ILコード、バイトコード)を実行し、マシン固有の命令を実行できます( ジャストインタイムコンパイル )。通常、このようなVMは、リソース管理、メモリクリーンアップ、スレッド化、セキュリティなどの他の衛星タスクを担当します。

長所と短所はありません。 3つすべてが、ほとんど比較できない異なる仕事をしています。

言語とプラットフォームは特定の順序ではなく、文字通り何百もの他のサンプルがあります

17
oleksii

実マシンと仮想マシン

  • 実機とは、機械語がハードウェアで実行される機械です。
  • 仮想マシンは、「マシンコード」がインタプリタによって実行されるマシンです。

インタプリタとコンパイラ

回答はこちら

6
martynas