私はインタープリターがどのように機能するかについて多数のWebサイトを検索してきましたが、インタープリターが内部的にどのように機能するかを説明するものはどれも見つかりませんでした。しかし、多くの場所で、コンパイラーがすべてのステップと説明を処理する方法を見つけました。
だから私の質問は、通訳はどのように機能するのですか?
あなたの質問は、数段落で回答するには広すぎます。そして実際の通訳はそれほど意味がありません: ZX8 (1980年の)のBASIC通訳は今日の Guile 、 Lua 、-とは本当に異なります Ruby 、またはほとんどのLinuxシステムの Python インタープリター。たとえば、いくつかのプログラミング言語を知っているScottの Programming Language Pragmatics を読むことは価値があります。
[〜#〜] lisp [〜#〜]Scheme (&Common LISP)のような言語は homoiconic であり、非常に簡単ですLISPで小さなLISPインタープリターを作成します。有名な [〜#〜] sicp [〜#〜] 本(Schemeを使用したプログラミングの無料入門)には 第4章 このような メタサーキュラーエバリュエーター 。
インタプリタ 共有 コンパイラ いくつかの機能とタスク;それらのほとんどは 解析 いくつかのコードに 抽象構文ツリー (AST)コンパイラのようにです。これは実際には最も簡単な部分です。したがって、最新版の Dragon Book のようなコンパイラに関する教科書は、インタプリタにとって非常に関連性があります。
(AFAIK、1980年代のBASICは、ASTを構築しませんでしたが、各行を繰り返し解析しました。これが、ZX80のBASICが現在のインタープリターとは異なる理由です。しかし、これらの古いインタープリターは独自仕様であるため、私は間違っているかもしれません。ソフトウェア)
一部のインタープリターは、単純な再帰関数を通じてASTを一部の環境で評価しています。他の(そして今日、それらの多くは)実際にはコンパイル ASTより効率的な形式に、多くの場合、ある種の bytecode (後で高速 仮想マシン)によって解釈されます 、多くの場合スタックベースで、 threaded code )を使用します。一部の実装では、動的にマシンコードを生成するために JITコンパイル の手法を使用しています(したがって、インタープリターとコンパイラーの間の境界はかなりあいまいです。 [〜#〜] sbcl [〜#〜] は、その相互作用ごとにマシンコードに変換されます Read Eval Print Loop ;これは、「コンパイラ」として偽装され、 「通訳」またはその逆)。
ガベージコレクション はインタープリターとの関連性が高いです。 GCハンドブック を読むことをお勧めします。
方言のようなLISPの解釈とコンパイルに関する優れた本は、Quennecの LISP In Small Pieces です。 LISPのさまざまな実装(単純なインタプリタから高度なコンパイラ、Cコードまで)について詳しく説明しています。
学ぶべき多くのフリーソフトウェアインタープリターと、それを作成するためのいくつかのチュートリアルがあります。 Norvigの ((LISP)インタープリターの書き方(Pythonで)) およびその他多数。
堅牢で効率的でユーザーフレンドリーなインタープリターの設計と実装は多くの作業です(これには数年かかる可能性があります)。インタープリターを追加したいソフトウェアがある場合は、代わりにembeddingexistingインタープリターを検討してください Guile または Lua のように(どちらも簡単に埋め込めるように設計されています)。
インタープリターは、データ構造として表されたプログラムをフィードし、次にデータ構造内の各タスクをステップ実行し、それに従ってタスクを実行します。データ構造は、解釈するコードの抽象構文ツリーにすることも、必要に応じてバイトコードにすることもできます。
インタプリタは、変数名のテーブル(ハッシュマップ)->現在スコープ内にある変数の値を保持することもできます。ただし、厳密には必要ありません。
インタープリターは、コードで作成したふりをしたCPUと考えることができます。