Компилируемые и интерпретируемые языки

До сих пор мы говорили о том, что программу, написанную на высокоуровневом языке, перед выполнением следует откомпилировать, т. е. перевести на машинный язык, состоящий из двух знаков, соответствующих двум устойчивым состояниям. Компилятор – это тоже компьютерная программа, на вход которой подается файл с исходным текстом, написанным на языке высокого уровня. Этот файл во многих операционных системах называется исходным модулем (source module). Компилятор переводит программу на машинный язык и записывает ее в другой файл, называемый объектным модулем (object module).

Содержимое объектного модуля в самых простых случаях можно загрузить в оперативную память и выполнить. Но чаще всего объектный модуль перед выполнением необходимо еще скомпоновать (link) с другими объектными модулями, содержащие дополнительные модули программы, системные функции, служебные сведения и прочие данные, необходимые для выполнения программы.

Компоновку выполняет специальная программа, так и называемая «компоновщиком» (linker) или редактором связей. На ее вход подаются файлы с объектными модулями, а на выходе получается исполнимый модуль (executable module) – файл с полностью готовой к выполнению программой. Этот файл загружается в оперативную память и выполняется.ch

Очень часто компиляцию и компоновку объединяют в одно действие. Для этого компилятору дается специальное указание, и он сразу же после своей работы сам вызывает компоновщик. Программисту все это представляется единым процессом, только на экране дисплея появляются сообщения об окончании компиляции и начале компоновки.

Все описанное выше характерно для компилируемых языков программирования. Другой класс языков, составляющих интерпретируемые языки программирования, не требующие компиляции и компоновки. Это тоже языки высокого уровня, поэтому программы, написанные на них, часто называемые скриптами (script) или сценариями, требуют перевода на машинный язык. Для этого создается программа-интерпретатор операторов, записанных в программе. В отличие от компилятора программа-интерпретатор переводит на машинный язык не весь текст целиком, а каждый оператор по отдельности, и тут же выполняет полученный машинный код.

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

Тем не менее, интерпретируемые языки широко распространены из-за удобства создания программ с их помощью. Программу можно написать и сразу выполнять без предварительных преобразований. Если работа программы кажется неудовлетворительной, то ее текст можно изменить и тут же выполнить программу заново без всякой перекомпиляции.

В современном программировании разница между компилируемыми и интерпретируемыми языками стирается. Это слияние происходит по двум направлениям. С одной стороны, для интерпретируемых языков создаются компиляторы. Классическим интерпретируемым языком всегда считался язык BASIC, но сейчас для него написано много компиляторов. У программиста есть выбор. Программу, написанную на BASIC, можно интерпретировать и сразу выполнить, а можно предварительно откомпилировать в исполнимый модуль и выполнить в другое, более удобное время.

С другой стороны, интерпретаторы научились сохранять машинный код уже проинтерпретированных и выполненных операторов. При повторном выполнении этих операторов, например, в циклах, интерпретатор использует готовые машинные команды, что значительно ускоряет работу. Такие интерпретаторы называются JIT-интерпретаторами (Just-In-Time). Они работают значительно быстрее классических интерпретаторов и поэтому приобретают все большее распространение.

Машинные команды



Rambler's Top100