it-swarm.dev

Ist Python interpretiert oder kompiliert?

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 kompilieren muss zuerst nach der Maschine und dann ausführen. Dies führt zu einer viel schnelleren Ausführung.

Kommen wir nun zu Python :

  • A python Code ( somefile.py ) beim Importieren erstellt eine Datei () somefile.pyc ) im selben Verzeichnis. Nehmen wir an, der Import erfolgt in einem python Shell oder 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 legt nahe, dass * .pyc-Dateien kompiliert werden python -Dateien ähnlich der ausführbaren Datei Erstellt nach dem Kompilieren einer C-Datei, obwohl ich die * .pyc-Datei nicht direkt ausführen kann.
  • Wenn die Datei python (somefile.py)) direkt ausgeführt wird (./somefile.py oder python somefile.py), wird keine .pyc-Datei erstellt und die Code wird ausgeführt, um interpretiertes Verhalten anzuzeigen.

Diese legen nahe, dass ein python Code jedes Mal kompiliert wird, wenn er in einen neuen Prozess importiert wird, um einen .pyc zu erstellen, während er bei direkter Ausführung interpretiert wird.

Als welche Art von Sprache sollte ich sie betrachten? Interpretiert oder zusammengestellt? Und wie ist seine Effizienz im Vergleich zu interpretierten und kompilierten Sprachen?

Laut der Interpreted Languages Seite des Wikis ist es als eine Sprache aufgeführt, die zu Virtual Machine Code kompiliert wurde. Was ist damit gemeint?

82
crodjer

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

So ziemlich jede Python - Implementierung besteht aus einem Interpreter (und nicht aus einem Compiler). Die angezeigten .pyc - Dateien sind Bytecode für die Python) virtuelle Maschine (ähnlich den .class - Dateien von Java). Sie stimmen nicht mit dem Maschinencode überein, der von einem C-Compiler für eine native Maschinenarchitektur generiert wurde. Einige Python-Implementierungen jedoch bestehen aus einem just-in-time Compiler, der Python Bytecode in nativen Maschinencode kompiliert).

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

83
mipadi

Python fällt unter den interpretierten Bytecode. .py Quellcode wird zuerst als .pyc In Bytecode kompiliert. Dieser Bytecode kann interpretiert (offizielles CPython) oder JIT kompiliert (PyPy) werden. Python Quellcode (.py) Kann auch wie IronPython (.Net) oder Jython (JVM) zu unterschiedlichem Bytecode kompiliert werden. Es gibt mehrere Implementierungen von Python Sprache. Die offizielle Sprache ist eine Bytecode-interpretierte Sprache. Es gibt auch JIT-kompilierte Bytecode-Implementierungen.

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

36
aufather

Kompiliert oder interpretiert kann in einigen Kontexten hilfreich sein, aber wenn es im technischen Sinne angewendet wird, ist es eine falsche Zweiteilung.

Ein Compiler (im weitesten Sinne) ist ein Übersetzer . Es übersetzt Programm A in Programm B und für die zukünftige Ausführung mit einer Maschine M.

Ein Interpreter (im weitesten Sinne) ist ein Executor . Es ist eine Maschine M, die Programm A ausführt. Obwohl wir normalerweise physische Maschinen (oder nicht-physische Maschinen, die sich wie physische Maschinen verhalten) von diesen Definitionen ausschließen. Aus theoretischer Sicht ist diese Unterscheidung jedoch etwas willkürlich.


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


Am Ende hängt es davon ab, von welcher Abstraktionsebene Sie sprechen und was Sie interessiert. Die Leute sagen "kompiliert" oder "interpretiert" als umfassende 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 Sprache Python)) ist hauptsächlich für die Ausführung von Code interessant. Daher wird CPython normalerweise als interpretiert beschrieben. Dies ist jedoch eine lose Bezeichnung.

11
Paul Draper

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, den ein Mensch geschrieben hat.

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

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

7

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

Der Kompilierungsprozess konvertiert den 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.

5
ykombinator