Интерпретатор
Оригинальное название: interpreter
Коротко
Программа, которая выполняет исходный код по ходу чтения, без заранее собранного исполняемого файла: прочитала инструкцию — выполнила.
Что такое «Интерпретатор»
Сайт на PHP работает именно так: на сервере лежат текстовые файлы .php, и при каждом запросе интерпретатор читает их и выполняет. Ничего не нужно собирать перед выкладкой — поправил файл, и изменение сразу работает. Так же устроены Python, Ruby, JavaScript в браузере и Node.js.
Чистые интерпретаторы, которые разбирают каждую строку заново при каждом проходе, сегодня редкость. Почти все современные реализации сначала переводят текст программы в промежуточный байткод, а затем исполняют его на виртуальной машине. Граница с компилятором поэтому размыта: внутри интерпретатора часто есть свой компилятор.
Как PHP выполняет скрипт
- Лексер разбивает текст на токены: ключевые слова, имена, числа, знаки.
- Парсер строит из токенов синтаксическое дерево.
- Компилятор превращает дерево в опкоды — команды виртуальной машины Zend.
- Виртуальная машина выполняет опкоды.
Первые три шага не зависят от данных запроса, поэтому их результат кэширует расширение OPcache: готовые опкоды лежат в общей памяти, и при следующем запросе PHP сразу переходит к выполнению. С PHP 8 в OPcache есть и JIT-компилятор, который переводит часто выполняемые участки в машинный код.
Попробовать в консоли
php -v # версия PHP
php -r 'echo PHP_VERSION;' # выполнить строку кода
php -a # интерактивный режим
php -l index.php # только проверить синтаксис
Интерактивный режим — это REPL: ввёл строку, сразу увидел результат. В Python и Node.js он запускается командой без аргументов.
Сильные и слабые стороны
Интерпретируемый код переносим: один и тот же скрипт работает на любом сервере, где есть нужная версия интерпретатора. Быстрый цикл «поправил — проверил» удобен в веб-разработке. Обратная сторона — многие ошибки обнаруживаются только при выполнении конкретной строки, а скорость обычно ниже, чем у заранее скомпилированного кода. Есть и практическая тонкость: если OPcache настроен не проверять изменения файлов, после выкладки новой версии кэш опкодов нужно сбросить, иначе сервер продолжит выполнять старый код.

