Unterschied zwischen einer REPL und einer interaktiven Shell


37

Noob Frage. Ich kann den Unterschied zwischen einer REPL und einer interaktiven Shell nur anhand der Definitionen in Wikipedia erkennen.

Das Wiki merkt an, dass REPL eine bestimmte Art von interaktiver Sprachshell ist . Ist es eine richtige Untermenge? Die Wiki-Definition scheint die Terminologie REPL auf Lisp-ähnliche Sprachen zu beschränken, während die angegebenen Eigenschaften eigentlich keine Unterscheidungsmerkmale enthalten.

Wäre es insbesondere richtig, IPython als REPL zu bezeichnen?

Antworten:


24

REPL: Dies ist eine Prozedur, die nur eine Schleife durchläuft, jeweils einen Befehl annimmt, ihn ausführt und das Ergebnis druckt.

Die drei Schritte bei jeder Iteration der Schleife sind:

  1. Aufruf von read, um die Zeichen, die einen Textausdruck bilden, aus dem Tastatureingabepuffer zu lesen und eine Datenstruktur zu erstellen, um ihn darzustellen,
  2. Eval aufrufen, um den Ausdruck zu bewerten - intuitiv, eval "findet heraus, was der Ausdruck bedeutet" und "tut, was er zu tun sagt" und gibt den Wert des Ausdrucks zurück - und
  3. Durch Aufrufen von write wird eine Textdarstellung des Ergebnisses von eval gedruckt, damit der Benutzer es sehen kann.

Sie können eine eigene Lese-Auswertungs-Druck-Schleife für Ihre eigenen Programme schreiben, damit Benutzer Ausdrücke eingeben und sie nach Belieben interpretieren können. Sie können Ihre Read-Eval-Print-Schleife starten (durch Eingeben von (rep-loop)). Sie übernimmt die normale Schema-Read-Eval-Print-Schleife und interpretiert Ausdrücke auf Ihre Weise.

Hier ist eine sehr einfache Read-Eval-Print-Schleife:

  (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

Beachten Sie, dass der Ausdruck (write (eval (read))) die Dinge in der richtigen Reihenfolge (read-eval-print) ausführt, da das Argument für jeden Prozeduraufruf vor dem tatsächlichen Aufruf berechnet wird.

Interaktive Shell: Eine interaktive Shell liest Befehle von Benutzereingaben auf einem Terminal. Unter anderem liest eine solche Shell beim Aktivieren Startdateien, zeigt eine Eingabeaufforderung an und aktiviert standardmäßig die Auftragssteuerung. Der Benutzer kann mit der Shell interagieren. So ist der Name der interaktiven Shell entstanden. Betrachten wir dieses Bash-Skript:

     #!/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

Jetzt interagiert das obige Skript mit dem Benutzer und fordert den Benutzer auf, Eingaben zu machen, auf deren Grundlage er seine Berechnungen durchführt. Deshalb verhält es sich wie eine interaktive Shell.

Similary, der Python-Interpreter, mit dem die meisten Leute Python lernen, ist ein interaktiver Interpreter, der mit dem Benutzer kommuniziert.


1
@ The Dark Knight: Kann man also basierend auf der obigen Theorie sagen, dass die Entwickler-Symbolleiste (in Chrome) oder die Firebug-Erweiterung (in Firefox) irgendwie REPL ist?
Rajkishore

9

Technisch ist es richtig zu sagen, dass eine Shell eine Instanz einer REPL ist. Es ist jedoch keine Frage der Programmdefinition, da es sich um ein häufiges Verwendungsszenario handelt.

Bash ist zum Beispiel in C geschrieben, könnte aber auch in Python geschrieben worden sein. Wenn Sie an diesem Punkt über Programmfunktionen und -fähigkeiten sprechen, wäre es dann richtig zu sagen, dass Bash eine Shell ist, Python jedoch nicht?

Sie können auch sagen, dass Shells Befehle ausführen, während REPLs Anweisungen und Funktionsaufrufe ausführen. Aber können Sie keine Befehle in REPLs (Pythons os.system, os.popen usw.) ausführen und können Sie keine Funktionen in Bash ausführen (oder definieren), indem Sie viele seiner eingebauten Funktionen verwenden?

Wie oben erwähnt, ist es eine Frage der Verwendung. Wenn Sie mit Dateien und vorgefertigten Programmen jonglieren, verwenden Sie sie als Shell. Wenn Sie Bibliotheken oder Sprachsemantik testen, handelt es sich um eine REPL.

Hoffentlich hilft das.


3

Diese StackOverflow- Frage behandelt genau diese Frage (unter anderem).

Ich bin persönlich in Bezug auf interaktives Python am Zaun. Aber, wenn Sie es als REPL bezeichnen möchten, wird niemand Ihnen böse sein (es gibt etwas zu viele Dinge, die in Quellcodedateien funktionieren, aber nicht in der interaktiven Shell, als dass ich mit dem Aufruf völlig zufrieden wäre es ist eine REPL).


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.