• Главная
  • Публикации
  • Языки программирования: интерпретаторы и компиляторы - наглядная разница

Языки программирования: интерпретаторы и компиляторы - наглядная разница

Ключевые слова: программирование, язык программирования, интерпретатор, компилятор, лекции по программированию

Автор: Приходько Максим Александрович

Говоря о языках программирования, каждый обязательно скажет о существовании двух принципиально разных классов языков - интерпретируемых и компилируемых. Однако, привести наглядный пример разницы между ними не потрудится, или просто не сможет. Не удалось бы до недавнего времени привести такой пример и мне, не наткнись я однажды на ошибку в одной из страниц сайта Системы "Аргус-М", приведшей в итоге к появлению этой статьи.

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

С другой стороны, программа на компилируемом языке сначала преобразуется с помощью компилятора в исполняемый файл (с расширением .exe), который затем и выполняется.

Исходя из вышесказанного, на "бытовом" уровне первое отличие можно сформулировать так:

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

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

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

На этом отличии остановимся подробнее и рассмотрим в качестве примера простейшую php-страницу, размещенную по адресу: www.argusm.com/unipo_cvsi.php (как известно, PHP - интерпретируемый язык)

Код страницы состоит всего из 4-х (четырех) строчек:

echo "start of the programm<br />";

if($x == 1)

unknown_function($x);

echo "<br />end of the programm";

Особенное внимание необходимо обратить на оператор сравнения, который в случае успеха (переменная x равна 1), вызывает неопределенную функцию, которая так и называется unknown_function ("неизвестная функция").

При непосредственном обращении по адресу страницы www.argusm.com/unipo_cvsi.php переменная x оказывается неопределенной, поэтому сравнение ложно, вызов функции не производится и мы "проходим" текст программы до самого конца, о чем свидетельствует следующий результат работы кода:

image

Обратимся теперь к странице по следующему адресу: www.argusm.com/unipo_cvsi.php?x=1. Фрагмент ?x=1 означает передачу "в переменную x" значения 1. В этом случае сравнение оказывается истинным, и происходит попытка вызова функции unknown_function, которая нигде в коде страницы не определена. Возникает ошибка и процесс интерпретации останавливается в этом месте:

image

Вряд ли такое поведение интерпретатора языка программирования PHP можно назвать "примерным". Поэтому, программируя на интерпретируемом языке, будьте вдвойне аккуратны - никто заранее не проверит за вас ошибки. В то же время, любой компилятор (например, C/C++) сразу же обратил бы внимание программиста на данную ошибку, не позволив ему создать исполняемый модуль, а главное - лишив его серьезных проблем поиска ошибки в случае, когда программа состоит не из 4, а, например, 44444 строк (описанный случай еще более неприятен тем, что ошибка "визуально" не выявляется, так как все команды сформулированы корректно).

Полный код страницы на языке PHP:

image

Файлы для скачивания

Все файлы
1 файла

Иллюстрация проблем интерпретатора

 

Иллюстрация проблем работы интерпретатора на примере языка PHP

Скачать! (n/a)

Загружен: 10.05.2008
Скачан: 404
Последний раз: 19.10.2011

Адаптивное тестирование - быстрая и точная оценка персонала
 

Другие статьи в рубрике