Ist Python compiliert oder interpretiert?

Soviel vorweg: Die Frage, ob es sich bei Python um eine Interpreter- oder eine Compilersprache handelt, ist nicht eindeutig zu beantworten. Zum einen weil die Definition von Compiler und Interpreter durch unterschiedlichste Technologien sehr verschwommen ist, zum anderen weil Python Grundelemente beider Sprachtypen besitzt. Die Antwort beides trifft es da vielleicht noch am besten. In diesem Beitrag geht es um die internen Python-Prozesse, wenn Quellcode ausgeführt wird.

Compiler- und Interpretersprachen

In der Informatik werden Programmiersprachen traditionell in die Klassen Compiler- und Interpretersprache eingeordnet. Schauen wir uns zunächst anhand eines Schemas an, was der Unterschied zwischen Compiler- und Interpretersprachen ist und besprechen die beiden Typen anschließend:

Compilersprachen

Compilersprachen wie c, c++ oder Fortran übersetzen den Quellcode an einem bestimmten Zeitpunkt der Programmentwicklung in Maschinencode. Dieser liegt anschließend als Datei (bspw. exe) bereit und kann zu beliebiger Zeit ausgeführt werden.

Da die Übersetzung von Quell- zu Maschinencode bereits geschehen ist (und Maschinencode naturgemäß sehr schnell auszuführen ist) haben Compilersprachen den Vorteil schneller Ausführungsgeschwindigkeiten von Programmen. Der Nachteil liegt in ihrer Plattformabhängigkeit der ausführbaren Dateien.

Interpretersprachen

Interpretersprachen führen Quellcode instantan zur Laufzeit des Programms aus. Der Interpreter selbst ist ein vorkompiliertes Programm, welches die Quellcodeanweisungen versteht (sie interpretieren kann) und entsprechenden Maschinencode ausführt. Inzwischen existieren unterschiedliche Technologien von Interpretern. Der klassische Interpreter übersetzt Quellcode sequenziell in Maschinencode und führt diesen auf der entsprechenden Plattform aus. Daneben existieren Bytecodeinterpreter, welche aus dem Quellcode Binärcode generieren und diesen in einer virtuellen Maschine ausführen. In einem Bytecodeinterpreter wird aus dem Quellcode kein direkter Maschinencode erzeugt – auch wenn das oftmals missverstanden wird! Der Zwischenschritt – das erzeugen von Binärcode – sorgt für Plattformunabhängigkeit der zu interpretierenden Sprache. Eine Alternative zum Interpreter ist der sog. JIT (Just-In-Time-Compiler). Auch dieser erzeugt in einem Zwischenschritt Binärcode, optimiert diesen jedoch und erzeugt daraus wiederum Maschinencode – alles zur Laufzeit. Der wesentliche Unterschied eines JIT-Compilers zu einem Interpreter liegt darin, bereits kompilierten Code mit Caching-Mechanismen wiederverwendbar zu machen. Während ein klassischer Interpreter die Kompilierung bei jeder Ausführung von Code erneut vornimmt, kann der JIT-Compiler bestimmten (vorkompilerten) Bytecode aus dem Cache abrufen.

Ein zentraler Vorteil von interpretierten Sprachen ist ihre Plattformunabhängigkeit. Außerdem ermöglichen interpretierte Sprachen User-Daten-Interaktionen und sind daher im Bereich der Datenanalyse sehr beliebt (siehe R und Python). Der Nachteil von Interpretersprachen liegt in der langsamen Ausführungsgeschwindigkeit der Programme.

Python

Python kombiniert die Eigenschaften von Compiler- und Interpretersprachen. Im Sinne einer Compilersprache agiert Python, indem es Quellcode zunächst in Bytecode übersetzt, bevor der Code prozessiert wird. Externe Python-Module liegen in der Regel sogar als kompilierter Code (pyc-Dateien) vor. Quellcode, welcher durch Prompt-Anweisung oder in Form von Quellcodedateien (py-Dateien) ausgeführt werden soll, muss dagegen noch (zur Laufzeit) kompiliert werden. Der entstandene Bytecode ist kompakter, schneller ausführbar und macht Python (ebenso wie andere interpretierte Sprachen) plattformunabhängig. Nach dem Kompilieren wird der Bytecode in einem zweiten Schritt in eine virtuelle Maschine, die sog. Python-Virtual-Machine, geladen und interpretiert.

In Python haben sich in verschiedenen Projekten unterschiedliche Compiler und Interpreter entwickelt. Hier eine kurze Übersicht einiger bekannter Projekte:

CPython

Hierbei handelt es sich um den Interpreter der Standarddistribution, welcher über www.python.org beziehbar ist.

Jython

Java-Implementierung von Python. Python ist mit Jython auf Java-Plattformen (Java-Virtual-Machine) ausführbar. Java-Bibliotheken können damit in Python verwendet werden. Nachteil: Python Bibliotheken im Bereich Scientific-Computing (Pandas, Numpy, Scikit-Learn) werden nicht unterstützt.

Cython

Cython ist ein Compiler-Projekt, welches die Integrationsfähigkeit von Python in C erhöht. Durch Cython wird Python Code nicht in Binärcode, sondern in C-Code übersetzt. Flaschenhälse im eigenen Code können mit diesem Compiler ausgedehnt werden, indem Funktionen in C ausgelagert werden.

PyPy

JIT-Compiler in Python. Seit Oktober 2017 werden numpy und pandas unterstütz. Scikit-learn allerdings noch nicht. Insgesamt ein vielversprechendes Projekt.