Инкрементный компилятор является своим родом дополнительных вычислений применительно к области компиляции . Вполне естественно, что в то время как обычные компиляторы выполняют так называемую чистую сборку , то есть (пере) компилируют все программные модули, инкрементный компилятор перекомпилирует только те части программы, которые были изменены.
Определение
Императивное программирование
В императивном программировании и разработке программного обеспечения инкрементный компилятор - это компилятор, который при вызове принимает только изменения известного набора исходных файлов и обновляет любые соответствующие выходные файлы (на целевом языке компилятора, часто байт-код ), которые могут уже существовать из предыдущих компиляций. . Эффективно опираясь на ранее скомпилированные выходные файлы, инкрементный компилятор избегает расточительной перекомпиляции всех исходных файлов, где большая часть кода остается неизменной. Для большинства инкрементальных компиляторов компиляция программы с небольшими изменениями в ее исходном коде обычно происходит почти мгновенно. Можно сказать, что инкрементный компилятор снижает степень детализации традиционных модулей компиляции языка, сохраняя при этом семантику языка , так что компилятор может добавлять и заменять более мелкие части.
Многие инструменты программирования используют преимущества инкрементных компиляторов, чтобы предоставить разработчикам гораздо более интерактивную среду программирования. Нет ничего необычного в том, что инкрементный компилятор вызывается для каждого изменения исходного файла, так что разработчик почти немедленно информируется о любых ошибках компиляции, которые могут возникнуть в результате его изменений в коде. Эта схема, в отличие от традиционной компиляции, значительно сокращает цикл разработки программистов, поскольку им больше не нужно ждать долгого процесса компиляции, прежде чем они будут проинформированы об ошибках.
Одним из недостатков этого типа инкрементного компилятора является то, что он не может легко оптимизировать код, который он компилирует, из-за локальности и ограниченного объема того, что изменяется. Обычно это не проблема, потому что оптимизация обычно выполняется только при выпуске , инкрементный компилятор будет использоваться на протяжении всей разработки, а стандартный пакетный компилятор будет использоваться при выпуске.
Интерактивное программирование
В парадигме интерактивного программирования , например, в литературе, связанной с Poplog , [1] и [2] интерактивный компилятор относится к компилятору, который фактически является частью системы времени выполнения исходного языка. Компилятор может быть вызван во время выполнения для некоторого исходного кода или структуры данных, управляемой программой, которая затем создает новый скомпилированный фрагмент программы, содержащий машинный код, который затем немедленно становится доступным для использования системой времени выполнения. Если вновь скомпилированный фрагмент заменяет предыдущую скомпилированную процедуру, старый будет обработан сборщиком мусора . Эта схема допускает определенную степень самомодифицируемого кода и требует функций языка метапрограммирования . Возможность добавлять, удалять и удалять код во время работы называется горячей заменой . Некоторые платформы интерактивного программирования смешивают использование интерпретируемого и скомпилированного кода, чтобы создать иллюзию, что любые изменения кода доступны для программы немедленно.
Список инкрементальных компиляторов
- Инкрементальные компиляторы для компиляции императивного языка
- Генератор среды программирования PECAN был инкрементным компилятором, разработанным Стивеном П. Рейссом в начале 1980-х годов. [3] [4]
- GNU Compiler Collection имеет ответвляется [5] ее развитие с IncrementalCompiler проекта, концентрируя в предоставлении C / C ++ с помощью быстрого инкрементного компилятора
- Eclipse , платформа имеет Java инкрементный компилятор включен в качестве части инструментальных средств разработки Java проекта [6]
- В IBM VisualAge C ++ компилятор 4.0 инкрементальный компилятор для C ++
- Embarcadero Delphi , ранее Borland Delphi
- .NET Compiler Platform (Кодовые Рослины) является открытым исходным кодом инкрементным компилятором для C # и Visual Basic .NET , и компилятор по умолчанию с Visual Studio 2015 года
- Ржавчина [7]
- Вперед [8]
- Инкрементальные компиляторы в интерактивных средах программирования и системах времени выполнения
- Poplog (его основной язык POP-11 и его предшественник POP-2 )
- Некоторые версии Lisp :
- Стальной банк Common Lisp
- Common Lisp Университета Карнеги-Меллона
- Scieneer Common Lisp
- GNU CLISP
- Franz Allegro Common Lisp
- Некоторые версии схемы :
- Икарус
- Chez Scheme
- Большинство версий Пролога :
- SWI-Prolog , Yap Prolog , XSB , Ciao
- Версии ML :
- Standard ML of New Jersey ( штаб-квартира Bell Labs находится в Нью-Джерси )
- Poplog ML
- Четвертый
- Kerridge KCML
- Цейлон красной шляпы
- Инкрементальный компилятор для функциональных языков
- OCaml
- Инструмент сборки Gradle имеет инкрементную компиляцию Java, начиная с версии 2.1. [9]
Смотрите также
- Динамическая компиляция
- Горячая замена # Программное обеспечение
Рекомендации
- ^ [1] Архивировано 5 января2008 г. в Wayback Machine , учебный курс по Poplog.
- ^ Статья Смита, Сломана и Гибсона 1992 ниже (теперь доступна в Интернете)
- ^ "Домашняя страница Стивена П. Рейсса" . Брауновский университет. 9 июня 2011. Архивировано 10 февраля 2013 года . Проверено 8 августа 2014 года .
- ^ Поппл, Джеймс (1987). Инкрементальная компиляция и ее реализация в генераторе среды программирования PECAN (PDF) (диплом с отличием). Австралийский национальный университет. Архивировано 15 августа 2014 года (PDF) . Проверено 8 марта 2013 года . Альтернативный URL Также доступен в Google Книгах .
- ^ [2] , было сделано объявление о начале ветви IncrementalCompiler GCC.
- ^ [3] , описание основного компонента JDT
- ^ [4]
- ^ [5]
- ^ [6] , примечания к выпуску Gradle версии 2.1
Внешние ссылки
- Журнал доктора Добба о создании инкрементального компилятора C ++
- Р. Смит, А. Сломан и Дж. Гибсон, поддержка двухуровневых виртуальных машин POPLOG для интерактивных языков, в Research Directions in Cognitive Science Volume 5: Artificial Intelligence, Eds. Д. Слиман и Н. Бернсен, Лоуренс Эрлбаум, 1992, стр. 203–231.