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