"インタープリタ"は、ディスカッションの文脈に依存しますか?
純粋に抽象的なビューインタプリタから
を動的に他の言語のハードウェア/ソフトウェアのターゲット・コード、1つの言語で書かれたプログラム・コードを変換するランタイム中に存在する任意の中間プログラムとして定義することができます。 x86ハードウェア上でJavaバイトコードを実行するか、PythonをCLR VM上で実行することについて、IronPythonの正確さを考えてください。このビューでは、すべての仮想マシンは何らかの種類のインタープリタです。実行時にプログラムが存在するので、静的コンパイラやハードウェア実装のVM-sとは明らかに異なります。
は今のアクセントが「動的」であり、「実行時に存在する」この機能を実現するためにさまざまな方法があります。 VMの事項の実装は、人々が「古典」インタプリタとJIT-ED 1の間に明確な区別をし議論に
。古典的なインタプリタは、ホストされたプログラムのすべての命令に対して、ターゲットコードのルーチンを発行するものです。このデザインは簡単に作成できますが、最適化するのは難しいです。 JIT-edの設計では、元のコードの一連の命令を読み取り、それらの命令をすべてネイティブのコンパイル済みルーチンに変換します。したがって、より速く「解釈する」。これは、VM内のマイクロスタティックコンパイラのようなものです。 JITとラベル付けされた動作を達成するにはさまざまな方法があります。そして、コンパイラのトレースのような他のアプローチがあります。
現代VMのCLR、ホットスポットとJ9 JVMのように、より複雑なJITや通訳などの単純なラベルでタグ付けするよりもです。それらは同時に静的コンパイラ(AOT実行)、古典的なインタプリタ、およびJIT-ed VMとなることができます。
たとえば、CLRは先読みコード(静的コンパイラ)をコンパイルして、ホストされているプログラムのより早いスタートアップに使用するために、ネイティブコードをディスクに保存することができます。私は "ngen"はこの機能のためにWindowsで使われているAOTプロセスだと信じています。 AOTが使用されない場合、CLRはJIT VMとして動作します。
J9ホットスポットは、コード分析と現在の負荷に依存上純粋解釈実行またはJIT-EDとの間のランタイムに切り替えることが可能です。だからそれはかなり灰色の領域です。 J9はCLRに似たAOT機能性を持っています。
はマキシンJVMまたはPyPyのようないくつかの他のVMは "metacircular" VMいわゆるされています。これは、それらが(主に)彼らがホストする同じ言語で実装されていることを意味します(MaxineはJavaで書かれたJVMです)。優れたコードを提供するためには、ホスト言語で実装されたJITのような動作がいくつかあります。これはブートストラップされたものではなく、マシンに近い非常に低いインタープリタによって最適化されています。
インタプリタの実際の定義は、議論の文脈によって異なります。 JITのようなラベルが使用されている場合、実装されているVMの詳細について議論していることが明確に強調されています。