Интерпретатор — средство исполнения программ¶
Интерпретатор — это программа (или аппаратный компонент), выполняющая построчное (пословное) исполнение инструкций другой программы, преобразуя их в команды вычислительной машины «на лету», без предварительной компиляции всего исходного кода в машинный. Интерпретатор читает исходный текст (или байт-код), анализирует каждую конструкцию и немедленно выполняет соответствующее действие, после чего переходит к следующей инструкции.
¶Принцип работы
В отличие от компилятора, который транслирует исходный код целиком в исполняемый файл (или байт-код) до запуска, интерпретатор работает в режиме, близком к диалогу с процессором. Алгоритм его работы обычно сводится к циклу:
- Лексический разбор очередного оператора или выражения.
- Синтаксический разбор (построение внутреннего представления — AST или подобной структуры).
- Непосредственное выполнение операции.
- Переход к следующей инструкции.
Такой подход означает, что один и тот же фрагмент кода при повторном выполнении разбирается заново, если результат разбора не кэшируется. Именно поэтому интерпретируемые программы, как правило, работают медленнее скомпилированных аналогов, хотя современные реализации сокращают разрыв за счёт JIT-компиляции (подробнее ниже).
¶Классификация
По способу исполнения различают:
- Пословные интерпретаторы — выполняют программу, последовательно разбирая исходный текст (например, ранние версии BASIC, PHP).
- Интерпретаторы байт-кода — сначала транслируют исходный код во внутреннее промежуточное представление (байт-код), затем выполняют его. К этой категории относятся CPython (Python), Java Virtual Machine (JVM), .NET CLR.
- JIT-интерпретаторы (just-in-time) — совмещают интерпретацию с динамической компиляцией: «горячие» фрагменты байт-кода переводятся в машинный код на лету. Примеры — V8 (JavaScript), HotSpot (Java), PyPy.
¶Интерпретатор и компилятор: различия
| Критерий | Интерпретатор | Компилятор |
|---|---|---|
| Момент трансляции | Во время выполнения | До запуска программы |
| Результат | Обычно отсутствует отдельный исполняемый файл | Генерируется исполняемый файл или объектный код |
| Скорость запуска | Мгновенный старт | Требуется этап компиляции |
| Скорость выполнения | Как правило, ниже | Как правило, выше |
| Отладка | Удобна, можно выполнять код пошагово | Требует отдельных отладочных символов |
| Переносимость | Код переносится вместе с интерпретатором | Нужна компиляция под каждую платформу |
На практике граница размыта: многие современные языки используют гибридные схемы. Компилятор Python транслирует код в байт-код, который затем исполняет виртуальная машина; Java-компилятор javac создаёт байт-код для JVM, а JVM совмещает интерпретацию и JIT-компиляцию.
¶Историческая справка
Идея интерпретации возникла вместе с первыми программными языками. Один из ранних примеров — интерпретатор языка BASIC, созданный в 1964 году Джоном Кемени и Томасом Курцем в Дартмутском колледже. BASIC разрабатывался как учебный язык, и построчное исполнение с возможностью немедленного запуска отдельных команд соответствовало интерактивному стилю работы.
В 1970-е годы появился язык Smalltalk, целиком ориентированный на интерпретацию объектно-ориентированных программ в среде «живых» объектов. В 1990-е годы интерпретаторы получили широкое распространение в связи с развитием интернета: PHP, Perl, JavaScript и Ruby стали основными серверными и браузерными языками, где скорость разработки и кроссплатформенность важнее быстродействия.
¶Преимущества и недостатки
К достоинствам интерпретации относят:
- кроссплатформенность — один и тот же исходный код запускается везде, где есть интерпретатор;
- удобство отладки и итеративной разработки;
- возможность выполнения кода, сгенерированного во время работы программы («eval», динамическая загрузка модулей);
- отсутствие этапа сборки, что упрощает публикацию и распространение программ.
Недостатки:
- пониженная производительность по сравнению с нативным кодом;
- необходимость наличия интерпретатора в системе пользователя;
- риск выполнения вредоносного кода, если интерпретатор исполняет непроверенные скрипты.
¶Примеры интерпретируемых языков
| Язык | Интерпретатор / виртуальная машина |
|---|---|
| Python | CPython, PyPy, Jython |
| JavaScript | V8, SpiderMonkey, JavaScriptCore |
| Ruby | CRuby (MRI) |
| PHP | Zend Engine |
| Perl | perl |
| Lua | Lua VM |
| Bash | bash |
¶Применение
Интерпретаторы используются повсеместно: в серверной разработке (PHP, Python, Ruby), во веб-браузерах (JavaScript), в системном администрировании (Bash, PowerShell), в научных расчётах (MATLAB, R), в образовании (Scratch, Python), в игровых движках (Lua для скриптов), в базах данных (PL/SQL в Oracle, T-SQL в Microsoft SQL Server).
