1

この質問は、定義、セマンティクスに関するものです。

ソースをリアルタイムでマシンコードに変換したり、後でリアルタイムまたは実行直前に「コンパイル」される中間キャッシュに変換したりする、解釈の一般的な概念を理解しています。

ソース > バイトコード変換ステップとバイトコード > マシンコード変換ステップの間に意味上の区別はありますか? 人々は通常、最初の部分を「解釈」と呼び、2 番目のステップを「編集」と呼びますか。誤解しないでください。動的言語の範囲外でのコンパイルの定義を求めているわけではありません。それは別のトピックです。

さらに、非常に多くの異なる手法を実装する多数のインタープリターが存在するため、これら 2 つのステップを意味的に区別することは無駄でしょうか?

4

2 に答える 2

3

通常、解釈とは、インタープリターによる任意の形式 (プレーン ソースコード、抽象構文ツリー (AST)、バイトコードなど) でのプログラムの実行を意味します。

一部の仮想マシンは、プログラムの中間表現をネイティブ マシン コードに変換 (コンパイル) する JIT (ジャスト イン タイム コンパイラ) を多用します。これは間違いなくコンパイルの形式です。

また、一部の VM はコンパイルのいくつかのフェーズを実行します。最初に AST がバイトコードにコンパイルされ、後でマシン コードにコンパイルされます。

コンパイルとは、基本的に、ある中間表現を次の表現に変換することを意味します。

于 2012-04-27T18:56:41.320 に答える
1

通訳者が行う手順は、通常、次のようなループでプログラムされます。

get next instruction
parse and interpret its components
dispatch its translation

言語の定義とセマンティクスは、インタープリターでのみ実装されますが、他の場所で定義されます。

あなたの質問に対する答えは、解釈またはコンパイルされている言語の形式的、操作的、および公理的意味論的定義にあります。どちらの場合も、形式言語定義のセマンティクスは、使用される実装手法に関係なく、解釈またはコンパイルのために保持され、一貫している必要があります。

インタプリタやコンパイラなどの言語の実装は、その言語の各言語構造の実装をその正式なセマンティック定義に対してテストするテストスイートに対してテストされます。

言語設計者は、表示的意味論などの記号形式で言語の正式な定義を生成します。この定義は、数学的な観点からは非常に抽象的なものです。

コンパイラーまたはインタープリターの実装者は、ターゲット・マシンで実行するコンパイラーまたはインタープリターの構築に直接関連する言語の操作的意味定義に関心があります。

言語のユーザーは、言語の構造を使用してプログラムを作成する方法をプログラマーに通知する、言語の公理的定義に関心があります。

于 2012-04-27T19:32:37.563 に答える