stringtranslate.com

Динамическая компиляция

Динамическая компиляция — это процесс, используемый некоторыми реализациями языков программирования для повышения производительности во время выполнения программы. Хотя этот метод зародился в Smalltalk , [1] самым известным языком, использующим этот метод, является Java . Поскольку машинный код , создаваемый динамическим компилятором, создается и оптимизируется во время выполнения программы, использование динамической компиляции позволяет оптимизировать эффективность, недоступную для статически скомпилированных программ (т. е. программ, скомпилированных так называемым «пакетным компилятором», как написано ниже). ), за исключением дублирования кода или метапрограммирования .

В средах выполнения, использующих динамическую компиляцию, программы обычно выполняются медленно в течение первых нескольких минут, а затем большая часть компиляции и перекомпиляции выполняется и выполняется быстро. Из-за этой начальной задержки производительности динамическая компиляция в некоторых случаях нежелательна. В большинстве реализаций динамической компиляции некоторые оптимизации, которые можно было бы выполнить во время начальной компиляции, откладываются до дальнейшей компиляции во время выполнения , что приводит к дальнейшему ненужному замедлению работы. Компиляция «точно в срок» — это форма динамической компиляции.

Инкрементная компиляция

Близко связанный метод — инкрементная компиляция . Инкрементный компилятор используется в POP-2 , POP-11 , Forth , некоторых версиях Lisp , например Maclisp и по крайней мере в одной версии ML ( Poplog ML). Для этого необходимо , чтобы компилятор языка программирования был частью системы времени выполнения. Как следствие, исходный код может быть прочитан в любое время из терминала, из файла или, возможно, из структуры данных, созданной работающей программой, и преобразован в блок машинного кода или функцию (которая может заменить предыдущую функцию). с тем же именем), который затем сразу же доступен для использования программой. Из-за необходимости скорости компиляции во время интерактивной разработки и тестирования скомпилированный код, скорее всего, не будет так сильно оптимизирован, как код, создаваемый стандартным «пакетным компилятором», который считывает исходный код и создает объектные файлы, которые впоследствии можно скомпоновать. и беги. Однако инкрементально скомпилированная программа обычно работает намного быстрее, чем интерпретированная версия той же программы. Таким образом, инкрементальная компиляция обеспечивает сочетание преимуществ интерпретируемых и компилируемых языков. Для обеспечения переносимости обычно желательно, чтобы инкрементный компилятор работал в два этапа, а именно: сначала компилируется в какой-то промежуточный, независимый от платформы язык, а затем компилируется из него в машинный код для хост-машины. В этом случае для портирования требуется лишь изменить «внутренний» компилятор. В отличие от динамической компиляции, определенной выше, инкрементальная компиляция не предполагает дальнейшей оптимизации после первого запуска программы.

Смотрите также

Рекомендации

  1. ^ Питер Л. Дойч и Алан Шиффман. «Эффективная реализация системы Smalltalk-80», 11-й ежегодный симпозиум по принципам языков программирования, январь 1984 г., стр. 297-302.

Внешние ссылки