REPLとインタラクティブシェルの違い


37

Noobの質問。Wikipediaの定義を読むだけでは、REPLインタラクティブシェルの違いを知ることができません。

Wikiは、REPLは特定の種類の対話型言語シェルであると指摘しています。それは適切なサブセットですか?Wikiの定義は、用語REPLをLispのような言語に制限しているように見えますが、記載されているプロパティには実際に顕著な特徴は含まれていません。

特に、IPythonをREPLと呼ぶのは正しいでしょうか?

回答:


24

REPL:これは、ループし、一度に1つのコマンドを受け入れ、それを実行し、結果を出力するプロシージャです。

ループの各反復での3つのステップは次のとおりです。

  1. readを呼び出して、キーボード入力バッファからテキスト式を構成する文字を読み取り、それを表すデータ構造を構築します。
  2. evalを呼び出して式を評価します。直観的には、evalは「式の意味を示し」、「式の意味を実行し」、式の値を返します。
  3. writeを呼び出して、evalの結果のテキスト表現を出力し、ユーザーが表示できるようにします。

独自のプログラム用に独自のread-eval-printループを作成して、ユーザーが式を入力できるようにし、任意の方法で解釈できるようにします。read-eval-printループを((rep-loop)と入力して)起動すると、通常のScheme read-eval-printループから引き継がれ、式を自分の方法で解釈します。

これは非常に単純な読み取り-評価-印刷ループです。

  (define (rep-loop)
  (display "repl>")      ; print a prompt
  (write (eval (read)))  ; read expr., pass to eval, write result
  (rep-loop))            ; loop (tail-recursive call) to do it again

式(write(eval(read)))は、適切なread-eval-printの順序で処理を行うことに注意してください。これは、各プロシージャ呼び出しの引数が実際の呼び出しの前に計算されるためです。

対話型シェル:対話型シェルは、端末上のユーザー入力からコマンドを読み取ります。特に、このようなシェルは、アクティベーション時にスタートアップファイルを読み取り、プロンプトを表示し、デフォルトでジョブ制御を有効にします。ユーザーはシェルと対話できます。これが、対話型のシェル名の由来です。このbashスクリプトを考えてみましょう。

     #!/bin/bash
     echo -n "Enter the value of variable 'var1': "
     read var1
     echo "var1 = $var1"
     echo

    echo -n "Enter the values of variables 'var2' and 'var3' "
    echo =n "(separated by a space or tab): "
    read var2 var3
    echo "var2 = $var2      var3 = $var3"
    #  If you input only one value,
    #+ the other variable(s) will remain unset (null).

    exit 0

これで、上記のスクリプトはユーザーと対話し、計算の実行に基づいてユーザーに入力を要求します。そのため、対話型シェルのように動作します。

同様に、ほとんどの人がpythonを学習するために使用するpythonインタープリターは、ユーザーと通信するため、インタラクティブなものです。


1
@The Dark Knight:上記の理論に基づいて、開発者ツールバー(クロム)またはfirebug拡張(firefox)はちょっとしたREPLであると言えますか?
ラジキショア

9

技術的には、シェルはREPLのインスタンスであると言うのは正しいことです。ただし、一般的な使用シナリオの1つであるため、プログラム定義の問題ではありません。

たとえば、BashはCで作成されていますが、Pythonで作成することもできます。その時点で、プログラムの機能と能力について話す場合、BashはシェルであるがPythonはそうではないと言うのは正しいでしょうか?

また、シェルはコマンドの実行に関するものであり、REPLは命令および関数呼び出しの実行に関するものであるとも言えます。しかし、REPL(Pythonのos.system、os.popenなど)でコマンドを実行したり、組み込みの多くを使用してBashで関数を実行(または定義)したりすることはできませんか?

前述のように、それは使用方法の問題です。ファイルと既製のプログラムをジャグリングする場合、それをシェルとして使用しています。ライブラリまたは言語セマンティクスをテストしている場合、それはREPLです。

お役に立てば幸いです。


3

このStackOverflowの質問では、(特に)その質問について説明しています。

私は個人的には、対話型Pythonに関してフェンスに乗っています。しかし、あなたがそれをREPLと呼びたいなら、私は誰もあなたに怒っているとは思わない(ソースコードファイルで動作するものが少し多すぎるが、私が呼び出しに完全に満足するためのインタラクティブシェルではないREPL)。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.