В информатике опережающая компиляция (компиляция AOT ) - это акт компиляции высокоуровневый язык программирования, такой как C или C ++, или промежуточное представление, такое как байт-код Java или .NET Framework код Common Intermediate Language (CIL) в собственный (системно-зависимый) машинный код, чтобы полученный двоичный файл мог выполняются изначально.
AOT производит машинно-оптимизированный код, как и стандартный собственный компилятор. Разница в том, что AOT преобразует байт-код существующей виртуальной машины (VM) в машинный код.
В некоторых языках программирования с управляемым кодом время выполнения, которое может быть скомпилировано в промежуточное представление, используют just-in- время (JIT) компиляция. Это, вкратце, компилирует промежуточный код в машинный код для собственного запуска во время выполнения промежуточного кода, что может снизить производительность приложения. Компиляция с опережением времени устраняет необходимость в этом шаге, поскольку выполняется перед выполнением, а не во время выполнения.
Опережающая компиляция для динамически типизированных языков в собственный машинный код или другой статический байт-код виртуальной машины возможна только в ограниченном количестве случаев. Например, компилятор AOT High Performance Erlang Project (HiPE) для языка Erlang может это сделать благодаря передовым методам восстановления статических типов и предположениям о типах.
В большинстве ситуаций с полностью скомпилированными программами и библиотеками AOT можно отбросить полезную часть среды выполнения, тем самым сэкономив дисковое пространство, память, время автономной работы и время запуска ( нет фазы разогрева JIT) и т. д. Благодаря этому он может быть полезен во встроенных или мобильных устройствах.
Компиляторы AOT могут выполнять сложный и расширенный код оптимизации, что в большинстве случаев JITing будет считаться слишком дорогостоящим. Напротив, AOT обычно не может выполнять некоторые оптимизации, возможные в JIT, такие как оптимизация времени выполнения на основе профиля (PGO), псевдо- распространение констант или косвенная- виртуальная функция встраивание. AOT должен компилироваться в целевую архитектуру, в то время как JIT может скомпилировать код, чтобы наилучшим образом использовать фактический процессор, на котором он работает, даже через годы после выпуска программного обеспечения.
Кроме того, JIT-компиляторы могут теоретически оптимизировать горячий код, делая предположения о коде. Сгенерированный код можно деоптимизировать, если спекулятивное предположение позже окажется неверным. Такая операция снижает производительность работающего программного обеспечения до тех пор, пока код снова не будет оптимизирован с помощью адаптивной оптимизации. Компилятор AOT не может делать такие предположения и должен вывести как можно больше информации во время компиляции. Он должен прибегать к менее специализированному коду, потому что он не может знать, какие типы будут проходить через метод. Такие проблемы можно решить с помощью оптимизации на основе профиля. Но даже в этом случае сгенерированный код не может быть динамически адаптирован к изменяющемуся профилю времени выполнения, как это сделал бы JIT-компилятор.