Динамічна компіляція
Динамічна компіляція — процес, що використовується деякими реалізаціями мов програмування для підвищення продуктивності протягом виконання програми. Хоча техніка походить із Self, найвідомішою мовою, що використовує цю техніку, є Java. Оскільки машинний код, який видає динамічний компілятор, конструюється й оптимізується під час виконання програми, то використання динамічної компіляції дозволяє оптимізації ефективності, недоступні статично скомпільованим програмам (тобто скомпільованим так званим «пакетним компілятором», як написано нижче), за винятком дублювання коду чи метапрограмування.
Виконання програми |
---|
Загальні поняття |
|
Типи програмного коду |
Стратегії компіляції |
|
Середовища виконання |
|
Важливі компілятори і інструменти |
|
У середовищах часу виконання, що використовують динамічну компіляцію, як правило, програми працюють повільно перші кілька хвилин, а після здійснення більшості компіляцій і перекомпіляцій — швидше. Через це початкове відставання продуктивності, динамічна компіляція є небажаною в певних випадках. У більшості реалізацій динамічної компіляції, деякі оптимізації, що можуть бути зроблені під час початкової компіляції, затримуються до подальшої компіляції під час виконання, спричинюючи подальші непотрібні уповільнення. JIT-компіляція є формою динамічної компіляції.
Покрокова компіляція
Близько пов'язана техніка — покрокова компіляція. Покроковий компілятор використовується у POP-2, POP-11, Forth, деяких версіях мови Lisp, зокрема Maclisp і щонайменше одній версії мови програмування ML (Poplog ML).
Це вимагає від компілятора мови програмування бути частиною системи часу виконання. Як наслідок, початковий код може бути прочитаний у будь-який час із терміналу, файлу чи, можливо, структури даних, сконструйованою запущеною програмою, та транслюється у блок або функцію машинного коду (яка може замінити однойменну попередню функцію), яка потім негайно доступна для використання програмою. Через потребу для швидкості компіляції протягом інтерактивної розробки та тестування, скомпільований код, скоріше за все, не настільки сильно оптимізований за код, вироблений стандартним «пакетним компілятором», який читає початковий код і виробляє об'єктні файли, які в подальшому можуть компонуватися та запускатися. Проте, покроково скомпільовані програми, як правило, працюватимуть набагато швидше за інтерпретовану версію тієї ж програми. Таким чином, покрокова компіляція забезпечує суміш переваг інтерпретованих і компільованих мов. Задля портативності покроковому компілятору зазвичай бажано працювати у два етапи: спочатку компілюючи в деяку проміжну платформонезалежну мову, а потім компілюючи з неї у машинний код для хост-машини. У цьому випадку портування вимагає лише зміни «заднього» компілятора. На відміну від динамічної компіляції, як визначено вище, покрокова компіляція не передбачає подальших оптимізацій після першого запуску програми.
Див. також
- Процесори Transmeta динамічно компілюють код x86 у код VLIW.
- Динамічна перекомпіляція
- JIT-компіляція
Посилання
- The UW Dynamic Compilation Project
- Architecture Emulation through Dynamic Compilation
- SCIRun
- Article «Dynamic Compilation, Reflection, & Customizable Apps» by David B. Scofield and Eric Bergman-Terrell
- Article «High-performance XML: Dynamic XPath expressions compilation» by Daniel Cazzulino
- Matthew R. Arnold, Stephen Fink, David P. Grove, Michael Hind, and Peter F. Sweeney, A Survey of Adaptive Optimization in Virtual Machines, Proceedings of the IEEE, 92(2), February 2005, Pages 449—466.