Компилятор: различия между версиями

[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Строка 72:
'''Раздельная компиляция''' ({{lang-en|separate compilation}}) — трансляция частей программы по отдельности с последующим объединением их [[компоновщик]]ом в единый загрузочный модуль.<ref name="Першиков"/>
 
Исторически особенностью компилятора, отражённой в его названии ({{lang-en|compile}} — собирать вместе, составлять), являлось то, что он производил как [[транслятор|трансляцию]], так и компоновку, при этом компилятор мог порождать сразу [[машинный код]]. Однако позже, с ростом сложности и размера программ (и увеличением времени, затрачиваемого на перекомпиляцию), возникла необходимость разделять программы на части и выделять [[Библиотека (программирование)|библиотеки]], которые можно компилировать независимо друг от друга. ПриВ процессе трансляции каждойпрограммы части программысам компилятор или вызываемый компилятором транслятор порождает [[объектный модуль]], содержащий дополнительную информацию, которая потом, при— в процессе компоновкекомпоновки частей в исполнимый модуль, используется для связывания и разрешения ссылок между частями программы. Раздельная компиляция также позволяет писать разные части исходного текста программы на разных языках программирования.
 
Появление раздельной компиляции и выделение компоновки как отдельной стадии произошло значительно позже создания компиляторов. В связи с этим вместо термина «компилятор» иногда используют термин «транслятор» как его синоним: либо в старой литературе, либо когда хотят подчеркнуть его способность переводить программу в машинный код (и наоборот, используют термин «компилятор» для подчёркивания способности собирать из многих файлов один). Вот только использование в таком контексте терминов «компилятор» и «транслятор» неправильно. Даже если компилятор выполняет трансляцию программы самостоятельно, поручая компоновку вызываемой внешней программе-компоновщику, такой компилятор не может считаться разновидностью транслятора, — транслятор выполняет трансляцию исходной программы и только. И уж тем более не являются трансляторами компиляторы вроде системной утилиты-компилятра '''[[make]]''', имеющейся во всех UNIX-системах. Утилита
 
Собственно утилита '''[[make]]''' — яркий пример довольно удачной реализации раздельной компиляции. Работа утилиты '''make''' управляется сценарием на интерпретируемым утилитой входном языке, известном как [[makefile]], содержащемся в задаваемом при запуске утилиты входном текстовом файле. Сама утилита не выполняет ни трансляцию ни компоновку, — де-факто утилита '''make''' функционирует как диспетчер процесса компиляции, организующий компиляцию программы в соответствии с заданным сценарием. В частности в ходе компиляции целевой программы утилита '''make''' вызывает трансляторы с языков программирования транслирующие разные части исходной программы в объектный код, и уже после этого вызывается тот или иной компоновщик, компонующий конечный исполняемый программный или библиотечный программный модуль. При этом разные части программы, оформляемые в виде отдельных файлов исходно текста, могут быть написаны как на одном языке программирования так и на разных языках программирования. В процессе перекомпиляции программы транслируются только измененные части-файлы исходного текста программы, в следствие чего длительность перекомпиляции программы значительно (порой на порядок) сокращается.
 
== История ==