中間コードの章でクラスコンパイラの設計をしています。ネットで調べていたら、こんな一文を見つけました。
ソースプログラムに複合命令を含めることができる場合は、再帰的な解釈が必要です。
Googleで複合命令が何であるかを見つけることができません。
中間コードの章でクラスコンパイラの設計をしています。ネットで調べていたら、こんな一文を見つけました。
ソースプログラムに複合命令を含めることができる場合は、再帰的な解釈が必要です。
Googleで複合命令が何であるかを見つけることができません。
この場合 (リンクを参照)、ライターは、反復インタープリターと呼ばれるものとは対照的です。反復インタープリターは、各命令を読み取って従うだけで、次の命令に移動し、一連の命令の分析を行う必要があります。それらを行う順序を見つけるための指示。
しかし、私には、この素材の質は疑わしいように思えます。
その章はややロープです。
通訳者:
別の言語で表現されたプログラムを実行する、ある言語で表現されたプログラム。
通訳者が同じ言語で書かれている場合については、自己通訳者とメタ循環通訳者を参照してください。
インタプリタはソース プログラムをコンパイルし、すぐに実行します。
いいえ、それはジャスト イン タイム コンパイラです。JIT 手法はインタープリターで使用できますが、コンパイルされた実行可能ファイルのサイズを縮小するためにも使用されます。真のインタープリターは JIT コンパイラーではありません。
解釈は、コンパイルされたマシン コードの実行よりも遅くなります。
通常は、JIT コンパイラーよりも完全なソース コードを使用するインタープリターの方が優れた最適化を行うことができます。
ソースプログラムが行ごとに実行できる場合、反復解釈が可能です。
そうでない場合も可能ですが、「反復解釈」を使用して「ソースコードを一度に 1 行ずつ読み取って処理する」ことを意味している場合を除きますが、後で「 [反復] インタープリター [...] はシーケンスを繰り返します」フェッチ、分析、および実行の. [...] 反復ループで繰り返されます.", だからいいえ - 解析して何らかの処理を行ったら、どんな入力でもそれを行うことができます.
コマンド言語のインタープリターは反復可能です。
確かにそうですが、この点に関してコマンド言語について特別なことは何もありません。どの言語も、反復アプローチまたは再帰アプローチを使用して解釈できます。
ソースプログラムに複合命令を含めることができる場合は、再帰的な解釈が必要です。
明示的なスタックを使用して、任意の再帰プロシージャを反復プロシージャにマップできるため、再帰の実装が厳密に必要になることはありません。
これは、主にそれが意味をなす唯一の方法であるため、項が合成された式と同じ意味であると想定しています。
あなたが見るインタープリターを持っているなら:
z = a + 5
次に、式a + 5
について、 の値が何であるかを調べることができa
、定数5
を知っているので、結果を計算a + 5
して に格納できますz
。
式が代わりの場合:
z = a + ( b * c )
次に、 の値を調べることができますa
が、計算するには、b * c
それ自体を再帰的に呼び出すかz = a + pop()
、スタックにプッシュして を計算する必要がありますpush(b*c)
。
反復インタープリターを使用して複合用語の表現を解釈するには、一時変数を使用してソースを線形形式に変換できます。
z = a + ( b * c )
になります:
temp = b * c
z = a + d
複合語を含むすべての式は、非複合語に還元できます。通常、この変換は、コードがインタープリターのメイン ループに到達する前に行われ、そのメイン ループがより単純で高速になります。
高水準言語のインタープリターは再帰的でなければなりません。
間違っています。上記を参照してください。
クエリ言語のインタープリターは再帰的でなければなりません。
間違っています。上記を参照してください。
再帰的解釈は、反復的解釈よりも遅くなります。
一般的には正しいですが、探してみるといくつかの例外があると確信しています。
ここにあなたのための参照があります: