Vorzeitige Zusammenstellung - Ahead-of-time compilation

In der Informatik - Voraus-Kompilierung ( AOT Kompilierung ) ist der Akt der Zusammenstellung eine (oft) geordneten Programmiersprache in eine (oft) niedrigerer Ebene Sprache vor der Ausführung eines Programm, in der Regel bei Build-Zeit, zu Reduzieren Sie den Arbeitsaufwand zur Laufzeit .

Meistens wird es mit dem Kompilieren einer höheren Programmiersprache wie C oder C++ oder einer Zwischendarstellung wie Java-Bytecode oder .NET Framework Common Intermediate Language (CIL)-Code in eine native (systemabhängige) ) Maschinencode, sodass die resultierende Binärdatei nativ ausgeführt werden kann, genau wie ein standardmäßiger nativer Compiler. Wenn es in diesem speziellen Kontext verwendet wird, wird es oft als Gegenteil von Just-in-Time- Kompilierung (JIT) angesehen.

Allgemeiner ausgedrückt sind die Zielsprachen einer AOT-Kompilierung nicht unbedingt spezifisch für nativen Maschinencode, sondern eher willkürlich definiert. Einige wissenschaftliche Arbeiten verwenden dieses Wort, um den Java-Bytecode in C zu kompilieren oder den Zeitpunkt, zu dem die Optimierungspipeline ausgeführt wird. In einem akademischen Projekt bedeutet dieses Wort das Vorkompilieren von JavaScript zu einem maschinenabhängig optimierten IR für V8 (JavaScript-Engine) und zu einem maschinenunabhängigen Bytecode für JavaScriptCore . Einige industrielle Sprachimplementierungen (z. B. Closure- und Hermes- JavaScript-Engine ) verwenden dieses Wort, um die Quellsprache auf VM-spezifischen Bytecode vorkompilieren zu lassen. Angular (Web Framework) verwendet dieses Wort, um seine HTML- Vorlage und TypeScript in JavaScript zu konvertieren .

Da alle statischen Kompilierungen technisch im Voraus durchgeführt werden, wird dieser spezielle Wortlaut häufig verwendet, um einige Leistungsvorteile hervorzuheben, die sich aus einer solchen Vorkompilierung ergeben. Das Kompilieren von Java in Java-Bytecode wird daher selten als AOT bezeichnet, da es normalerweise eine Anforderung und keine Optimierung ist.

Reduzierter Laufzeit-Overhead

Einige Programmiersprachen mit einer verwalteten Codelaufzeit, die zu einer Zwischendarstellung kompiliert werden kann, verwenden die Just-in-Time- Kompilierung (JIT). Dies kompiliert, kurz gesagt, Zwischencode in Maschinencode für eine native Ausführung, während der Zwischencode ausgeführt wird, was die Leistung einer Anwendung verlangsamen kann. Durch das Kompilieren im Voraus entfällt die Notwendigkeit für diesen Schritt, da er vor der Ausführung und nicht während der Ausführung erfolgt.

Das vorzeitige Kompilieren dynamisch typisierter Sprachen in nativen Maschinencode oder anderen statischen VM-Bytecode ist nur in einer begrenzten Anzahl von Fällen möglich. Beispielsweise kann der AOT-Compiler des High Performance Erlang Project (HiPE) für die Sprache Erlang dies aufgrund fortschrittlicher statischer Typrekonstruktionstechniken und Typspekulationen tun.

In den meisten Situationen mit vollständig AOT-kompilierten Programmen und Bibliotheken ist es möglich, einen nützlichen Teil einer Laufzeitumgebung zu löschen , wodurch Speicherplatz, Arbeitsspeicher, Batterielebensdauer und Startzeiten (keine JIT-Aufwärmphase) usw. gespart werden. es kann in eingebetteten oder mobilen Geräten nützlich sein.

Leistungskompromisse

AOT-Compiler können komplexe und erweiterte Codeoptimierungen durchführen , die in den meisten Fällen von JITing als viel zu kostspielig angesehen werden. Im Gegensatz dazu kann einige Optimierungen in der Regel nicht durchführt AOT möglich in JIT, wie Laufzeit - Profil-geführte Optimierung (PGO), pseudo- Konstantenpropagation oder indirekt- virtuelle Funktion inlining . AOT muss zu einer Zielarchitektur kompiliert werden, während eine JIT den Code kompilieren kann, um die tatsächliche CPU, auf der sie ausgeführt wird, auch Jahre nach der Veröffentlichung der Software optimal zu nutzen.

Darüber hinaus können JIT-Compiler Hot-Code spekulativ optimieren, indem sie Annahmen zum Code treffen. Der generierte Code kann deoptimiert werden, wenn sich später eine spekulative Annahme als falsch herausstellt. Ein solcher Vorgang verlangsamt die Leistung der laufenden Software, bis der Code durch adaptive Optimierung erneut optimiert wird . Ein AOT-Compiler kann solche Annahmen nicht treffen und muss zur Kompilierzeit so viele Informationen wie möglich ableiten. Es muss auf weniger spezialisierten Code zurückgreifen, da es nicht wissen kann, welche Typen eine Methode durchlaufen. Solche Probleme können durch profilgesteuerte Optimierungen behoben werden. Aber auch in diesem Fall kann der generierte Code nicht dynamisch an das sich ändernde Laufzeitprofil angepasst werden, wie dies ein JIT-Compiler tun würde.

Kompromisse bei der Speicherung

Siehe auch

Verweise

Externe Links