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

Динамическая компиляция это процесс, используемый некоторыми язык программирования реализации для повышения производительности во время выполнения программы. Хотя техника зародилась в Я,[нужна цитата ] самый известный язык, использующий эту технику, - Ява. Поскольку машинный код, генерируемый динамическим компилятором, создается и оптимизируется во время выполнения программы, использование динамической компиляции позволяет оптимизировать эффективность, недоступную для скомпилированных программ, кроме как через дублирование кода или метапрограммирование.

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

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

Близко родственная техника инкрементная компиляция. An инкрементный компилятор используется в ПОП-2, ПОП-11, Четвертый, некоторые версии Лисп, например Маклисп и хотя бы одна версия Язык программирования ML (Поплог ML) .Для этого требуется компилятор чтобы язык программирования был частью системы времени выполнения. Как следствие, исходный код может быть прочитан в любое время с терминала, из файла или, возможно, из структуры данных, созданной запущенной программой, и переведен в блок или функцию машинного кода (которая может заменить предыдущую функцию с тем же именем), который затем сразу становится доступным для использования программой. Из-за необходимости скорости компиляции во время интерактивной разработки и тестирования скомпилированный код, вероятно, не будет так сильно оптимизирован, как код, созданный стандартным «пакетным компилятором», который считывает исходный код и создает объектные файлы, которые впоследствии могут быть связаны. и беги. Однако инкрементально скомпилированная программа обычно работает намного быстрее, чем интерпретируемая версия той же программы. Таким образом, инкрементальная компиляция обеспечивает сочетание преимуществ интерпретируемых и компилируемых языков. Для обеспечения переносимости обычно желательно, чтобы инкрементный компилятор работал в два этапа, а именно сначала компилировался на некоторый промежуточный платформенно-независимый язык, а затем компилировался из этого в машинный код для хост-машины. В этом случае для переноса требуется только изменить "бэкэнд" компилятор. В отличие от динамической компиляции, как определено выше, инкрементная компиляция не требует дальнейшей оптимизации после первого запуска программы.

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

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