web-dev-qa-db-ja.com

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

Noobの質問。 [〜#〜] repl [〜#〜]インタラクティブシェル の違いを、ウィキペディアの定義を読むだけではわかりません。

Wikiは、REPLはインタラクティブ言語シェルの 特定の種類 であると述べています。それは適切なサブセットですか? Wikiの定義では、用語REPLをLISPのような言語に制限しているようですが、記載されているプロパティには、区別する機能が実際には含まれていません。

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

38
tchakravarty

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

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

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

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

これは非常に単純な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は、ユーザーと通信するインタラクティブなものです。

25
The Dark Knight

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

たとえば、BashはCで書かれていますが、Pythonで書かれているはずです。その時点で、プログラムの機能と能力について語る場合、Pythonはそうではありませんが、Bashはシェルであると言うのが正しいでしょうか?

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

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

お役に立てば幸いです。

9
Yam Marcovic

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

インタラクティブなPythonに関しては、私は個人的に垣間見ることができます。しかし、それをREPLと呼びたい場合、誰もあなたに腹を立てるとは思いません(ソースコードファイルで機能するものは少し多すぎますが、インタラクティブシェルでは機能しないため、呼び出しに完全に満足することはできません。それはREPLです)。

3
Vatine