Python Interpreter und Kompilierungsvorgang

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Abend,

ich hab da mal so eine Frage bezüglich des Kompilierunsgvorgangs in Python.

Der Weg ist doch der folgende:


Python Interpreter ---> Bytecode --> PVM


Python Interpreter bekommt einen Quellcode foo.py und wandlet diesen in Bytecode um. Bei dieser Umwandlung geht der Interpreter eine Anweisung nach der nächsten von foo.py durch und wird dann vom Interpreter ausgeführt. Da hierfür mehrere Zyklen notwendig sind und der Kompilierungsvorgang länger braucht, wird Bytecode erzeugt, welcher so schneller auszuführen ist.

Der Bytecode ist eine interne Darstellung des Quelltextes ist, welches dem Programmtextes sehr ähnlich ist und ist für die plattformunabhängigkeit verantwortlich, da der Bytecode auf jedem System ausgeführt werden kann.

Die PVM führt dann schließlich den Bytecode aus und die Ausgabe erscheint dann auf den Bildschirm. Sollte sich der Quellcode ändern so wird ein neuer Bytecode erzeugt, bleibt der Quellcode unverändert und wurde bereits der Bytecode erzeugt, so kann der Bytecode benutzt werden.

D.h. falls der Python-Interpreter ein größeres Programm bestehend aus mehreren .py Datein ausführt, so arbeitet es schneller, wenn von all den .py Datein der Bytecode bereits vorliegt.

Nun noch zum Python Interpreter an sich:
  • Interaktive Shell: eingegebene Befehle werden in der Shell sofort ausgeführt
  • Skript Mode: mittels python foo.py wird der Quellcode ausgeführt
Ist zwar lang, aber ich hoffe, ich habe die Zusammenhänge so richtig ausfgeschrieben!

Gruß Helex!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Helex hat geschrieben:ich hab da mal so eine Frage bezüglich des Kompilierunsgvorgangs in Python.
Habe keine Frage entdecken können ;)
Helex hat geschrieben:
  • Interaktive Shell: eingegebene Befehle werden in der Shell sofort ausgeführt
  • Skript Mode: mittels python foo.py wird der Quellcode ausgeführt
Man kann auch aus einem Skript wieder in den Interpreter springen: Djangos ``manage.py shell`` und IPython machen es vor. Außerdem ist es jederzeit möglich dynamisch Quellcode auszuführen: ``eval()``, ``exec``. Ob es sich exakt so verhält wie in vielen Lisp-Interpretern kann ich dir aber nicht sagen. Zumindest Django benutzt in django.core.management IPython bzw. das core-Modul. So wie ich das aber lese, wird aber eine REPL in Python laufen gelassen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BlackJack

Helex hat geschrieben:Der Bytecode ist eine interne Darstellung des Quelltextes ist, welches dem Programmtextes sehr ähnlich ist und ist für die plattformunabhängigkeit verantwortlich, da der Bytecode auf jedem System ausgeführt werden kann.
Mit dem Satz habe ein bisschen Probleme. Der Bytecode ist dem Quelltext nur bedingt ähnlich und ist auch nicht für die Plattformunabhängigkeit verantwortlich. Der Quelltext ist schliesslich auch plattformunabghängig und wäre es auch, wenn der Bytecode es nicht wäre.
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Danke für die Antworten,

also kann ich davon ausgehen, dass ich vieles richtig verstanden habe.

Nun zu dem von Blackjack angesprochenen Punkt:


Diesen Satz habe ich nochmal aus dem, sehr guten wie ich finde, "Learning Python" von O'Reilly und Wikipedia. Aus dem Buch:

Python first compiles your source code into a format known as byte code. Compilation is simply a translation step, and byte code is a lower-level, and platform-independant, representation of your source code. Each of your source statements is translated into a group of byte code instructions. This byte code translation is performed to speed- execution - byte code can be run much quicker than the original source code statements

und aus Wikipedia:
In der Informatik ist Bytecode eine Sammlung von Befehlen für eine virtuelle Maschine. Bei Compilierung eines Quelltextes mancher Programmiersprachen oder Umgebungen, wie z. B. Java, wird nicht direkt Maschinencode sondern ein Zwischencode, der Bytecode, erstellt. Dieser Code ist in der Regel maschinenunabhängig und im Vergleich zum Quelltext und zu Maschinencode oft relativ kompakt
Daher habe ich das so interpretiert!

Vielen dank für die Antworten hier, dieses Forum ist einfach nur gut durch die vielen netten Benutzern.

Grüße Helex!
BlackJack

Über die Maschinenunabhängigkeit von Bytecode lässt sich streiten. Der läuft nämlich auch nur auf der (virtuellen) Maschine für die er gedacht ist. So wie x86-Binärcode einen echten oder emulierten x86-Prozessor benötigt, braucht Java-Bytecode eine echte oder emulierte JVM.

Was die Plattformunabhängigkeit einer Sprache ausmacht ist normalerweise eine Kombination aus Einhaltung von Standards die für viele Plattformen gelten und Laufzeitbibliotheken die auf möglichst viele Plattformen portiert wurden und eine API anbieten, die diverse Unterschiede zwischen Plattformen vor dem Programmierer "verstecken".
Benutzeravatar
Helex
User
Beiträge: 33
Registriert: Mittwoch 21. Februar 2007, 09:52
Wohnort: Dessau, Sachsen-Anhalt
Kontaktdaten:

Okay vielen dank, ich habe das zur Kenntniss genommen
lunar

BlackJack hat geschrieben:
Helex hat geschrieben:Der Bytecode ist eine interne Darstellung des Quelltextes ist, welches dem Programmtextes sehr ähnlich ist und ist für die plattformunabhängigkeit verantwortlich, da der Bytecode auf jedem System ausgeführt werden kann.
Mit dem Satz habe ein bisschen Probleme. Der Bytecode ist dem Quelltext nur bedingt ähnlich und ist auch nicht für die Plattformunabhängigkeit verantwortlich. Der Quelltext ist schliesslich auch plattformunabghängig und wäre es auch, wenn der Bytecode es nicht wäre.
Ein Beispiel für eine Sprache, deren Quelltext zwar plattformunabhängig ist, die aber im "Bytecode" an eine Plattform gebunden ist, wäre C.
Die Sprache ist standardisiert und viele Bibliotheken sind plattformübergreifend verfügbar, einmal kompiliert ist C Code jedoch nicht mehr portabel, sondern an Architektur und Betriebssystem gebunden.
Antworten