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?
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-Kompilierungjavac
, die beispielsweise Lexing, Parsing und Optimierung umfasst.Antworten:
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
.pyc
angezeigten Dateien sind Bytecode für die virtuelle Python-Maschine (ähnlich den.class
Dateien 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.)
quelle
Python fällt unter den Bytecode, der interpretiert wird.
.py
Der 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 .
quelle
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.
quelle
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.
quelle
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.
quelle