8

プログラミング言語用のインタープリターを実装するとき、私は最初に、ユーザーがコードを入力できる単純なコンソールウィンドウを考えました。このコードは、シェルとしてスタンドアロンプ​​ログラムとして実行されます。

しかし、深刻な問題があります。ユーザーが入力するコードのすべての行がスタンドアロンプ​​ログラムとして処理される場合、トークナイザーとパーサーを経由して、インタープリターによって実行される必要があります。関数についてはどうでしょうか。

  • Python / Rubyインタラクティブコンソール(IDLE、irb)はどのようにしてコードを「共有」できますか?入力されたコードはどのように処理されますか?

例:

>> def x:
>>  print("Blah")
>> 
>> x()

関数はどこに保存されているので、いつでも呼び出すことができますか?

インタラクティブコンソールは、すべてを何度も実行することなく、明らかに1つのプログラムとして入力されたすべてのものをどのように取得できますか?

4

3 に答える 3

4

Python の場合、すべての括弧、括弧などが一致するまで式は完成しません。これはかなり簡単に検出できます。関数/クラスの定義は、完全に空白の行が入力されるまで完了しません。コンパイラは、入力された式または定義をコンパイルして実行します。

通常の関数、クラス、モジュールなどと同じように、REPL には独自のローカル スコープがあります。REPL に入力された変数と定義に使用されるのは、このスコープです。

于 2010-04-15T22:07:34.460 に答える
3

Python インタラクティブ コンソールの詳細については、コード モジュールのドキュメントを参照してください。

コード モジュールは、Python で read-eval-print ループを実装するための機能を提供します。対話型インタープリター プロンプトを提供するアプリケーションを構築するために使用できる 2 つのクラスと便利な関数が含まれています。

http://docs.python.org/library/code.html

于 2010-04-15T22:07:57.893 に答える
3

これらの言語のほとんどは、一種の「トークン ストリーム」を持つパーサーを使用します。つまり、パーサーは、完全な式が得られるまで入力ストリームからトークン (文字列、記号、演算子など) を取得し続け、それを返します。バイトコードにコンパイルされるか、または別の方法で実行される可能性のある、解析された式。パーサーは基本的に追加の入力を要求し、ユーザーにプロンプ​​トを表示してユーザーに追加の入力を入力させるため、REPL ループはその構造を考えると比較的簡単に処理できます。継続プロンプトなどをレンダリングするために、パーサーからリーダーへの通信が少し必要になる場合があります。

Python と Ruby は両方とも、ステートメントをすぐに順番に実行します (関数宣言は 1 つのステートメントです)。したがって、インタープリターでコードをステートメントごとに実行して、ソース ファイルとほぼ同じ効果を得ることができます。

于 2010-04-16T03:01:27.947 に答える