2012-02-07 9 views
1

EN Wikiで私はC#とJavaの両方が解釈された言語だと読んでいましたが、少なくともC#では正しくないと思います。Wikiとの混乱:C#とJavaは解釈されますか?

多く解釈言語はまずネイティブコードに実行 に解釈又はコンパイルされるか、仮想 マシンコードのいくつかの形にコンパイルされます。

私の理解から、それはCILにコンパイルされ、実行時にJITを使用してそのコンパイルされたターゲットプラットフォームにコンパイルされます。私はJITが通訳であることも読んでいます、本当にそうですか? 中間コードを使用していると解釈されますか?私はこれを理解できません。 ありがとう

答えて

4

JITは、ネイティブ(マシン)コードへのコンパイルの形式です。 典型的(ただし必要として)、CLIとJVMのいずれかのインプリメンテーションを2つの段階にまとめる:

  • 言語コンパイラは、中間何か(IL /バイトコード)
  • にコードをコンパイルするJITがそのコンパイルランタイム

でネイティブ/マシンコードにただし、両方ののための通訳はを存在します。 Micro Frameworkは、たとえばILインタープリタとして動作します。同様に、NGENと "AOT"(モノ)のようなツールは、最初にネイティブ/マシンコードにコンパイルすることができます。

1

これらは、解釈とは異なるJIT言語と見なされます。 JITは、実行中に必要なときにネイティブコードにコンパイルするだけです。一般的な方法は、中間表現(バイトコード)に事前にコンパイルしてJITを高速化することです。

しかし、それらが解釈されたり、静的にコンパイルされたりすることはありません。言語は単なる言語であり、どのように実行されるかは言語の観点からは無関係です。 ENウィキに

1

私はC#とJavaの両方の解釈の言語

であることを読んで、あなたがPLSのリンクを提供することはできますか?

と解釈されている可能性があります。はここでは別の意味です。それはおそらく、これらの言語は、最初に、プラットフォームに依存しないコードにソースコードを変換するために解釈されることを意味します。(具体的なVM)

を、彼らは私がそう思うあまりにも中間コードに

を使用していると解釈と呼ばれています。

私はまた、JITが

JITコンパイラであるインタプリタであることを読んだことがあります。 this

0

"インタープリタ"は、ディスカッションの文脈に依存しますか?

純粋に抽象的なビューインタプリタから

を動的に他の言語のハードウェア/ソフトウェアのターゲット・コード、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の詳細について議論していることが明確に強調されています。