3

それで、これがはっきりとわかるかどうか見てみましょう。

  1. コンパイラとインタープリターの違いは、インタープリターが高レベルの命令を中間形式に変換してから実行することです。[コンパイラも高度な命令を中間形式に変換していると思いますが、現時点では実行ではなく、オブジェクト コードを生成しますよね?]

  2. インタプリタはソース コードを 1 命令または 1 行ずつ読み取り、この行をマシン コードに変換して実行します。 [インタプリタ自体はコードを機械語に変換せず、(解析された後に) 独自のプリコンパイル済み関数を使用して命令を評価します。例えば、高級言語の add 式は、あらかじめコンパイルされたインタプリタ add 関数を使って評価されますよね?]

4

4 に答える 4

3

主な違いは次のとおりです。インタプリタは、ソースコードを実行するときにソースコードを処理します。ソースをマシンコードに変換するのではなく、ソースが指示することを実行するために独自のコードを使用するだけです。コンパイラは、ソースコードを直接実行できるマシンコードに変換します。

すべてのコンパイラが実行プロセスから分離されているわけではありません。たとえば、ほとんどのJavaランタイムには、実行中に必要に応じてJavaコードをコンパイルする「JITコンパイラ」が含まれています。

あなたはその間に物事を持つことができます。基本的に、コンパイルと同様のプロセスを最初に使用して、ソースコードをより小さく解釈しやすいものに変換できます。このコンパイルされた出力は、解釈できます。(たとえば、最初のパスは、たとえば「if」を53に、「else」を54に、「for」を55に、などに変換できます。これにより、インタプリタがコード内の可変長文字列を処理する必要がなくなります。実際には文字列を処理しません。)

于 2012-04-15T11:20:15.097 に答える
1

私は最初のものに同意しますが、インタプリタが一度に1行で作業しているとは限りません(コード全体の知識に基づいて最適化を行うことができます)。

2番目は少しずれていると思います。コンパイラは「マシンコード」(JVMの場合はバイトコードである可能性があります)を作成します。インタプリタは、入力(コンパイラと同じ)に基づいて独自のプログラムの一部を実行します。実行された部分は、(必要なマシンコードを計算するための計算を実行するのではなく)入力で記述された計算を実行します。

コンパイラーは実行時に解釈されるコードを生成できるため、2つの間の境界線を曖昧にすることができます(コンパイル時に利用できない要因に基づいて実行時の最適化を提供するため)

于 2012-04-15T11:22:52.270 に答える
0

(1)についてはあなたの言う通りです。

広告 (2)、インタープリターは一度に 1 命令ずつソース コードを読み取る必要はありません。これは、ループを含むコードを解釈するときにコストがかかりすぎるためです。多くの場合、式、ステートメント、関数、またはソース ファイル全体を読み取り、それらを中間形式に変換して評価します。

コンパイラもインタプリタもマシンコードを生成する必要がないことに注意してください。Java、Python を含む多くのプログラミング言語だけでなく、Prolog などの古いプログラミング言語も、一般に仮想マシンのバイトコードにコンパイルされます。Python と Prolog では、「インタープリター」は通常、バイトコード コンパイラーとバイトコード インタープリターを組み合わせたものです。

私が知っているコンパイルと解釈の最良の紹介は、SICPの第 4 章と第 5 章です。この章では、非常に単純なインタープリターについて説明することから始め、本格的なコンパイラーになるまで繰り返し改善しています。

于 2012-04-15T11:23:16.680 に答える