読み取り-評価-印刷ループ

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ

インタラクティブトップレベルまたは言語シェルとも呼ばれるread-eval-printループ(REPL)単一ユーザー入力を受け取り、それらを実行して、結果をユーザーに返す単純なインタラクティブコンピュータープログラミング環境です。REPL環境で記述されたプログラムは区分的に実行されます。[1]この用語は通常、古典的なLispマシンの対話型環境に似たプログラミングインターフェースを指します。一般的な例としては、コマンドラインシェルやプログラミング言語用の同様の環境があり、この手法はスクリプト言語に非常に特徴的です。 [2]

歴史

最初のRead-Eval-Printループ(サイクルと呼ばれる)は、 PDP-1にLisp実装するために、1964年にL. PeterDeutschEdmundBerkeleyによって発明されました。[3]

概要

REPLでは、ユーザーは(コンパイル単位全体ではなく)1つ以上の式を入力し、REPLはそれらを評価して結果を表示します。[1]名前read-eval-printループは、この機能を実装するLispプリミティブ関数の名前に由来します。

  • 読み取り関数は、ユーザーからの式を受け取り、それをメモリ内のデータ構造に解析します。たとえば、ユーザーはs式 を入力できます。これは、 4つのデータ要素を含むリンクリスト(+ 1 2 3)に解析されます。
  • eval関数は、この内部データ構造を取得して評価します。Lispでは、関数の名前で始まるS式を評価するということは、式の残りの部分を構成する引数でその関数を呼び出すことを意味します。したがって、関数+は引数1 2 3に対して呼び出され、結果を生成し6ます。
  • print関数は、evalによって生成された結果を取得、それをユーザーに出力します。複雑な表現の場合は、わかりやすくするためにきれいに印刷されている場合があります。

その後、開発環境は読み取り状態に戻り、ループを作成します。ループは、プログラムが閉じられると終了します。

REPLは、プログラマーが次の読み取りに提供する式を決定する前に印刷結果を検査できるため、探索的なプログラミングデバッグを容易にします。read-eval-printループは、従来の編集-コンパイル-実行-デバッグサイクルよりも頻繁にプログラマーを巻き込みます。

print関数は、 read関数が入力に使用するのと同じテキスト形式で出力するため、ほとんどの結果は、コピーしてREPLに貼り付けることができる形式で印刷されます。ただし、ソケットハンドルや複雑なクラスインスタンスなど、適切に読み戻すことができない要素の表現を印刷する必要がある場合があります。このような場合、読み取り不可能なオブジェクトの構文が存在する必要があります。Pythonでは、これは<__module__.class instance>表記法であり、CommonLispでは#<whatever>形式です。CLIMSLIME、およびSymbolics LispMachineのREPL読み取り不可能なオブジェクトを読み戻すこともできます。それらは、どのオブジェクトが印刷されたかを出力ごとに記録します。後でコードが読み戻されると、オブジェクトは印刷出力から取得されます。

REPLは、任意のテキストベースの言語をサポートするように作成できます。コンパイルされた言語のREPLサポートは、通常、コンパイラーへのインターフェースを提供する仮想マシンの上にインタープリターを実装することによって実現されます。たとえば、JDK 9以降、Javaには言語へのコマンドラインインターフェイスとしてJShellが含まれていました。他のさまざまな言語には、その言語と同様のシェル相互作用を提供するサードパーティのツールがダウンロード可能です。

を使用します

シェルとして、REPL環境では、ユーザーはプログラミング機能へのアクセスを提供するだけでなく、オペレーティングシステムの関連機能にアクセスできます。オペレーティングシステムシェル以外のREPLの最も一般的な使用法は、瞬時のプロトタイピングです。[4]その他の用途には、数学的計算、科学的分析(IPythonなど)を統合するドキュメントの作成、インタラクティブなソフトウェアメンテナンス、ベンチマーク、およびアルゴリズムの調査が含まれます。

Lispの詳細

実装

最小限の定義は次のとおりです。

define REPL  env 
  print  eval env  read )))
  REPL  env  

ここで、envは初期eval環境を表します。envまた、によって破壊的に更新される可能性があることも想定されていevalます。

機能性

LispREPLが提供する典型的な機能は次のとおりです。

  • 入力と出力の履歴。
  • 入力式と結果には変数が設定されます。これらの変数はREPLでも使用できます。たとえば、Common Lispでは、最後の結果とその前の*結果を指します。*****
  • REPLのレベル。多くのLispシステムでは、式の読み取り、評価、または印刷中にエラーが発生した場合、システムはエラーメッセージとともにトップレベルに戻されません。代わりに、1レベル深い新しいREPLがエラーコンテキストで開始されます。その後、ユーザーは問題を検査して修正し、可能であれば続行できます。このようなデバッグREPLでエラーが発生した場合、さらに深いレベルの別のREPLが開始されます。多くの場合、REPLは特別なデバッグコマンドを提供します。
  • エラー処理REPLは再起動を提供します。これらの再起動は、エラーが発生したときに、特定のREPLレベルに戻るために使用できます。
  • データオブジェクトのマウスセンシティブな入力と出力。
  • シンボル、パス名、クラス名、およびその他のオブジェクトに対する入力編集とコンテキスト固有の補完。
  • コマンドのヘルプとドキュメント。
  • リーダーを制御するための変数。たとえば、変数* read-base *は、デフォルトでベース番号が読み取られる場所を制御します。
  • プリンターを制御するための変数。例:印刷する式の最大長または最大深度。
  • 追加のコマンド構文。一部のREPLには、S式構文に従わないコマンドがありますが、多くの場合、引数としてLispデータを処理します。
  • グラフィカルREPL。一部のLispREPL(CLIMリスナーは一例です)は、グラフィカルな入力と出力も受け入れます。

も参照してください

参考文献

  1. ^ a b Grillmeyer、O。(2013)。スキームでコンピュータサイエンスを探るコンピュータサイエンスの学部テキスト。シュプリンガーニューヨーク。p。239. ISBN 978-1-4757-2937-52021-06-26を取得スキームインタープリターの中心的なコンポーネントは、read-eval-printループです。コマンドが読み込まれ、評価されます。最後に、評価結果が印刷されます。
  2. ^ ねえ、トニー; Pápay、Gyuri(2014)。コンピューティングユニバース:革命を通じた旅ケンブリッジ大学出版局。p。 76ISBN 978-1-31612322-5、「最新のスクリプト言語の主な特徴は、 REPLプログラミング環境と呼ばれることもある双方向性です。...使いやすさとREPL環境での即時実行の特徴は、スクリプト言語の定義と見なされることがあります。」{{cite book}}:CS1 maint:postscript(リンク
  3. ^ L。ピータードイチュ; エドモンドバークレー、PDP-1コンピュータ用のLISP実装(PDF)
  4. ^ van Binsbergen、L。Thomas; ベラノメリノ、マウリシオ; ジャンジャン、ピエール; van der Storm、Tijs; Combemale、Benoit; バレ、オリヴィエ(2020-11-17)。REPLインタプリタへの原則的なアプローチ米国ニューヨーク州ニューヨーク:ACM。土井10.1145 /3426428.3426917ISBN 978-1-4503-8178-9

外部リンク