Динамическая компиляция
Выполнение программы |
---|
Общие понятия |
Типы кода |
Стратегии составления |
Известное время выполнения |
|
Известные компиляторы и наборы инструментов |
|
Динамическая компиляция — это процесс, используемый некоторыми реализациями языков программирования для повышения производительности во время выполнения программы. Хотя эта техника зародилась в Smalltalk , [1] Самый известный язык, использующий эту технику, — Java . Поскольку машинный код , создаваемый динамическим компилятором, создается и оптимизируется во время выполнения программы, использование динамической компиляции позволяет оптимизировать эффективность, недоступную для статически скомпилированных программ (т. е. программ, скомпилированных так называемым «пакетным компилятором», как написано ниже). ), за исключением дублирования кода или метапрограммирования .
В средах выполнения, использующих динамическую компиляцию, программы обычно работают медленно в течение первых нескольких минут, а затем большая часть компиляции и перекомпиляции выполняется и выполняется быстро. Из-за этой начальной задержки производительности динамическая компиляция в некоторых случаях нежелательна. В большинстве реализаций динамической компиляции некоторые оптимизации, которые можно было бы выполнить во время начальной компиляции, откладываются до дальнейшей компиляции во время выполнения , что приводит к дальнейшему ненужному замедлению работы. Компиляция «точно в срок» — это форма динамической компиляции.
Инкрементная компиляция [ править ]
Близко связанный метод — инкрементная компиляция . Инкрементный компилятор используется в POP-2 , POP-11 , Forth , некоторых версиях Lisp , например Maclisp и по крайней мере в одной версии ML ( Poplog ML).Для этого необходимо, чтобы компилятор языка программирования был частью системы времени выполнения. Как следствие, исходный код может быть прочитан в любое время из терминала, из файла или, возможно, из структуры данных, созданной работающей программой, и преобразован в блок машинного кода или функцию (которая может заменить предыдущую функцию). с тем же именем), который затем сразу же доступен для использования программой. Из-за необходимости обеспечения скорости компиляции во время интерактивной разработки и тестирования скомпилированный код, скорее всего, не будет так сильно оптимизирован, как код, создаваемый стандартным «пакетным компилятором», который считывает исходный код и создает объектные файлы, которые впоследствии можно скомпоновать. и беги. Однако инкрементально скомпилированная программа обычно работает намного быстрее, чем интерпретированная версия той же программы. Таким образом, инкрементная компиляция обеспечивает сочетание преимуществ интерпретируемых и компилируемых языков. Для облегчения переносимости обычно желательно, чтобы инкрементальный компилятор работал в два этапа, а именно: сначала компилируется в какой-то промежуточный, независимый от платформы язык, а затем компилируется из него в машинный код для хост-машины. В этом случае для портирования требуется только изменить компилятор «внутренней части». В отличие от динамической компиляции, определенной выше, инкрементальная компиляция не предполагает дальнейшей оптимизации после первого запуска программы.
См. также [ править ]
- Процессоры Transmeta динамически компилируют код x86 в код VLIW .
- Динамическая перекомпиляция
- Сборка «точно в срок»
Ссылки [ править ]
- ^ Питер Л. Дойч и Алан Шиффман. «Эффективная реализация системы Smalltalk-80», 11-й ежегодный симпозиум по принципам языков программирования, январь 1984 г., стр. 297-302.
Внешние ссылки [ править ]
- Проект динамической компиляции UW
- Эмуляция архитектуры посредством динамической компиляции
- SCIRun
- Статья « Динамическая компиляция, отражение и настраиваемые приложения » Дэвида Б. Скофилда и Эрика Бергман-Террелла
- Статья « Высокопроизводительный XML: компиляция динамических выражений XPath » Дэниела Каззулино
- Мэтью Р. Арнольд , Стивен Финк , Дэвид П. Гроув , Майкл Хинд и Питер Ф. Суини , Обзор адаптивной оптимизации виртуальных машин , Труды IEEE, 92 (2), февраль 2005 г., страницы 449–466.