Boucle de lecture-évaluation-impression
Une boucle de lecture-évaluation-impression ( REPL ), également appelée shell interactif de niveau supérieur ou de langage , est un environnement de programmation informatique interactif simple qui prend les entrées d’un seul utilisateur, les exécute et renvoie le résultat à l’utilisateur ; un programme écrit dans un environnement REPL est exécuté par morceaux. [1] Le terme fait généralement référence à des interfaces de programmation similaires à l’ environnement interactif classique de la Machine Lisp . Les exemples courants incluent les shells de ligne de commande et les environnements similaires pour les langages de programmation , et la technique est très caractéristique des langages de script .[2]
Histoire
La première boucle Read-Eval-Print, cycle , a été inventée en 1964 par L. Peter Deutsch et Edmund Berkeley pour une implémentation de Lisp sur le PDP-1 . [3]
Aperçu
Dans un REPL, l’utilisateur entre une ou plusieurs expressions (plutôt qu’une unité de compilation entière ) et le REPL les évalue et affiche les résultats. [1] Le nom read–eval–print loop vient des noms des fonctions primitives Lisp qui implémentent cette fonctionnalité :
- La fonction de lecture accepte une expression de l’utilisateur et l’ analyse dans une structure de données en mémoire. Par exemple, l’utilisateur peut entrer l’ expression s (+ 1 2 3) , qui est analysée dans une liste chaînée contenant quatre éléments de données.
- La fonction eval prend cette structure de données interne et l’évalue. En Lisp, évaluer une expression s commençant par le nom d’une fonction signifie appeler cette fonction sur les arguments qui composent le reste de l’expression. La fonction +est donc appelée sur les arguments 1 2 3, donnant le résultat 6.
- La fonction d’impression prend le résultat obtenu par eval et l’affiche à l’utilisateur. S’il s’agit d’une expression complexe, elle peut être joliment imprimée pour la rendre plus facile à comprendre.
L’environnement de développement revient alors à l’état de lecture, créant une boucle qui se termine lorsque le programme est fermé.
Les REPL facilitent la programmation exploratoire et le débogage car le programmeur peut inspecter le résultat imprimé avant de décider quelle expression fournir pour la prochaine lecture. La boucle lecture-évaluation-impression implique le programmeur plus fréquemment que le cycle classique édition-compilation-exécution-débogage.
Étant donné que la fonction d’impression sort dans le même format textuel que la fonction de lecture utilise pour l’entrée, la plupart des résultats sont imprimés sous une forme qui peut être copiée et collée dans le REPL. Cependant, il est parfois nécessaire d’imprimer des représentations d’éléments qui ne peuvent raisonnablement pas être lus, comme un handle de socket ou une instance de classe complexe. Dans ces cas, il doit exister une syntaxe pour les objets illisibles. En Python, c’est la <__module__.class instance>notation, et en Common Lisp, la #<whatever>forme. Le REPL de CLIM , SLIME et la Symbolics Lisp Machinepeut également relire des objets illisibles. Ils enregistrent pour chaque sortie quel objet a été imprimé. Plus tard, lorsque le code est relu, l’objet sera récupéré à partir de la sortie imprimée.
Les REPL peuvent être créés pour prendre en charge n’importe quel langage textuel. La prise en charge REPL des langages compilés est généralement obtenue en implémentant un interpréteur au-dessus d’une machine virtuelle qui fournit une interface au compilateur. Par exemple, à partir de JDK 9, Java a inclus JShell comme interface de ligne de commande pour le langage. Divers autres langages ont des outils tiers disponibles en téléchargement qui fournissent une interaction shell similaire avec le langage.
Les usages
En tant que shell , un environnement REPL permet aux utilisateurs d’accéder aux fonctionnalités pertinentes d’un système d’exploitation en plus de fournir un accès aux capacités de programmation. L’utilisation la plus courante des REPL en dehors des shells du système d’exploitation est le prototypage instantané . [4] D’autres utilisations incluent le calcul mathématique, la création de documents qui intègrent l’analyse scientifique (par exemple IPython ), la maintenance de logiciels interactifs, l’ analyse comparative et l’exploration d’algorithmes.
Spécificités Lisp
Mise en œuvre
Une définition minimale est :
( définir ( REPL env ) ( imprimer ( eval env ( lire ))) ( REPL env ) )
où envreprésente l’ evalenvironnement initial. Il est également supposé que envpeut être mis à jour de manière destructive par eval.
Fonctionnalité
Les fonctionnalités typiques fournies par un REPL Lisp incluent :
- Historique des entrées et des sorties.
- Des variables sont définies pour les expressions d’entrée et les résultats. Ces variables sont également disponibles dans le REPL. Par exemple, dans Common Lisp *, se réfère au dernier résultat **et ***aux résultats précédents.
- Niveaux de REPL. Dans de nombreux systèmes Lisp, si une erreur se produit lors de la lecture, de l’évaluation ou de l’impression d’une expression, le système n’est pas renvoyé au niveau supérieur avec un message d’erreur. Au lieu de cela, un nouveau REPL, un niveau plus bas, est démarré dans le contexte d’erreur. L’utilisateur peut alors inspecter le problème, le résoudre et continuer – si possible. Si une erreur se produit dans un tel REPL de débogage, un autre REPL, à nouveau d’un niveau plus profond, est lancé. Souvent, le REPL propose des commandes de débogage spéciales.
- Gestion des erreurs . Le REPL fournit des redémarrages. Ces redémarrages peuvent être utilisés, lorsqu’une erreur survient, pour revenir à un certain niveau de REPL.
- Entrée et sortie sensibles à la souris des objets de données.
- Édition d’entrée et complétion spécifique au contexte sur les symboles, les noms de chemin, les noms de classe et d’autres objets.
- Aide et documentation pour les commandes.
- Variables pour contrôler le lecteur. Par exemple, la variable *read-base* contrôle dans quelle base les nombres sont lus par défaut.
- Variables pour contrôler l’imprimante. Exemple : longueur maximale ou profondeur maximale des expressions à imprimer.
- Syntaxe de commande supplémentaire. Certains REPL ont des commandes qui ne suivent pas la syntaxe de l’expression s, mais fonctionnent souvent avec des données Lisp comme arguments.
- REPL graphiques. Certains REPL Lisp (le CLIM Listener en est un exemple) acceptent également les entrées et sorties graphiques.
Voir également
- Mode direct
Références
- ^ un b Grillmeyer, O. (2013). Explorer l’informatique avec Scheme . Textes de premier cycle en informatique. Springer New York. p. 239. ISBN 978-1-4757-2937-5. Récupéré le 26/06/2021 . Le composant central de l’interpréteur Scheme est la boucle read-eval-print . Les commandes sont lues, puis évaluées. Enfin, le résultat évalué est imprimé.
- ^ Hé, Tony ; Papay, Gyuri (2014). L’univers informatique : un voyage à travers une révolution . La presse de l’Universite de Cambridge. p. 76 . ISBN 978-1-31612322-5, “Une caractéristique majeure des langages de script modernes est leur interactivité, parfois appelée environnement de programmation REPL . … Les caractéristiques de facilité d’utilisation et d’exécution immédiate avec un environnement REPL sont parfois considérées comme la définition d’un langage de script.”{{cite book}}: CS1 maint: postscript ( lien )
- ^ L. Peter Deutsch; Edmund Berkeley, Implémentation LISP pour l’ordinateur PDP-1 (PDF)
- ^ van Binsbergen, L. Thomas; Verano Merino, Mauricio; Jeanjean, Pierre; van der Storm, Tijs ; Combemale, Benoît ; Barais, Olivier (2020-11-17). Une approche fondée sur des principes pour les interprètes REPL . New York, NY, États-Unis : ACM. doi : 10.1145/3426428.3426917 . ISBN 978-1-4503-8178-9.
Liens externes
- Paul Graham a écrit une description d’une implémentation REPL dans Common Lisp.
- Joël Franusic Liste des REP et des REP en ligne