Différence entre un REPL et un shell interactif

37

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

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

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

tchakravarty
la source

Réponses:

24

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

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

  1. Appel de read pour lire les caractères qui constituent une expression textuelle à partir du tampon de saisie du clavier et créer une structure de données pour la représenter,
  2. Appel de eval pour évaluer l'expression - intuitivement, eval "détermine ce que signifie l'expression" et "fait ce qu'il dit de faire", en 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 saisir des expressions et les interpréter comme bon vous semble. Vous pouvez démarrer votre boucle read-eval-print (en tapant (rep-loop)) et la remplacer par la boucle Scheme read-eval-print normale, interprétant les expressions à votre manière.

Voici une boucle très simple 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

Notez que l'expression (write (eval (read))) fait les choses dans le bon ordre lecture-évaluation-impression, car l'argument de chaque appel de procédure est calculé avant l'appel lui-même.

Shell interactif: 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 que le script ci-dessus interagit avec l'utilisateur, il lui demande de saisir des entrées sur lesquelles il effectue ses calculs. C'est pourquoi il se comporte comme un shell interactif.

De la même manière, l'interpréteur python que la plupart des gens utilisent pour apprendre le python est interactif puisqu'il communique avec son utilisateur.

Le Chevalier Noir
la source
1
@ The Dark Knight: Donc, sur la base de la théorie ci-dessus, pouvons-nous dire que la barre d'outils de développeur (en chrome) ou l'extension firebug (en firefox) est un peu REPL?
Rajkishore
9

Techniquement, il est correct de dire qu'un shell est une instance d'un REPL. Cependant, il ne s'agit pas d'une définition de programme, mais d'un scénario d'utilisation courante.

Bash, par exemple, est écrit en C, mais il aurait très bien pu l'être 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 vous ne pouvez pas exécuter de commandes dans les REPL (os.system, os.popen, etc.) de Python, et vous ne pouvez pas exécuter (ou définir) de fonctions dans Bash, en utilisant beaucoup 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 shell. Si vous testez des bibliothèques ou une sémantique linguistique, il s'agit d'un REPL.

J'espère que ça t'as aidé.

Yam Marcovic
la source
3

Cette question de StackOverflow traite de cette question (entre autres).

Je suis personnellement sur la barrière en ce qui concerne Python interactif. Mais si vous voulez appeler cela un REPL, je ne pense pas que quiconque sera fâché 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 satisfait d'appeler c'est une REPL).

Vatine
la source