Python hat einen Compiler! Man merkt es einfach nicht, weil es automatisch läuft. Sie können jedoch feststellen, dass es vorhanden ist: Sehen Sie sich die Dateien an .pyc
(oder .pyo
prüfen Sie, ob das Optimierungsprogramm aktiviert ist), die für die von Ihnen erstellten Module erstellt wurden import
.
Außerdem wird es nicht mit dem Code des nativen Computers kompiliert. Stattdessen wird ein Bytecode kompiliert, der von einer virtuellen Maschine verwendet wird. Die virtuelle Maschine selbst ist ein kompiliertes Programm. Dies ist der Funktionsweise von Java sehr ähnlich. In der Tat so ähnlich, dass es eine Python-Variante ( Jython ) gibt, die stattdessen mit dem Byte-Code der Java Virtual Machine kompiliert wird! Es gibt auch IronPython , das mit Microsofts CLR (von .NET verwendet) kompiliert wird. (Der normale Python-Bytecode-Compiler wird manchmal als CPython bezeichnet, um ihn von diesen Alternativen zu unterscheiden.)
C ++ muss seinen Kompilierungsprozess offenlegen, da die Sprache selbst unvollständig ist. Es gibt weder alles an, was der Linker wissen muss, um Ihr Programm zu erstellen, noch können Kompilierungsoptionen portabel angegeben werden (einige Compiler lassen dies zu #pragma
, aber das ist kein Standard). Also musst du den Rest der Arbeit mit Makefiles und möglicherweise Auto Hell (autoconf / automake / libtool) machen. Dies ist wirklich nur ein Überbleibsel von dem, was C getan hat. Und C hat es so gemacht, weil es den Compiler einfach gemacht hat, was ein Hauptgrund dafür ist, dass er so beliebt ist (jeder konnte in den 80ern einen einfachen C-Compiler entwickeln).
Einige Dinge, die sich auf den Compiler- oder Linker-Betrieb auswirken können, jedoch nicht in der C- oder C ++ - Syntax angegeben sind:
- Abhängigkeitsauflösung
- Anforderungen an externe Bibliotheken (einschließlich Abhängigkeitsreihenfolge)
- Optimierungsstufe
- Warnungseinstellungen
- Sprachspezifikation Version
- Linkerzuordnungen (welcher Abschnitt wohin im endgültigen Programm führt)
- Zielarchitektur
Einige davon können erkannt, aber nicht angegeben werden. Ich kann z. B. feststellen, welches C ++ verwendet wird __cplusplus
, aber ich kann nicht angeben, dass C ++ 98 für meinen Code innerhalb des Codes selbst verwendet wird. Ich muss es als Flag an den Compiler im Makefile übergeben oder eine Einstellung in einem Dialog vornehmen.
Während Sie vielleicht denken, dass im Compiler ein "Abhängigkeitsauflösungssystem" existiert, das automatisch Abhängigkeitsdatensätze generiert, geben diese Datensätze nur an, welche Header-Dateien eine bestimmte Quelldatei verwendet. Sie können nicht angeben, welche zusätzlichen Quellcodemodule zum Verknüpfen mit einem ausführbaren Programm erforderlich sind, da es in C oder C ++ keine Standardmethode gibt, die angibt, dass eine bestimmte Headerdatei die Schnittstellendefinition für ein anderes Quellcodemodul ist, und nicht nur eine Reihe von Zeilen, die an mehreren Stellen angezeigt werden sollen, damit Sie sich nicht wiederholen. Es gibt Traditionen in Dateinamenskonventionen, aber diese sind dem Compiler und Linker nicht bekannt oder werden von ihm nicht erzwungen.
Einige davon können mit eingestellt werden #pragma
, aber dies ist kein Standard, und ich habe vom Standard gesprochen. All diese Dinge könnten durch eine Norm spezifiziert werden, waren jedoch nicht im Interesse der Abwärtskompatibilität. Die vorherrschende Weisheit ist, dass Makefiles und IDEs nicht kaputt sind, also reparieren Sie sie nicht.
Python erledigt dies alles in der Sprache. Gibt beispielsweise import
eine explizite Modulabhängigkeit an, impliziert den Abhängigkeitsbaum und Module werden nicht in Header- und Quelldateien (dh Schnittstelle und Implementierung) aufgeteilt.