Różnica między REPL a interaktywną powłoką


37

Pytanie Nooba. Nie jestem w stanie odróżnić REPL od interaktywnej powłoki po prostu czytając definicje na Wikipedii.

Wiki zauważa, że ​​REPL jest szczególnym rodzajem interaktywnej powłoki językowej. Czy to jednak odpowiedni podzbiór? Definicja Wiki wydaje się ograniczać terminologię REPL do języków podobnych do Lisp, podczas gdy podane właściwości tak naprawdę nie zawierają żadnych cech wyróżniających.

W szczególności, czy poprawne byłoby nazywanie IPython REPL?

Odpowiedzi:


24

REPL: Jest to procedura, która po prostu zapętla, akceptuje jedno polecenie na raz, wykonuje je i drukuje wynik.

Trzy kroki przy każdej iteracji pętli to:

  1. Wywołanie read w celu odczytania znaków składających się na wyrażenie tekstowe z bufora wejściowego klawiatury i zbudowanie struktury danych do jej reprezentowania,
  2. Wywołanie eval w celu oceny wyrażenia - intuicyjnie, eval „odkrywa, co to znaczy wyrażenie” i „robi to, co mówi, aby zrobić”, zwracając wartość wyrażenia - i
  3. Wywołanie write, aby wydrukować tekstową reprezentację wynikową z eval, aby użytkownik mógł ją zobaczyć.

Możesz napisać własną pętlę read-eval-print dla własnych programów, aby użytkownicy mogli pisać wyrażenia i interpretować je w dowolny sposób. Możesz uruchomić pętlę read-eval-print (wpisując (rep-loop)), a ona przejmie normalną pętlę read-eval-print Schematu, interpretując wyrażenia na swój sposób.

Oto bardzo prosta pętla 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

Zauważ, że wyrażenie (write (eval (read))) działa we właściwej kolejności odczytu-eval-print, ponieważ argument do każdego wywołania procedury jest obliczany przed faktycznym wywołaniem.

Interaktywna powłoka: interaktywna powłoka odczytuje polecenia z danych wprowadzanych przez użytkownika na terminalu. Między innymi taka powłoka odczytuje pliki startowe podczas aktywacji, wyświetla monit i domyślnie włącza kontrolę zadań. Użytkownik może wchodzić w interakcje z powłoką. Tak powstała interaktywna nazwa powłoki. Rozważmy ten skrypt 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

Teraz powyższy skrypt współdziała z użytkownikiem, prosi użytkownika o wprowadzenie danych wejściowych, na podstawie których wykonuje swoje obliczenia. Dlatego zachowuje się jak interaktywna powłoka.

Podobnie interpreter języka Python, którego większość ludzi używa do nauki języka Python, jest interaktywny, ponieważ komunikuje się z użytkownikiem.


1
@The Dark Knight: Czy w oparciu o powyższą teorię możemy powiedzieć, że pasek narzędzi dla programistów (w chrome) lub rozszerzenie firebug (w Firefox) to rodzaj REPL?
Rajkishore,

9

Technicznie poprawne jest stwierdzenie, że powłoka jest instancją REPL. Nie jest to jednak kwestia definicji programu, ponieważ jest to jeden z typowych scenariuszy użytkowania.

Bash, na przykład, jest napisany w C, ale równie dobrze mógłby być napisany w Pythonie. Czy w tym momencie, jeśli mówisz o funkcjach i zdolnościach programu, czy poprawne byłoby stwierdzenie, że Bash jest powłoką, podczas gdy Python nie?

Można również powiedzieć, że powłoki dotyczą uruchamiania poleceń, podczas gdy REPL dotyczą uruchamiania instrukcji i wywołań funkcji. Ale czy nie możesz uruchamiać poleceń w REPL (os.system Pythona, os.popen itp.) I nie możesz uruchamiać (lub definiować) funkcji w Bash, używając wielu jego wbudowanych funkcji?

Jak już wspomniano, jest to kwestia użytkowania. Jeśli żonglujesz plikami i gotowymi programami, używasz ich jako powłoki. Jeśli testujesz biblioteki lub semantykę języka, jest to REPL.

Mam nadzieję, że to pomaga.


3

To pytanie StackOverflow omawia to samo pytanie (między innymi).

Jestem osobiście na ogrodzeniu, jeśli chodzi o interaktywny Python. Ale jeśli chcesz nazwać to REPL, nie sądzę, że ktoś będzie na ciebie zły (w plikach kodu źródłowego działa nieco za dużo rzeczy, ale nie w interaktywnej powłoce, abym był całkowicie zadowolony z dzwonienia to REPL).


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.