Jump to content

Предварительная компиляция

В информатике предварительная компиляция ( 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-компилятор.

Компромиссы при хранении [ править ]

См. также [ править ]

Ссылки [ править ]

  1. ^ Юнг, Донг-Хон; Пак, Чон Кук; Пэ, Сон Хван; Ли, Джаемок; Мун, Су-Мук (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 .
  2. ^ Чемберс, Крейг (14 января 2002 г.). «Поэтапная компиляция» . Материалы семинара ACM SIGPLAN 2002 года по частичной оценке и манипулированию программами на основе семантики . ПЭПМ '02. Портленд, Орегон: Ассоциация вычислительной техники. стр. 1–8. дои : 10.1145/503032.503045 . ISBN  978-1-58113-455-1 . S2CID   18546907 .
  3. ^ Жуйков Р.; Шарыгин, Е. (01.01.2017). «Предварительная компиляция программ на JavaScript» . Программирование и компьютерное программное обеспечение . 43 (1): 51–59. дои : 10.1134/S036176881701008X . ISSN   1608-3261 . S2CID   2338849 .
  4. ^ ispras/v8-aotc , Институт системного программирования им. Иванникова РАН, 30 января 2021 г. , получено 17 марта 2021 г.
  5. ^ ispras/webkit-aotc , Институт системного программирования имени Иванникова РАН, 30 января 2021 г. , получено 17 марта 2021 г.
  6. ^ «Clojure — опережающая компиляция и генерация классов» . Clojure.org . Проверено 17 марта 2021 г.
  7. ^ «Гермес: новый движок JavaScript с открытым исходным кодом, оптимизированный для мобильных приложений» . Фейсбук Инжиниринг . 12 июля 2019 г. Проверено 17 марта 2021 г.
  8. ^ «Угловой» . angular.io . Проверено 17 марта 2021 г.

Внешние ссылки [ править ]

Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 0d95f5c3563e2bb55c349b5d54e94348__1705145160
URL1:https://arc.ask3.ru/arc/aa/0d/48/0d95f5c3563e2bb55c349b5d54e94348.html
Заголовок, (Title) документа по адресу, URL1:
Ahead-of-time compilation - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)