Компиляторы и интерпретаторы – постоянные спутники программистов, хотя некоторыми из этих программ пользуются каждый день обычные пользователи, не подозревая об этом. Речь, конечно, в этом случае идет о скриптовых языках, встроенных в Windows и множество офисных программ. Но «настоящие» компиляторы – инструмент суровых программистов.
Можно знать, а можно и не знать о том, что почти все программы сейчас пишутся на языках высокого уровня. Текст программы при большом желании можно прочитать, а при еще большем – даже понять, так как все команды в ней представлены обычно английскими словами или их словосочетаниями. Так, команда «for» в Паскале, Си или Бейсике позволяет организовать цикл выполнения некоего блока команд – «для i:=1 до 10 делать <блок операторов>». Не сильно наглядно, но ясно, что здесь 10 раз выполнится некий блок операторов. Эта «понятность» нужна только людям. Ну, и еще для того, чтобы была возможность перенести программу в исходном виде в другую операционную систему любого компьютера, где поддерживается данный язык программирования.
К сожалению или нет, но процессор компьютера не понимает таких простых и естественных команд: он оперирует командами более низкого уровня. Скажем, данная конструкция будет выглядеть так:
- Поместить в счетчик число 10;
- Обнулить регистр;
- Прибавить к регистру 1;
- Сравнить регистр со счетчиком;
- Если оба равны, то перейти к шагу 8;
- <Блок операторов>;
- Перейти к шагу 3;
- Конец программы.
Это не оптимальная логическая конструкция, но смысл понятен. Вместо этих слов процессор выполняет код еще более низкого уровня – машинный код, который уникален для каждого вида процессора. К счастью, большинство Intel-процессоров совместимы с предыдущими моделями.
Таким образом, компилятор – программа, которая преобразует исходный текст программы в машинный код, а иногда в промежуточный код (для присоединения других библиотек). Во многих компиляторах поддерживают оптимизирующие функции. В любом случае, машинный код получается не очень компактный.
Работа интерпретатора организована проще: обычно это среда выполнения, где программа читает программу построчно, переводит каждую строку во внутренний формат и выполняет ее. Скорость выполнения программы при этом резко падает, зато при такой модели выполнения очень легко искать ошибки в программе. К примеру, все старые версии Бейсика работали именно таким образом, а некоторые языки программирования могут работать исключительно в интерпретирующем режиме (включая даже серверные языки вроде PHP).