So vielfältig sie auch sind, es gibt eine Handvoll gemeinsamer Konzepte, die alle seriösen, modernen Programmiersprachen gemeinsam haben. Zwei davon bilden den Kern der Antwort auf Ihre obigen Fragen.
Welche Schritte passieren zwischen dem Drücken der Eingabetaste und dem Maschinencode, der aus meinem Python-Code generiert wurde, der auf meiner CPU ausgeführt wird?
Der Code wird analysiert, analysiert und in einen Interpreter eingegeben. Hier geht es um ein sehr wichtiges Gebiet der Informatik, das als Compilertheorie bekannt ist . Ein Compiler ist ein Programm, das Code aus einer Sprache (Ihrem Quellcode) in eine andere Sprache übersetzt (in der Regel Maschinencode, obwohl es "Transpiler" gibt, die von einer höheren Sprache in eine andere übersetzen). Dies ist ein wirklich umfangreiches Thema, über das Sie jahrelang recherchieren könnten, aber hier ist die Basisversion:
Der Compiler beginnt mit einem Parser , einer Routine, die Ihren Quellcode liest und die Syntaxregeln der Sprache anwendet, um herauszufinden, ob es als gültiger Python-Code (in Ihrem Fall) Sinn macht. Wenn dies nicht der Fall ist, gibt der Parser einen Fehler aus und der Compiler wird beendet. Wenn dies jedoch der Fall ist, gibt der Parser einen sogenannten abstrakten Syntaxbaum, kurz AST, aus. Der AST ist eine Baumdatenstruktur, deren Knoten jeweils ein Element der Syntax enthalten. Wenn Sie beispielsweise sagen x = 5
, könnten Sie einen BinaryExpression
Knoten mit einem operator
Wert von =
, einem Left
Wert von ReferenceExpression(x)
und einem Right
Wert von erhalten IntegerLiteralExpression(5)
. Ihr gesamtes Programm kann durch einen großen Baum wie diesen dargestellt werden.
Sobald der Parser einen AST erzeugt, ist die zweite Phase die semantische Analyse . Im Klartext bedeutet dies "herausfinden, was dieser AST bedeutet". Es überprüft den AST, um festzustellen, ob Sie etwas Illegales getan haben, obwohl es sich um eine gültige Analyse handelt (z. B. um den Versuch, eine 1-Argument-Funktion mit 3 Argumenten aufzurufen), und löst in diesem Fall Fehler aus. Andernfalls wird der AST analysiert und bearbeitet, um das Verständnis für eine Maschine zu vereinfachen.
Die dritte Phase ist die Codegenerierung. Sobald Sie einen vollständig analysierten, vereinfachten und gültigen AST haben, geben Sie ihn an den Generator weiter, der den AST durchläuft und Code in der Ausgabesprache erzeugt. Dies ist Ihr fertiges Produkt.
In Python wird eher ein Interpreter als ein Compiler verwendet. Ein Interpreter funktioniert genauso wie ein Compiler, mit dem Unterschied, dass er anstelle der Codegenerierung die Ausgabe im Arbeitsspeicher lädt und direkt auf Ihrem System ausführt. (Die genauen Details, wie dies geschieht, können je nach Sprache und Dolmetscher sehr unterschiedlich sein.)
Und wie hängt das mit dem Python-Laufzeitsystem und / oder der Bibliothek zusammen?
Mit Ausnahme der einfachsten Sprachen verfügen alle Sprachen über eine Reihe vordefinierter Funktionen, die für einen großen Prozentsatz der Benutzer wichtig sind und die für die Benutzer aus dem einen oder anderen Grund nur schwer selbst zu implementieren sind. Ihr Code kann diese Funktionen aufrufen, ohne dass Bibliotheken von Drittanbietern erforderlich sind. (Zum Beispiel in Python print
, an das die Ausgabe gesendet wird stdout
. Viel Glück beim Implementieren!) Diese Funktionsgruppe wird im Allgemeinen in einer gemeinsam genutzten Bibliothek gesammelt, in die der Code zur Laufzeit aufgerufen werden kann. Aus diesem Grund ist sie bekannt als Sprachlaufzeitbibliothek oder kurz "die Laufzeit".