3

さて、私は古いCSのメモを取り、コンパイラ理論をもう少し調べてみようと思いました。私の人生では、これらすべてがどのように機能するかを思い出せないと言わざるを得ませんが、大学時代の素晴らしいサンプルアプリケーションがあり、いくつかのことを理解するのに役立ちます。

このサンプルアプリケーションは、作成された言語を取得し、言語のような中間アセンブリコードにコンパイルします。次に、この中間言語を使用してステートメントを実行する単純なVM実装があります。

私が頭を悩ませることができないのは、これが真っ直ぐなインタプリタであり、コンパイラではない場合でも、最後に実行されるこれらの中間コマンドをメモリに構築しているということです。または、インタプリタは実際にコードチャンクの控えめなセクションを一度に「実行」しますか?

4

4 に答える 4

4

言語によって異なります。最新のインタープリター言語 (ほんの数例を挙げると、Perl、Python、Ruby) のほとんどは、ソース コードを何らかの中間形式にプリコンパイルして、最後に実行します ( citation )。

于 2009-03-06T20:53:19.163 に答える
3

私は、入力内のトークンの解析に直接作用し、パーサーによって構築された抽象構文木(AST)に直接作用し、ASTを効率的な実行のために設計された形式に変換するインタープリターを作成または操作しました。だから答えは、それは依存します

  • ターゲットマシンに8KのRAMがある場合は、直接解析インタープリターが賢明な選択です(FORTHを考えてください)。
  • プログラミング言語の構造とセマンティクスについて教えたり学習したりするためにインタープリターを使用している場合は、ASTの構築と解釈が適切な選択です。
  • 移植性のためにインタプリタを使用していて、高速実行が必要な場合は、レジスタベースの仮想マシンにコンパイルすることをお勧めします。(David Greggらは、Lua VMのようなレジスタベースのVMの方が、JavaVMのようなスタックベースのVMよりも解釈のオーバーヘッドが少ないことを示しています。)
于 2009-03-06T22:29:12.567 に答える
1

パーサーはコンパイルされません。プログラムを (C++ のような高級言語からマシン コードに) 変換する際には、実際にはかなりの数の手順が必要です。一度に実行するか、入力を複数回通過した後に実行するかは、設計によって異なります。質問をもう少し具体的にしていただけますか?それまでの間、どんなに嫌でもここを見てください-- 特にフロントエンドとバックエンドのセクションです。

于 2009-03-06T20:54:10.207 に答える
1

最新のインタープリターのほとんどは、プログラムを解析して、後で解釈される中間コードに変換します。この中間コードを明示的に保存するものもあります (例: Python の.pyc)。たとえば、シェル スクリプトが中間形式に解析されるのではなく、直接解釈されるなどの例外があります。

一部のより高度な「インタープリター」は、実際には解釈しませんが、JIT (ジャストインタイム) コンパイル (Java や .NET など) を行います。

于 2009-03-06T21:24:14.550 に答える