Nein - es ist durchaus möglich, dynamische Sprachen zu kompilieren.
Es gibt sogar einige dynamische Sprachen, die immer vom Design kompiliert werden (z. B. Clojure).
Die Frage berührt jedoch einen wichtigen verwandten Punkt: Obwohl dynamische Sprachen kompiliert werden können, ist es häufig so, dass dynamische Sprachen nicht zu Code kompiliert werden können, der so effizient ist wie eine statisch typisierte Sprache . Dies liegt daran, dass in dynamischen Sprachen einige inhärente Funktionen Laufzeitprüfungen erfordern, die in einer statisch kompilierten Sprache nicht erforderlich wären.
Ein Beispiel hierfür: Sprachen, die das Patchen von Objekten zur Laufzeit ermöglichen (z. B. Ruby), erfordern häufig, dass das Objekt beim Aufrufen einer Methode für das Objekt überprüft wird (mit einem Hashtable-Lookup oder ähnlichem). Selbst wenn dies kompiliert wird, muss der Compiler Code generieren, um die Methodensuche zur Laufzeit durchzuführen. In gewissem Maße unterscheidet sich diese Methodensuche nicht von dem, was ein Interpreter tun müsste.
Dies bedeutet einen erheblichen Mehraufwand im Vergleich zu einem Methodenaufruf in einer Sprache wie Java, in der die richtige Methode vom Compiler statisch aus der Klassendefinition ermittelt und auf einen einfachen Funktionsaufruf im systemeigenen Code reduziert werden kann.
Ich glaube, es ist mehr als alles andere dieser Effekt, der dazu führt, dass dynamische Sprachen im Durchschnitt langsamer arbeiten als ihre statisch kompilierten Gegenstücke. Wie Sie an den fehlerhaften Benchmarks sehen können , sind es die statisch typisierten Sprachen (C, Java, Fortran usw.), die am schnellsten mit den dynamischen Sprachen (Perl, Python, Ruby, PHP usw.) am Ende des Rankings abschneiden.