コンパイルされた言語は、解釈された言語が必ずしも必要としない方法でセマンティクスを制限するため、区別は深く意味があります。一部の解釈手法は、コンパイルが非常に困難です(実際には不可能です)。
解釈されたコードは、実行時にコードを生成するなどのことを実行でき、既存のスコープの字句バインディングに対するコードの可視性を提供します。それが一例です。もう1つは、インタープリターを、コードの評価方法を制御できるインタープリターコードで拡張できることです。これは、古代のLisp "fexprs"の基礎です。未評価の引数で呼び出され、それらをどう処理するかを決定する関数(コードのウォークや変数の評価などに必要な環境へのフルアクセスがあります)。コンパイルされた言語では、その手法を実際に使用することはできません。代わりにマクロを使用します。未評価の引数でコンパイル時に呼び出され、解釈ではなくコードを変換する関数。
一部の言語実装は、これらの手法を中心に構築されています。著者は、コンパイルを重要な目標として拒否し、むしろこの種の柔軟性を受け入れます。
解釈は、コンパイラをブートストラップするための手法として常に役立ちます。具体的な例については、CLISP(Common Lispの一般的な実装)をご覧ください。CLISPには、それ自体で記述されたコンパイラがあります。CLISPをビルドすると、そのコンパイラはビルドの初期段階で解釈されます。それはそれ自身をコンパイルするために使用され、それがコンパイルされると、コンパイルされたコンパイラを使用してコンパイルが行われます。
インタープリターカーネルがなければ、SBCLのように、既存のLispでブートストラップする必要があります。
解釈を使用すると、アセンブリ言語から始めて、絶対にゼロから言語を開発できます。基本的なI / Oおよびコアルーチンを開発してから、まだ評価されているマシン言語を記述します。evalを取得したら、高級言語で記述します。マシンコードカーネルが評価を行います。この機能を使用して、より多くのルーチンでライブラリを拡張し、コンパイラも作成します。コンパイラを使用して、これらのルーチンとコンパイラ自体をコンパイルします。
解釈:編集に至る道の重要な足がかり!