Die Leistung von praktisch jedem Programm wird verbessert, wenn es kompiliert, mit Profiling ausgeführt wird und die Ergebnisse für einen zweiten Durchlauf in den Compiler zurückgespielt werden. Die Codepfade, die tatsächlich verwendet werden, werden aggressiver optimiert, die Schleifen werden auf genau den richtigen Grad abgerollt, und die heißen Befehlspfade werden angeordnet, um I $ Treffer zu maximieren.
Alle guten Sachen, aber es ist fast nie getan, weil es nervig ist, so viele Schritte zu durchlaufen, um eine Binärdatei zu erstellen.
Dies ist der Vorteil, wenn Sie den Bytecode einige Zeit ausführen, bevor Sie ihn in nativen Code kompilieren: Profilinformationen sind automatisch verfügbar. Das Ergebnis nach der Just-In-Time-Kompilierung ist hoch optimierter nativer Code für die spezifischen Daten, die das Programm verarbeitet.
Die Möglichkeit, den Bytecode auszuführen, ermöglicht auch eine aggressivere native Optimierung, als ein statischer Compiler sicher verwenden könnte. Wenn zum Beispiel angegeben wird, dass eines der Argumente für eine Funktion immer NULL ist, kann die gesamte Behandlung für dieses Argument einfach aus dem systemeigenen Code weggelassen werden. Es wird eine kurze Gültigkeitsprüfung der Argumente in dem Funktionsprolog geben, wenn dieses Argument nicht NULL ist, bricht die VM zurück zu dem Bytecode ab und startet das Profilieren erneut. Hier
4 Jahre später ... Portabilität: Compiler, die nativen Code erzeugen, können wie gc kompilieren (der offizielle [Go] (http://golang.org/) Compiler), was es so einfach macht. Sicherheit: [Native Client] (https://developers.google.com/native-client/) führt nativen Code in einer Sandbox aus, wodurch die Berechtigungen eingeschränkt werden. Größe: Selten ein Thema heutzutage, auch für mobile Geräte. –
@Zippoxer Was ist mit den vier Jahren? Cross-Compilation ist ein sehr altes Konzept. Sie müssen den Code jedoch für jede Plattform separat kompilieren. Virtualisierung ist auch kein neues Konzept, aber die Virtualisierung von Code, der für die native Ausführung geschrieben wurde, ist nicht dasselbe wie der virtualisierte Code, der speziell für die Ausführung in einer Sandbox entwickelt wurde. Was die Größe anbelangt, würde ich den Java-Bytecode CISC überhaupt nicht nennen. Das gleiche gilt für CIL. – Malcolm