Wie implementieren Ruby und Python ihre interaktiven Konsolen?

8

Als ich den Interpreter für meine Programmiersprache implementierte, dachte ich zuerst an ein einfaches Konsolenfenster, in dem der Benutzer Code eingeben kann, der dann als eigenständiges Programm als Shell ausgeführt wird.

Aber es gibt ernsthafte Probleme: Wenn jede Codezeile, die der Benutzer eingibt, als eigenständiges Programm behandelt wird, muss er den Tokenizer und Parser durchlaufen und wird dann nur vom Interpreter ausgeführt - was ist dann mit Funktionen?

  • Wie können die interaktiven Python / Ruby-Konsolen (IDLE, irb) den Code "teilen"? Wie wird der Code eingegeben?

Beispiel:

%Vor%

Wo ist die Funktion gespeichert, damit sie jederzeit wieder aufgerufen werden kann?

Wie kann die interaktive Konsole alles, was als offensichtlich ein Programm eingegeben wurde, übernehmen, ohne alles immer wieder auszuführen?

    
sxa 15.04.2010, 21:52
quelle

3 Antworten

5

Bei Python ist ein Ausdruck nicht vollständig, bis alle Klammern, Klammern usw. übereinstimmen. Das ist ziemlich einfach zu erkennen. Eine Funktions- / Klassendefinition ist erst abgeschlossen, wenn eine vollständig leere Zeile eingegeben wurde. Der Compiler kompiliert dann den eingegebenen Ausdruck oder die Definition und führt ihn aus.

Ähnlich wie eine normale Funktion, Klasse, Modul usw. hat die REPL ihren eigenen lokalen Geltungsbereich. Dieser Bereich wird für Variablen und Definitionen verwendet, die in die REPL eingegeben werden.

    
Ignacio Vazquez-Abrams 15.04.2010 22:07
quelle
3

Sie können mehr über die interaktive Python-Konsole erfahren, indem Sie die Dokumentation für das Codemodul lesen:

  

Das Code-Modul bietet Funktionen zum Implementieren von Lese-Evaluierungs-Schleifen in Python. Zwei Klassen und Komfortfunktionen sind enthalten, mit denen Anwendungen erstellt werden können, die eine interaktive Interpreter-Eingabeaufforderung bereitstellen.

Ссылка

    
compie 15.04.2010 22:07
quelle
3

Die meisten dieser Sprachen verwenden einen Parser, der eine Art "token stream" hat - das heißt, der Parser behält Token (eine Zeichenfolge, ein Symbol, einen Operator usw.) aus dem Eingabestrom, bis er einen vollständigen Ausdruck hat. dann gibt es den geparsten Ausdruck zurück, wo es zu Bytecode kompiliert oder anderweitig ausgeführt werden könnte. Eine REPL-Schleife ist bei dieser Struktur relativ einfach zu handhaben, da der Parser grundsätzlich nach mehr Eingaben verlangt und Sie dem Benutzer eine Eingabeaufforderung geben und den Benutzer mehr Eingaben eingeben lassen. Möglicherweise benötigen Sie ein wenig Kommunikation vom Parser zum Leser, um Dinge wie Fortsetzungsaufforderungen darzustellen.

Python und Ruby führen beide Anweisungen sofort in der Reihenfolge aus (eine Funktionsdeklaration ist eine Anweisung). So können Sie Code-Anweisung für Anweisung am Interpreter weitgehend den gleichen Effekt wie in einer Quelldatei ausführen.

    
Ian Bicking 16.04.2010 03:01
quelle