it-swarm.com.de

Wie funktioniert die Python Runtime) tatsächlich?

Ich habe einige Probleme, das Konzept eines runtime library, insbesondere das Python one. Also habe ich ein Hallo-Welt-Programm geschrieben python-Programm und beabsichtige, es auszuführen, also schreibe ich python ./hello_world.py.

Welche Schritte passieren zwischen dem Drücken der Eingabetaste und dem Maschinencode, der aus meinem python Code, der auf meiner CPU ausgeführt wird, generiert wird? Und wie hängt dies mit dem Python zusammen? Laufzeitsystem und/oder Bibliothek?

28
hgiesel

So vielfältig sie auch sind, es gibt eine Handvoll gemeinsamer Konzepte, die alle seriösen, modernen Programmiersprachen teilen. Zwei davon sind der 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 einem Interpreter zugeführt. Hier geht es um ein sehr wichtiges Gebiet der Informatik, das als Compilertheorie bekannt ist. Ein Compiler ist ein Programm, das Code von einer Sprache (Ihrem Quellcode) in eine andere Sprache übersetzt (normalerweise Maschinencode, obwohl "Transpiler" existieren, die von einer Hochsprache in eine andere übersetzen). Dies ist ein wirklich umfangreiches Thema, das Sie jahrelang erforschen könnten, aber hier ist die Basisversion:

Der Compiler beginnt mit einem Parser, einer Routine, die Ihren Quellcode liest und die Syntaxregeln der Sprache darauf anwendet, um herauszufinden, ob es als gültiges Python (in Ihrem) sinnvoll ist case) Code. Wenn dies nicht der Fall ist, gibt der Parser einen Fehler aus und der Compiler wird aussteigen. Wenn dies jedoch der Fall ist, gibt der Parser einen so genannten abstrakten Syntaxbaum oder kurz AST aus. Das AST ist eine Baumdatenstruktur, deren Knoten jeweils ein Element der Syntax enthalten. Wenn Sie beispielsweise x = 5 Sagen, erhalten Sie möglicherweise einen BinaryExpression Knoten mit einem operator Wert von =, Einem Left Wert von ReferenceExpression(x) und ein Right Wert von 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 semantische Analyse. Im Klartext bedeutet dies "finde heraus, was dieses AST bedeutet". Es überprüft das AST, um festzustellen, ob Sie etwas Unzulässiges getan haben, obwohl es sich um eine gültige Analyse handelt (z. B. beim Versuch, eine 1-Argument-Funktion mit 3 Argumenten aufzurufen), und löst in diesem Fall Fehler aus. Andernfalls wird das 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 in den Generator ein, der das AST durchläuft und Code in der Ausgabesprache erzeugt. Dies ist Ihr fertiges Produkt.

Bei Python wird eher ein Interpreter als ein Compiler verwendet. Ein Interpreter funktioniert genauso wie ein Compiler, mit einem Unterschied: Anstelle der Codegenerierung lädt er die Ausgabe in den Speicher und führt sie direkt auf Ihrem System aus. (Die genauen Details dazu können zwischen verschiedenen Sprachen und verschiedenen Dolmetschern sehr unterschiedlich sein.)

Und wie hängt das mit dem Laufzeitsystem und/oder der Bibliothek Python zusammen?

Alle bis auf die einfachsten Sprachen verfügen über eine Reihe vordefinierter Funktionen, die für einen großen Prozentsatz der Benutzer wichtig sind und 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 haben Sie in Python print, das die Ausgabe an stdout sendet. Viel Glück beim Implementieren selbst!) Diese Funktionen werden im Allgemeinen in a gesammelt Gemeinsame Bibliothek, die der Code zur Laufzeit aufrufen kann, weshalb sie als Sprachlaufzeitbibliothek oder einfach als "Laufzeit" bezeichnet wird.

36
Mason Wheeler

Die Standardimplementierung Python ist eine virtuelle Bytecode-Maschine. Dies bedeutet, dass der Maschinencode (Opcodes aus dem Opcode Ihres Prozessors) set) wird nicht aus Ihrem Programm generiert. Die Opcodes werden nur aus den Opcodes ausgewählt , die bereits in die virtuelle Maschine kompiliert wurden während die VM den Bytecode interpretiert.

Wie Ihr Programm überhaupt in Bytecode umgewandelt wird, ist eine etwas andere Frage, aber die kurze Antwort lautet "durch Kompilieren, genau wie bei jeder anderen Abwärtssprache".

5
Kilian Foth