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.
quelle
Antworten:
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 aussiehtload 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 experimentierendis
Modul 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 .
quelle
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.exe
oder/usr/bin/python
.quelle
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 .
quelle
Laut der offiziellen Website von Python handelt es sich um eine interpretierte Sprache.
https://www.python.org/doc/essays/blurb/
...
...
...
quelle
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 .
quelle
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.
}
quelle
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.
quelle
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.
quelle
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.
quelle
Python (der Interpreter) wird kompiliert .
Beweis: Es wird nicht einmal Ihren Code kompilieren , wenn er Syntaxfehler enthält .
Beispiel 1:
Ausgabe:
Beispiel 2:
Ausgabe:
quelle