Wird Python interpretiert oder kompiliert?

76

Dies ist nur eine Frage, die ich beim Lesen über interpretierte und kompilierte Sprachen hatte.

Ruby ist zweifellos eine interpretierte Sprache, da der Quellcode zum Zeitpunkt der Ausführung von einem Interpreter verarbeitet wird.
Im Gegenteil, C ist eine kompilierte Sprache, da man den Quellcode zuerst nach der Maschine kompilieren und dann ausführen muss. Dies führt zu einer viel schnelleren Ausführung.

Kommen wir nun zu Python :

  • Ein importierter Python-Code ( somefile.py ) erstellt eine Datei ( somefile.pyc ) im selben Verzeichnis. Angenommen, der Import erfolgt in einer Python-Shell oder einem Django-Modul. Nach dem Import ändere ich den Code ein wenig und führe die importierten Funktionen erneut aus, um festzustellen, dass der alte Code noch ausgeführt wird. Dies deutet darauf hin, dass * .pyc-Dateien kompilierte Python-Dateien sind, die der ausführbaren Datei ähneln, die nach dem Kompilieren einer C-Datei erstellt wurde, obwohl ich * .pyc-Dateien nicht direkt ausführen kann.
  • Wenn die Python-Datei (somefile.py) direkt ausgeführt wird (./somefile.py oder python somefile.py), wird keine .pyc-Datei erstellt und der Code so ausgeführt, wie er das interpretierte Verhalten anzeigt.

Dies deutet darauf hin, dass ein Python-Code jedes Mal kompiliert wird, wenn er in einen neuen Prozess importiert wird, um eine .pyc-Datei zu erstellen, während sie bei der direkten Ausführung interpretiert wird.

Also als welche Art von Sprache sollte ich es betrachten? Interpretiert oder kompiliert? Und wie ist die Effizienz im Vergleich zu interpretierten und kompilierten Sprachen?

Laut der Interpreted Languages- Seite von Wiki wird sie als Sprache aufgelistet, die zu Virtual Machine Code kompiliert wurde. Was ist damit gemeint?

Crodjer
quelle
1
Wann gibt es Zweifel, ob Ruby eine interpretierte Sprache ist? Wenn es kompiliert ist. :) macruby.org
mipadi
8
Es ist erwähnenswert, dass keine moderne Sprache im engeren Sinne interpretiert wird. Praktisch alle kompilieren zu Bytecode.
Winston Ewert
@ Winston Ewert: Bravo! Applesoft Basic (in den 1980er Jahren) wurde Byte-Code kompiliert. "modern" bedeutet in diesem Fall jede interpretierte Sprache im lebendigen Gedächtnis, mit der einzigen möglichen Ausnahme, dass einige rudimentäre Dartmouth Basic-Implementierungen vorhanden sind.
S.Lott
6
>> Im Gegenteil C ist eine kompilierte Sprache << root.cern.ch/drupal/content/cint
igouy
3
@ S.Lott: Das Aufrufen des Tokenisierungsprozesses, den die BASIC-Interpreter von Applesoft und '80s durchgeführt haben, ist mehr als unaufrichtig. Ja, der vom Benutzer eingegebene Programmcode wurde in komprimierter Form im Speicher abgelegt, ein Byte pro reserviertem Wort, aber bis zur Eingabe wurde nichts weiter unternommen RUN. Es war, als ob Sie einen Compiler hätten, der den Schritt des Lexierens ausführt und dann einen Stream von Tokens ausgibt, der jedes Mal neu analysiert werden muss, wenn das Programm ausgeführt wird. Ganz und gar nicht wie die moderne Bytecode-Kompilierung javac, die beispielsweise Lexing, Parsing und Optimierung umfasst.
dodgethesteamroller

Antworten:

80

Es ist erwähnenswert, dass Sprachen nicht interpretiert oder kompiliert werden, sondern dass Sprachimplementierungen entweder Code interpretieren oder kompilieren. Sie haben festgestellt, dass Ruby eine "interpretierte Sprache" ist, aber Sie können Ruby à la MacRuby kompilieren , sodass es nicht immer eine interpretierte Sprache ist.

Fast jede Python-Implementierung besteht aus einem Interpreter (und nicht aus einem Compiler). Die .pycangezeigten Dateien sind Bytecode für die virtuelle Python-Maschine (ähnlich den .classDateien von Java ). Sie sind nicht mit dem Maschinencode identisch, der von einem C-Compiler für eine native Maschinenarchitektur generiert wird. Einige Python-Implementierungen bestehen jedoch aus einem Just-in-Time- Compiler, der Python-Bytecode in systemeigenen Maschinencode kompiliert.

(Ich sage "so ziemlich jeden", weil ich keine nativen Maschinencompiler für Python kenne, aber ich möchte nicht behaupten, dass nirgendwo welche existieren.)

mipadi
quelle
Abhängig von Ihrer Definition gibt es native Maschinencompiler für Python. Einige kompilieren nur eine Teilmenge von Python. Andere implementieren Python vollständig, verwenden jedoch die Python-API, um die Vorgänge auszuführen, die in C nicht ausgeführt werden können.
Winston Ewert
Ich denke, Sie beschreiben tatsächlich, dass Python entweder das ist, was ich als "halbkompiliert" bezeichne, oder dass es tatsächlich vollständig kompiliert werden kann. Mit "halbkompiliert" meine ich, dass, da es normalerweise in die "Zwischensprache" -PYC-Datei kompiliert wird, die von der virtuellen Python-Maschine verwendet wird, es normalerweise in dieser "halbkompilierten" Form ausgeführt wird, die Code im Allgemeinen schneller macht als Klare Laufzeitinterpretation von interpretiertem Code. Interessanterweise kann halbkompilierter Code manchmal schneller sein als nativ kompilierter Code (z. B. ist C # im Allgemeinen schneller als C ++).
Chris Halcrow
5
Cython kompiliert Python-Code in C, damit er als gemeinsames Objekt kompiliert werden kann.
greyfade
Das Unterscheiden von Bytecode und Maschinencode auf diese Weise ist ziemlich willkürlich. Java wird kompiliert: Der Javac-Compiler erstellt Klassendateien mit Anweisungen auf niedriger Ebene, die entweder in einer virtuellen Maschine (z. B. Hotspot) oder direkt von Hardware (z. B. auf ARM-Prozessoren mit der Erweiterung Jazelle) ausgeführt werden können. Soweit mir bekannt ist, gibt es keinen technischen Grund, warum eine ähnliche Prozessorarchitektur nicht für die direkte Ausführung von Python-VM-Anweisungen entwickelt werden könnte.
Jules
@Jules Zufälligerweise wird Jython- Code tatsächlich in .class-Dateien kompiliert, von denen ich glaube, dass sie wiederverwendet werden, bis Sie die py-Quelle ändern.
JimmyJames
35

Python fällt unter den Bytecode, der interpretiert wird. .pyDer Quellcode wird zuerst zu Bytecode als kompiliert .pyc. Dieser Bytecode kann interpretiert (offizielles CPython) oder JIT kompiliert (PyPy) werden. Python-Quellcode ( .py) kann auch wie IronPython (.Net) oder Jython (JVM) zu einem anderen Byte-Code kompiliert werden. Es gibt mehrere Implementierungen der Python-Sprache. Der offizielle Code ist ein Byte-Code, der interpretiert wird. Es gibt auch JIT-kompilierte Implementierungen mit Bytecode.

Für Geschwindigkeitsvergleiche verschiedener Implementierungen von Sprachen können Sie hier versuchen .

aufather
quelle
Danke für die Info. Laut den Benchmarks ist die Leistung von Python weit unten!
Crodjer
1
Der Link, den ich gegeben habe, besagt sehr deutlich, dass dies fehlerhafte Benchmarks für Sprachimplementierungen sind . Python sollte nicht Ihre Wahl der Sprache sein, wenn Sie sich zu viele Gedanken über die Ausführungsleistung machen. Wenn Sie immer noch vergleichen möchten, vergleichen Sie ähnliche Sprachen. Mit Bytecode interpretiertes offizielles CPython ist vergleichbar oder schneller als mit JIT kompiliertes Ruby.
Aufather
1
@ jase21 - "Meine Pläne für 2006 sind, die in Psyco implementierten Techniken auf PyPy zu portieren. Mit PyPy können wir einen flexibleren JIT - Spezialisten erstellen, mit dem wir einfacher experimentieren können und ohne den Aufwand, mit den Entwicklungen von Schritt halten zu müssen die Python-Sprache. " psyco.sourceforge.net/introduction.html
igouy
1
@ jase21 - "Lässt Python-Codes schneller laufen als C-Counter-Parts" - Sollen wir einfach dein Wort dafür nehmen?
11.
3
Der Link in der Antwort ist unterbrochen.
Basilevs
11

Kompiliert oder interpretiert kann in manchen Zusammenhängen hilfreich sein, aber in technischer Hinsicht ist es eine falsche Zweiteilung.

Ein Compiler (im weitesten Sinne) ist ein Übersetzer . Es übersetzt das Programm A in das Programm B und führt es zur späteren Ausführung auf einer Maschine M aus.

Ein Dolmetscher (im weitesten Sinne) ist ein Vollstrecker . Es ist eine Maschine M, die Programm A ausführt. Allerdings schließen wir in der Regel physische Maschinen (oder nicht-physische Maschinen, die genau wie physische Maschinen funktionieren) aus dieser Definition aus. Aus theoretischer Sicht ist diese Unterscheidung jedoch etwas willkürlich.


Nehmen wir zum Beispiel re.compile. Es "kompiliert" einen regulären Ausdruck zu einer Zwischenform, und diese Zwischenform wird interpretiert / ausgewertet / ausgeführt.


Letztendlich kommt es darauf an, von welcher Abstraktionsebene Sie sprechen und worüber Sie sich Gedanken machen. Die Leute sagen "kompiliert" oder "interpretiert" als breite Beschreibung der interessantesten Teile des Prozesses, aber eigentlich wird fast jedes Programm auf die eine oder andere Weise kompiliert (übersetzt) ​​und interpretiert (ausgeführt).

CPython (die beliebteste Implementierung der Python-Sprache) ist vor allem für die Ausführung von Code interessant. Daher wird CPython normalerweise als interpretiert beschrieben. Dies ist jedoch ein loses Etikett.

Paul Draper
quelle
7

Virtual Machine Code ist eine kompaktere Version des ursprünglichen Quellcodes (Bytecode). Es muss noch von einer virtuellen Maschine interpretiert werden, da es sich nicht um Maschinencode handelt. Es ist jedoch einfacher und schneller zu analysieren als der ursprüngliche Code, der von einem Menschen geschrieben wurde.

Einige virtuelle Maschinen generieren Maschinencode, während sie den Code der virtuellen Maschine zum ersten Mal interpretieren (Just-in-Time-Compilation - JIT). Die folgenden Aufrufe verwenden diesen Maschinencode direkt, was zu einer schnelleren Ausführung führt.

Soweit ich weiß, verwendet Ruby> = 1.9 auch eine virtuelle Maschine wie Python.

LennyProgrammierer
quelle
5

Die Python-Laufzeit führt benutzerdefinierten Objektcode (Bytecode) auf einer virtuellen Maschine aus.

Der Kompilierungsprozess konvertiert Quellcode in Objektcode.

Um die Arbeit zu beschleunigen, wird der Objektcode (oder, falls gewünscht, der Bytecode) auf der Festplatte gespeichert, sodass er beim nächsten Ausführen des Programms wiederverwendet werden kann.

ykombinator
quelle