Интерпретатор

Оригинальное название: interpreter

Коротко

Программа, которая выполняет исходный код по ходу чтения, без заранее собранного исполняемого файла: прочитала инструкцию — выполнила.

Что такое «Интерпретатор»

Сайт на PHP работает именно так: на сервере лежат текстовые файлы .php, и при каждом запросе интерпретатор читает их и выполняет. Ничего не нужно собирать перед выкладкой — поправил файл, и изменение сразу работает. Так же устроены Python, Ruby, JavaScript в браузере и Node.js.

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

Как PHP выполняет скрипт

  1. Лексер разбивает текст на токены: ключевые слова, имена, числа, знаки.
  2. Парсер строит из токенов синтаксическое дерево.
  3. Компилятор превращает дерево в опкоды — команды виртуальной машины Zend.
  4. Виртуальная машина выполняет опкоды.

Первые три шага не зависят от данных запроса, поэтому их результат кэширует расширение 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 настроен не проверять изменения файлов, после выкладки новой версии кэш опкодов нужно сбросить, иначе сервер продолжит выполнять старый код.

Обновлено:

Все термины раздела «Backend»

Что будем искать? Например,Продвижение