Wird Python interpretiert oder kompiliert oder beides?


190

Meinem Verständnis nach:

Eine interpretierte Sprache ist eine Hochsprache, die von einem Interpreter (einem Programm, das die Hochsprache in Maschinencode konvertiert und dann ausführt) unterwegs ausgeführt wird. es verarbeitet das Programm ein wenig nach dem anderen.

Eine kompilierte Sprache ist eine Hochsprache, deren Code zuerst von einem Compiler (ein Programm, das die Hochsprache in Maschinencode umwandelt) in Maschinencode konvertiert und dann von einem Executor (einem anderen Programm zum Ausführen des Codes) ausgeführt wird.

Korrigieren Sie mich, wenn meine Definitionen falsch sind.

Wenn ich jetzt zu Python zurückkehre, bin ich etwas verwirrt darüber. Überall lernen Sie, dass Python eine interpretierte Sprache ist, aber es wird in einen Zwischencode (wie Bytecode oder IL) und nicht in den Maschinencode interpretiert . Welches Programm führt dann den IM-Code aus? Bitte helfen Sie mir zu verstehen, wie ein Python-Skript behandelt und ausgeführt wird.



2
Python erstellt bei jedem Import einer Bibliothek .pyc-Dateien (sogenannter Byecode). AFAIK Der Bytecode kann nur Ladezeiten beschleunigen, keine Ausführungszeiten.
Jesvin Jose

2
@aitchnyu: Das Zwischenspeichern des Bytecodes in .pyc-Dateien beschleunigt zwar nur das Laden, aber nur, weil der Python-Code vor der Ausführung ohnehin zu Bytecode kompiliert wird. Obwohl ich nicht glaube, dass es speziell mit Python versucht wurde, zeigen andere Sprachimplementierungen, dass Bytecode tatsächlich einfacher effizient zu interpretieren ist als ein einfacher AST oder, noch schlimmer, nicht analysierter Quellcode. Ältere Ruby-Versionen wurden beispielsweise von AST interpretiert und AFAIK wurde von neueren Versionen, die zu Bytecode kompiliert wurden, deutlich übertroffen.

Ich möchte nicht unhöflich klingen, aber habe ich das nicht gemeint (aber nicht so informiert wie Sie)?
Jesvin Jose

1
@aitchnyu: Ich weiß nicht was du meinst. Ich weiß nur, dass Ihr Kommentar nicht falsch war, aber für einige Hintergrundinformationen eine gute Gegenüberstellung bot, weshalb er nur die Ladezeit beschleunigt. Deshalb habe ich beschlossen, diese Informationen hinzuzufügen. Keine Straftat gemeint oder genommen :)

Antworten:


231

Zunächst einmal ist interpretiert / kompiliert keine Eigenschaft der Sprache, sondern eine Eigenschaft der Implementierung. Für die meisten Sprachen fallen die meisten, wenn nicht alle Implementierungen in eine Kategorie, so dass man einige Wörter speichern kann, die besagen, dass die Sprache auch interpretiert / kompiliert wird, aber es ist immer noch eine wichtige Unterscheidung, sowohl weil sie das Verständnis fördert als auch weil es einige Sprachen gibt mit verwendbaren Implementierungen beider Arten (meist im Bereich der funktionalen Sprachen, siehe Haskell und ML). Darüber hinaus gibt es C-Interpreter und -Projekte, die versuchen, eine Teilmenge von Python in C- oder C ++ - Code (und anschließend in Maschinencode) zu kompilieren.

Zweitens ist die Kompilierung nicht auf die vorzeitige Kompilierung in nativen Maschinencode beschränkt. Ein Compiler ist im Allgemeinen ein Programm, das ein Programm in einer Programmiersprache in ein Programm in einer anderen Programmiersprache konvertiert (möglicherweise können Sie sogar einen Compiler mit derselben Eingabe- und Ausgabesprache haben, wenn signifikante Transformationen angewendet werden). Und JIT-Compiler kompilieren zur Laufzeit zu nativem Maschinencode , wodurch die Geschwindigkeit sehr nahe oder sogar besser als vor der Kompilierung sein kann (abhängig vom Benchmark und der Qualität der verglichenen Implementierungen).

Um das Nitpicking zu beenden und die Frage zu beantworten, die Sie stellen wollten: Praktisch (sprich: mit einer etwas populären und ausgereiften Implementierung) wird Python kompiliert . Nicht im Voraus zu Maschinencode kompiliert (dh durch die eingeschränkte und falsche, aber leider übliche Definition "kompiliert"), "nur" zu Bytecode kompiliert , aber es wird immer noch mit zumindest einigen der Vorteile kompiliert . Zum Beispiel wird die Anweisung a = b.c()zu einem Bytestream kompiliert, der, wenn er "zerlegt" wird, etwas aussieht load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a). Dies ist eine Vereinfachung, es ist eigentlich weniger lesbar und ein bisschen mehr Low-Level - Sie mit der Standardbibliothek experimentieren disModul und sehen , was die eigentliche Behandlung aussieht.

Dieser Bytecode wird entweder wie bei der Referenzimplementierung (CPython) interpretiert (beachten Sie, dass es sowohl theoretisch als auch praktisch einen Unterschied zwischen der direkten Interpretation und der ersten Kompilierung zu einer Zwischendarstellung gibt und diese interpretiert) oder sowohl interpretiert als auch kompiliert Optimierter Maschinencode zur Laufzeit wie bei PyPy .


2
Okay, dies bedeutet, dass ein Python-Skript zuerst zu Bytecode kompiliert und dann von einem Interpreter wie CPython, Jython oder IronPython usw. implementiert wird.
Pankaj Upadhyay

19
Nein, es wird zu Bytecode kompiliert und dann wird der Bytecode von der jeweiligen VM ausgeführt. CPython ist sowohl der Compiler als auch die VM, aber Jython und IronPython sind nur der Compiler.
Ignacio Vazquez-Abrams

1
@Igacio: Ich habe nicht viel Erfahrung mit IronPython / Jython, aber bietet Jython nicht zumindest eine interpretatorähnliche Ebene? Ich glaube nicht, dass es machbar ist, Python in den statisch typisierten JVM-Bytecode umzuwandeln. Trotzdem ist es ein guter Punkt, dass Compiler und Interpreter Teil desselben Pakets sind.

2
+1 "... eine Eigenschaft der Implementierung". Ich selbst hätte gesagt "es ermöglicht eine interaktive Shell"
Jesvin Jose

2
@delnan: Nun, Jython fungiert als eine Art Vermittler zwischen der Python-Sprache und der Java-VM, kompiliert jedoch zu Java-Bytecode.
Ignacio Vazquez-Abrams

34

Die CPU kann tatsächlich nur Maschinencode verstehen. Bei interpretierten Programmen besteht das ultimative Ziel eines Interpreters darin, den Programmcode in Maschinencode zu "interpretieren". Normalerweise interpretiert eine modern interpretierte Sprache menschlichen Code jedoch nicht direkt, weil er zu ineffizient ist.

Der Python-Interpreter liest zuerst den menschlichen Code und optimiert ihn zu einem Zwischencode, bevor er ihn in Maschinencode interpretiert. Aus diesem Grund benötigen Sie immer ein anderes Programm, um ein Python-Skript auszuführen, anders als in C ++, wo Sie die kompilierte ausführbare Datei Ihres Codes direkt ausführen können. Zum Beispiel c:\Python27\python.exeoder /usr/bin/python.


11
Ich mag den Punkt über "ein anderes Programm zu benötigen, um [es] auszuführen". Das half mir, einige meiner Gedanken zu klären.
Matt

Also optimiert python.exe zuerst den Code und interpretiert ihn dann?
Koray Tugay

@KorayTugay Wenn python.exe von Menschen lesbaren Textquellcode erhält, wird zuerst optimierter Bytecode erzeugt und dieser dann interpretiert (wie Sie sagen). Wenn jedoch bereits eine Bytecodedatei (vorkompiliert) vorhanden ist, muss nicht der erste Schritt ausgeführt werden, was einige Zeit spart.
GordonBGood

31

Die Antwort hängt davon ab, welche Implementierung von Python verwendet wird. Wenn Sie beispielsweise CPython (die Standardimplementierung von Python) oder Jython (für die Integration in die Java-Programmiersprache vorgesehen) verwenden, wird es zuerst in Bytecode übersetzt. Abhängig von der von Ihnen verwendeten Python-Implementierung wird dieser Bycode an den entsprechenden Code weitergeleitet virtuelle Maschine zur Interpretation . PVM (Python Virtual Machine) für CPython und JVM (Java Virtual Machine) für Jython.

Angenommen, Sie verwenden PyPy , eine weitere Standard-CPython-Implementierung. Es würde einen Just-In-Time-Compiler verwenden .


Während der Übersetzung in Bytecode benötigt es einen Compiler, welcher ist das?
Ricky

Pypy ist eine Python- Implementierung, keine "CPython" -Implementierung . Tatsächlich ist Pypy eine Alternative zu CPython ( pypy.org/features.html ).
Giorgio

13

Laut der offiziellen Website von Python handelt es sich um eine interpretierte Sprache.

https://www.python.org/doc/essays/blurb/

Python ist eine interpretierte, objektorientierte Programmiersprache auf hoher Ebene ...

...

Da gibt es keinen Kompilierungsschritt ...

...

Der Python-Interpreter und die umfangreiche Standardbibliothek sind verfügbar ...

...

Wenn der Interpreter stattdessen einen Fehler entdeckt, wird eine Ausnahme ausgelöst. Wenn das Programm die Ausnahme nicht abfängt, druckt der Interpreter eine Stapelverfolgung.


7

Ja, es ist sowohl kompilierte als auch interpretierte Sprache. Warum nennen wir es dann allgemein als interpretierte Sprache?

sehen, wie es kompiliert und interpretiert wird?

Zunächst möchte ich sagen, dass Ihnen meine Antwort besser gefallen wird, wenn Sie aus der Java-Welt stammen.

In Java wird der Quellcode zuerst über den Javac- Compiler in den Bytecode konvertiert und dann an die JVM weitergeleitet (die für die Generierung des nativen Codes für Ausführungszwecke verantwortlich ist). Jetzt möchte ich Ihnen zeigen, dass wir Java als kompilierte Sprache aufrufen, weil wir sehen können, dass es den Quellcode wirklich kompiliert und die .class- Datei (nichts als Bytecode) durch Folgendes liefert :

javac Hello.java ------- > erzeugt die Datei Hello.class

java Hallo --------> Bytecode zur Ausführung an JVM weiterleiten

Dasselbe passiert mit Python, dh zuerst wird der Quellcode über den Compiler in den Bytecode konvertiert und dann an die PVM weitergeleitet (die für die Generierung des nativen Codes für Ausführungszwecke verantwortlich ist). Jetzt möchte ich Ihnen zeigen, dass wir Python normalerweise als interpretierte Sprache bezeichnen, da die Kompilierung hinter den Kulissen erfolgt und wenn wir den Python-Code ausführen:

python Hello.py ------- > führt den Code direkt aus und die Ausgabe zeigt, dass der Code syntaktisch korrekt ist

@ python Hello.py Es sieht so aus, als würde es direkt ausgeführt, aber es generiert zuerst den Bytecode, der vom Interpreter interpretiert wird, um den nativen Code für den Ausführungszweck zu erzeugen.

CPython - Übernimmt die Verantwortung für die Zusammenstellung und Interpretation.

Schauen Sie in die folgenden Zeilen, wenn Sie weitere Details benötigen :

Wie bereits erwähnt, kompiliert CPython den Quellcode, die eigentliche Kompilierung erfolgt jedoch mit Hilfe von Cython. Die Interpretation erfolgt dann mit Hilfe von CPython

Lassen Sie uns nun ein wenig über die Rolle des Just-In-Time-Compilers in Java und Python sprechen

In JVM ist der Java-Interpreter vorhanden, der den Bytecode zeilenweise interpretiert, um den nativen Maschinencode für Ausführungszwecke abzurufen. Wenn Java-Bytecode jedoch von einem Interpreter ausgeführt wird, ist die Ausführung immer langsamer. Was ist die Lösung? Die Lösung ist der Just-In-Time-Compiler, der den nativen Code erzeugt, der viel schneller ausgeführt werden kann, als dies interpretiert werden könnte. Einige JVM-Anbieter verwenden Java Interpreter und andere den Just-In-Time-Compiler . Referenz: hier klicken

Verwenden Sie in Python eine andere Python-Implementierung ( PyPy ) anstelle von CPython , um den Interpreter zu umgehen und eine schnelle Ausführung zu erreichen . Klicken Sie hier für eine andere Implementierung von Python einschließlich PyPy .


6

If (Sie kennen Java) {

Python-Code wird wie Java in Bytecode konvertiert.
Dieser Bytecode wird jedes Mal erneut ausgeführt, wenn Sie versuchen, darauf zuzugreifen.

} else {

Python-Code wird anfänglich in einen so genannten Bytecode übersetzt
, der der Maschinensprache sehr nahe kommt, aber nicht dem tatsächlichen Maschinencode entspricht. Bei
jedem Zugriff oder jeder Ausführung wird dieser Bytecode erneut ausgeführt.

}


2

Fast kann man sagen, dass Python eine interpretierte Sprache ist. Wir verwenden jedoch einen Teil eines einmaligen Kompilierungsprozesses in Python, um den vollständigen Quellcode in Bytecode wie Java umzuwandeln.


1

Für Neulinge

Python kompiliert Ihr Skript automatisch zu kompiliertem Code, dem sogenannten Bytecode, bevor es ausgeführt wird.

Das Ausführen eines Skripts wird nicht als Import betrachtet und es wird kein .pyc erstellt.

Wenn Sie beispielsweise eine Skriptdatei abc.py haben, die ein anderes Modul xyz.py importiert, wird beim Ausführen von abc.py xyz.pyc erstellt, da xyz importiert wird, aber seit abc wird keine abc.pyc-Datei erstellt. py wird nicht importiert.


0

Der von Ihnen geschriebene Python-Code wird in Python-Bytecode kompiliert, der eine Datei mit der Erweiterung .pyc erstellt. Wenn kompiliert wird, stellt sich erneut die Frage, warum nicht die kompilierte Sprache.

Beachten Sie, dass dies keine Kompilierung im herkömmlichen Sinne des Wortes ist. Normalerweise würden wir sagen, dass beim Kompilieren eine Hochsprache verwendet und in Maschinencode konvertiert wird. Aber es ist eine Art Zusammenstellung. In Zwischencode kompiliert, nicht in Maschinencode (Hoffe, Sie haben es jetzt).

Zurück zum Ausführungsprozess wird Ihr in der Pyc-Datei vorhandener Bytecode, der im Kompilierungsschritt erstellt wurde, von geeigneten virtuellen Maschinen ausgeführt, in unserem Fall der CPython-VM. Der Zeitstempel (als magische Zahl bezeichnet) wird verwendet, um zu überprüfen, ob. Die py-Datei wird geändert oder nicht, je nachdem, welche neue pyc-Datei erstellt wird. Wenn pyc den aktuellen Code enthält, wird der Kompilierungsschritt einfach übersprungen.


0

Python (der Interpreter) wird kompiliert .

Beweis: Es wird nicht einmal Ihren Code kompilieren , wenn er Syntaxfehler enthält .

Beispiel 1:

print("This should print") 
a = 9/0 

Ausgabe:

This should print
Traceback (most recent call last):
  File "p.py", line 2, in <module>
    a = 9/0
ZeroDivisionError: integer division or modulo by zero

Code wird erfolgreich kompiliert. Erste Zeile wird ausgeführt ( print) zweite Zeile wirft ZeroDivisionError(Laufzeitfehler).

Beispiel 2:

print("This should not print")
/0         

Ausgabe:

  File "p.py", line 2
    /0
    ^
SyntaxError: invalid syntax

Schlussfolgerung : Wenn Ihre Codedatei SyntaxErrornichts enthält, wird nichts ausgeführt, da die Kompilierung fehlschlägt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.