В информатике заблаговременная компиляция ( компиляция AOT ) - это процесс компиляции (часто) языка программирования более высокого уровня в (часто) язык более низкого уровня перед выполнением программы, обычно во время сборки, чтобы уменьшить объем работы, которую необходимо выполнить во время выполнения .
Чаще всего это связано с процессом компиляции языка программирования более высокого уровня, такого как C или C ++ , или промежуточного представления, такого как байт-код Java или кода Common Intermediate Language (CIL) .NET Framework , в собственный (системно-зависимый ) машинный код, чтобы полученный двоичный файл мог выполняться нативно, как стандартный нативный компилятор. Когда используется в данном конкретном контексте, он часто рассматривается как противоположность точно в срок (JIT) компиляции.
Говоря в более общем плане, целевые языки компиляции AOT не обязательно специфичны для собственного машинного кода, а определяются довольно произвольно. В некоторых научных статьях это слово используется для обозначения процесса компиляции байт-кода Java в C [1] или времени выполнения конвейера оптимизации. [2] В академическом проекте [3] это слово используется для обозначения действия по предварительной компиляции JavaScript в машинно-зависимый оптимизированный IR для V8 (движок JavaScript) [4] и в машинно-независимый байт-код для JavaScriptCore . [5] В некоторых реализациях промышленного языка (например, Closure [6] и движок Hermes JavaScript [7] ) это слово используется для обозначения действия по предварительной компиляции исходного языка в конкретный байт-код виртуальной машины. Angular (веб-фреймворк) использует это слово для обозначения преобразования своего HTML- шаблона и TypeScript в JavaScript . [8]
Фактически, поскольку вся статическая компиляция технически выполняется заранее, эта конкретная формулировка часто используется, чтобы подчеркнуть некоторые преимущества в производительности от акта такой предварительной компиляции. Акт компиляции Java в байт-код Java поэтому редко называют AOT, поскольку обычно это требование, а не оптимизация.
Сниженные накладные расходы времени выполнения
Некоторые языки программирования с управляемым кодом выполнения , которые могут быть собраны в промежуточное представление, использовать только в срок (JIT) компиляции. Это, вкратце, компилирует промежуточный код в машинный код для собственного запуска во время выполнения промежуточного кода, что может снизить производительность приложения. Компиляция с опережением времени устраняет необходимость в этом шаге, поскольку выполняется перед выполнением, а не во время выполнения.
Опережающая компиляция динамически типизированных языков в машинный код или другой статический байт-код виртуальной машины возможна только в ограниченном количестве случаев. [ необходима цитата ] Например, компилятор AOT High Performance Erlang Project (HiPE) для языка Erlang может это сделать благодаря передовым методам восстановления статических типов и предположениям о типах.
В большинстве ситуаций с полностью скомпилированными программами и библиотеками AOT можно отбросить полезную часть среды выполнения , тем самым сэкономив дисковое пространство, память, время автономной работы и время запуска (без фазы разогрева JIT) и т. Д. Из-за этого, он может быть полезен во встроенных или мобильных устройствах.
Компромиссы производительности
Компиляторы AOT могут выполнять сложную и расширенную оптимизацию кода , что в большинстве случаев JITing будет считаться слишком дорогостоящим. Напротив, AOT обычно не может выполнять некоторые оптимизации, возможные в JIT, такие как оптимизация на основе профиля времени выполнения (PGO), распространение псевдоконстант или косвенное встраивание виртуальных функций . AOT должен компилироваться в целевую архитектуру, в то время как JIT может скомпилировать код, чтобы наилучшим образом использовать фактический процессор, на котором он работает, даже спустя годы после выпуска программного обеспечения.
Кроме того, JIT-компиляторы могут теоретически оптимизировать горячий код, делая предположения о коде. Сгенерированный код можно деоптимизировать, если спекулятивное предположение позже окажется неверным. Такая операция снижает производительность работающего программного обеспечения до тех пор, пока код снова не будет оптимизирован с помощью адаптивной оптимизации . Компилятор AOT не может делать такие предположения и должен вывести как можно больше информации во время компиляции. Он должен прибегать к менее специализированному коду, потому что он не может знать, какие типы будут проходить через метод. Такие проблемы можно решить с помощью оптимизации на основе профиля. Но даже в этом случае сгенерированный код не может быть динамически адаптирован к изменяющемуся профилю времени выполнения, как это сделал бы JIT-компилятор.
Компромиссы при хранении
Смотрите также
- компилятор asm.js ( JavaScript )
- Барток ( CIL )
- Excelsior JET ( Java )
- Компилятор GNU для Java
- IL2CPU (CIL)
- Генератор собственных изображений (CIL)
- RubyMotion ( Рубин )
- SharpOS AOT (CIL)
Рекомендации
- ↑ Юнг, Донг-Хон; Пак, Чон Кук; Пэ, Сон-Хван; Ли, Джаемок; Мун, Су-Мук (22 октября 2006 г.). «Эффективная обработка исключений в опережающем компиляторе Java bytecode-to-c для встроенных систем» . Материалы 6-й Международной конференции ACM & IEEE по встроенному программному обеспечению . EMSOFT '06. Сеул, Корея: Ассоциация вычислительной техники: 188–194. DOI : 10.1145 / 1176887.1176915 . ISBN 978-1-59593-542-7.
- ^ Чемберс, Крейг (2002-01-14). «Постановочная компиляция» . Труды семинара ACM SIGPLAN 2002 г. по частичной оценке и манипулированию программами на основе семантики . PEPM '02. Портленд, Орегон: Ассоциация вычислительной техники: 1–8. DOI : 10.1145 / 503032.503045 . ISBN 978-1-58113-455-1.
- ^ Жуйков, Р .; Шарыгин, Е. (01.01.2017). «Опережающая компиляция программ JavaScript» . Программирование и софт . 43 (1): 51–59. DOI : 10.1134 / S036176881701008X . ISSN 1608-3261 .
- ^ ispras / v8-aotc , Институт системного программирования им. Иванникова Российской академии наук, 2021-01-30 , получено 2021-03-17
- ^ ispras / webkit-aotc , Институт системного программирования им. Иванникова РАН, 2021-01-30 , получено 2021-03-17
- ^ «Clojure - опережающая компиляция и создание классов» . clojure.org . Проверено 17 марта 2021 .
- ^ «Гермес: новый движок JavaScript с открытым исходным кодом, оптимизированный для мобильных приложений» . Facebook Engineering . 2019-07-12 . Проверено 17 марта 2021 .
- ^ «Угловой» . angular.io . Проверено 17 марта 2021 .
Внешние ссылки
- Скорость: NGen повышает вашу производительность с помощью новых мощных функций - MSDN Magazine, апрель 2005 г.
- Моно AOT
- Excelsior JET - сертифицированная реализация Java SE с компилятором AOT
- Компилятор GNU для Java
- AOT-компиляция asm.js
- Java в реальном времени, часть 2: Сравнение методов компиляции - IBM developerWorks, апрель 2007 г.
- Улучшение производительности Swing: JIT против компиляции AOT - LinuxWorld Magazine, ноябрь 2004 г.
- Манта