読み取り・評価・印刷ループ( REPL ) は、対話型トップレベルまたは言語シェルとも呼ばれ、単一のユーザー入力を受け取り、実行し、結果をユーザーに返すシンプルな対話型コンピュータプログラミング環境です。REPL 環境で書かれたプログラムは、部分的に実行されます。 [ 1 ]この用語は通常、古典的なLisp マシン対話型環境やSLIME開発環境を備えたCommon Lispに似たプログラミングインターフェイスを指します。一般的な例としては、コマンドラインシェルやプログラミング言語用の同様の環境があり、この手法はスクリプト言語に非常に特徴的ですが、その特性は大きく異なる場合があります。[ 2 ]
READ-EVAL-PRINT サイクルという表現は、 L. Peter DeutschとEdmund Berkeleyが1964 年にPDP-1上でLispを実装した際に使用されました。[ 3 ]その 1 か月後、Project Mac はJoseph Weizenbaum (世界初のチャットボット ELIZAの作成者)による、互換性のあるタイムシェアリング システム (CTSS) 上でFortran-SLIP言語で実装された OPL-1 と呼ばれる REPL ベースの言語を記述したレポートを公開しました。[ 4 ] [ 5 ] [ 6 ]
1974 年版のDavid A. MoonによるMaclispリファレンス マニュアルの89 ページでは「Read-eval-print loop」について言及しているが、REPL という略語は使用していない。[ 7 ]
少なくとも1980年代以降、REP LoopとREPLという略語はSchemeの文脈で確認されている。[ 8 ] [ 9 ]
REPLでは、ユーザーは(コンパイル単位全体ではなく)1つ以上の式を入力し、REPLがそれらを評価して結果を表示します。[ 1 ] read-eval-printループという名前は、この機能を実装するLispのプリミティブ関数の名前から来ています。
(+ 1 2 3)入力すると、それは4つのデータ要素を含むリンクリストに解析されます。+引数に対して呼び出され1 2 3、結果が得られます6。開発環境はその後、読み込み状態に戻り、ループが作成されます。このループは、プログラムが閉じられると終了します。
REPL(対話型実行環境)は、プログラマが次の読み込みにどの式を指定するかを決定する前に、出力された結果を確認できるため、探索的なプログラミングとデバッグを容易にします。読み込み・評価・出力のループは、従来の編集・コンパイル・実行・デバッグのサイクルよりも、プログラマの関与頻度が高くなります。
print関数はread関数が入力に使用するテキスト形式と同じ形式で出力するので、ほとんどの結果は REPL にコピーして貼り付けることができる形式で出力されます。しかし、ソケット ハンドルや複雑なクラス インスタンスなど、読み戻すのが適切でない要素の表現を出力する必要がある場合もあります。このような場合、読み取り不可能なオブジェクトのための構文が存在する必要があります。Python では<__module__.class instance>表記法、Common Lisp では形式です。CLIM 、SLIME、Symbolics Lisp Machine#<whatever>の REPL も、読み取り不可能なオブジェクトを読み込むことができます。各出力に対してどのオブジェクトが出力されたかを記録します。後でコードが読み戻されるときに、出力されたオブジェクトが取得されます。
REPLは、あらゆるテキストベースの言語をサポートするように作成できます。コンパイル言語のREPLサポートは通常、コンパイラへのインターフェースを提供する仮想マシン上にインタプリタを実装することで実現されます。例えば、JDK 9以降、 Javaには言語へのコマンドラインインターフェースとしてJShellが組み込まれました。他の多くの言語にも、同様のシェル操作を提供するサードパーティ製ツールがダウンロード可能ですが、その機能は大きく異なる場合があります。
シェルとして、REPL環境は、プログラミング機能へのアクセスを提供するだけでなく、オペレーティングシステムの関連機能へのアクセスもユーザーに提供します。オペレーティングシステムのシェル以外でREPLの最も一般的な用途は、対話型プロトタイピングです。[ 10 ]その他の用途には、数学的計算、科学的分析を統合したドキュメントの作成(例:IPython)、対話型ソフトウェア保守、ベンチマーク、アルゴリズムの探索などがあります。
Common Lisp における最小限の定義は次のとおりです。
(ループ(プリント( eval ( read ))))readユーザー入力を待って評価し、結果evalをprint出力してloop無限ループします。(+ 1 1)ループの開始と停止は で行えますC-c。
Common Lisp REPLが提供する典型的な機能には、以下のようなものがあります。
*最後の結果を参照し、**は***それ以前の結果を参照します。Lispアプリケーションの開発者は、通常、 REPLにコードを記述したりコピー&ペーストしたりすることはありません。REPLは、迅速なテスト、デバッグ、および実行中のシステムの探索に使用します。アプリケーションはバージョン管理されたソースファイルに記述し、コマンドまたはキーボードショートカットを使用して対話的にコードをコンパイルします。Lispプロセスは実行中でエディタに接続されており、再起動することなく、新しいコードを「その場で」コンパイルします。
Common Lispでは、開発者は通常、作業中の関数をコンパイルします。ファイル全体、あるいはプロジェクト全体をコンパイルすることも可能です。関数がコンパイルされると、型警告が表示される場合があります(特にSBCL実装の場合)。また、REPLから新しく作成された関数を呼び出すことができます。エラーが発生した場合は、対話型デバッガが提供されます。
単一の関数をコンパイルしてREPLでテストするこのプロセスは、他のプロセスと比較して非常に高速です。新しい関数を作成し、コンパイルしてテストするというサイクルは非常に短く、対話型であるため、開発に適しています。また、開発中にアプリケーションの状態が失われることもありません。
彼らがそうすることを選択した場合にのみ、アプリケーション全体を最初から実行またはコンパイルします。
インタープリタの中核となるのは、読み込み・評価・出力ループです。コマンドが読み込まれ、評価されます。最後に、評価結果が出力されます。
{{cite book}}: CS1 maint: postscript (リンク)