web-dev-qa-db-fra.com

Différence entre un REPL et un shell interactif

Question noob. Je ne suis pas tout à fait capable de faire la différence entre un REPL et un Shell interactif simplement en lisant les définitions sur Wikipedia.

Le wiki note que REPL est un type particulier de shell de langage interactif. Est-ce un sous-ensemble approprié? La définition du Wiki semble restreindre la terminologie REPL aux langages de type LISP, alors que les propriétés déclarées ne contiennent pas vraiment de caractéristiques distinctives.

En particulier, serait-il correct d'appeler IPython un REPL?

38
tchakravarty

REPL: Il s'agit d'une procédure qui boucle simplement, accepte une commande à la fois, l'exécute et imprime le résultat.

Les trois étapes à chaque itération de la boucle sont:

  1. Appeler read pour lire les caractères qui composent une expression textuelle à partir du tampon d'entrée du clavier et construire une structure de données pour la représenter,
  2. Appeler eval pour évaluer l'expression - intuitivement, eval "comprend ce que signifie l'expression" et "fait ce qu'elle dit de faire", renvoyant la valeur de l'expression - et
  3. Appelez write pour imprimer une représentation textuelle du résultat de eval, afin que l'utilisateur puisse le voir.

Vous pouvez écrire votre propre boucle read-eval-print pour vos propres programmes, afin que les utilisateurs puissent taper des expressions et les interpréter comme vous le souhaitez. Vous pouvez démarrer votre boucle read-eval-print (en tapant (rep-loop)), et elle prendra le relais de la boucle normale de lecture-eval-print de Scheme, interprétant les expressions à votre façon.

Voici une boucle de lecture-évaluation-impression très simple:

  (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

Notez que l'expression (write (eval (read))) fait les choses dans le bon ordre read-eval-print, car l'argument de chaque appel de procédure est calculé avant l'appel réel.

Interactive Shell: Un shell interactif lit les commandes à partir des entrées utilisateur sur un terminal. Entre autres choses, un tel shell lit les fichiers de démarrage lors de l'activation, affiche une invite et active le contrôle des travaux par défaut. L'utilisateur peut interagir avec le Shell, c'est ainsi que le nom du Shell interactif a vu le jour. Considérons ce script 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

Maintenant, le script ci-dessus interagit avec l'utilisateur, il lui demande de saisir des entrées sur la base desquelles il effectue ses calculs. C'est pourquoi il se comporte comme un shell interactif.

De même, l'interpréteur python que la plupart des gens utilisent pour apprendre python est un interpréteur interactif lorsqu'il communique avec son utilisateur).

25
The Dark Knight

Techniquement, il est correct de dire qu'un Shell est une instance d'un REPL. Cependant, ce n'est pas une question de définition de programme car c'est l'un des scénarios d'utilisation courants.

Bash, par exemple, est écrit en C, mais il aurait très bien pu être écrit en Python. À ce stade, si vous parlez des fonctionnalités et des capacités du programme, serait-il correct de dire que Bash est un Shell alors que Python ne l'est pas?

Vous pouvez également dire que les shells concernent l'exécution de commandes tandis que les REPL concernent l'exécution d'instructions et d'appels de fonction. Mais ne pouvez-vous pas exécuter des commandes dans les REPL (os.system, os.popen de Python, etc.), et ne pouvez-vous pas exécuter (ou définir) des fonctions dans Bash, en utilisant un grand nombre de ses fonctions intégrées?

Comme mentionné ci-dessus, c'est une question d'utilisation. Si vous jonglez avec des fichiers et des programmes prêts à l'emploi, vous l'utilisez comme un shell. Si vous testez des bibliothèques ou une sémantique de langage, c'est un REPL.

J'espère que cela pourra aider.

9
Yam Marcovic

This StackOverflow question traite de cette même question (entre autres).

Je suis personnellement sur la clôture en ce qui concerne le Python interactif. Mais, si vous voulez l'appeler un REPL, je ne pense pas que quiconque sera en colère contre vous (il y a un peu trop de choses qui fonctionnent dans les fichiers de code source, mais pas dans le shell interactif pour que je sois entièrement heureux d'appeler un REPL).

3
Vatine