Интерпретатор (interpreter) — это программа, которая выполняет код, написанный на языке программирования. Она не переводит его в машинные коды целиком, а построчно принимает команды и сразу выполняет их. Можно отдать интерпретатору команду и сразу понять, сработала ли она.
Это один из двух способов перевода кода в понятный компьютеру вид. Второй вариант — компиляция, когда код «переводят» в машинные команды целиком. Мы расскажем об их различиях ниже.
Языки программирования, которые работают с интерпретаторами, называются интерпретируемыми. Большинство популярных сейчас языков именно такие. Некоторые из них — популярный вариант для обучения информатике и программированию.
Для чего нужны интерпретаторы
Языки программирования создаются такими, чтобы писать на их было удобно человеку. Они близки к английскому языку, команды на них — человекопонятные. Это в первую очередь касается высокоуровневых ЯП — тех, которые ближе к человеку, чем к «железу».
Компьютер такие языки не понимает. По умолчанию код на них для него — обычный текст, а не команды. Ведь компьютер — вычислительная машина, для которой понятен не текст, а наборы из нулей и единиц. Но писать команды на так называемых машинных кодах — задача очень трудная, почти невозможная. Ведь они очень длинные, особенно если программа сложная, и непонятны человеку.
Поэтому при разработке языка программирования для него всегда создается программа, переводящая код на нем в понятный компьютеру вид. Интерпретатор — один из вариантов, как можно реализовать этот процесс. Программа на интерпретируемом языке без интерпретатора просто не запустится — компьютер ее не поймет.
То есть интерпретатор нужен, чтобы программы на том или ином языке могли запускаться и выполняться.
Как работает интерпретатор
Интерпретатор получает на вход команду, написанную на языке программирования, читает ее и сразу же выполняет. Его работу можно условно разделить на два режима: интерактивный и пакетный.
Интерактивный режим. Это обычно работа в консоли. Его еще называют REPL — Read-eval-print loop, цикл чтения, исполнения и печати. Работает он так. Человек пишет в консоли какую-то команду интерпретатору, и она тут же выполняется, как только он нажимает Enter.
Обычно для этого сначала нужно запустить интерпретатор отдельной командой, но не всегда. Например, если команда на JavaScript пишется в консоли браузера, ничего дополнительно включать не надо — в браузеры по умолчанию встроен интерпретатор JS.
Пакетный режим. Он используется для более крупных задач, таких, которые не получится писать построчно и выполнять сразу же. Человек пишет какой-то код в файле, сохраняет его с нужным расширением и отдает интерпретатору. Тот получает файл, построчно считывает написанный там код и выполняет его.
В пакетном режиме пишется большинство программ: писать их в консоль и сразу же выполнять было бы неудобно. А REPL используют для быстрых подсчетов, отправки запросов и других действий, которым достаточно одной команды.
Разница между интерпретатором и компилятором
Еще один способ «переводить» код в понятный машине вид — компиляция. Программы, которые ею занимаются, называются компиляторами, а языки, которые с ними работают, — компилируемыми. Разница в том, что компилятор ничего не выполняет: он получает на вход файл с кодом, расшифровывает его и переводит в машинные коды целиком. Получается исполняемый файл, который можно запустить внутри той или иной операционной системы.
У интерпретаторов и компиляторов есть ряд различий — теоретических и чисто практических.
- Интерпретатор работает с кодом построчно, а компилятор переводит весь блок кода целиком.
- Интерпретатор исполняет код, как только «прочтет» нужную строку, а компилятор отдает его на выполнение системе — сам он только переводит.
- С компилятором нельзя работать в режиме REPL — только в пакетном.
Интерпретатор можно сравнить с синхронным переводчиком, который сразу же озвучивает перевод. А компилятор — с литературным переводчиком, который переводит тексты, а потом отправляет перевод тем, кто будет с ним работать.
Известные интерпретируемые языки и их применение
Самые популярные сегодня языки, работающие с интерпретатором, — JavaScript и Python. Первый обрел популярность благодаря тому, что именно он работает в браузере. Поэтому им активно пользуются в вебе, особенно во фронтенде. Python же применяют в машинном обучении, анализе данных, при работе с математикой, аналитикой и автоматизацией, а еще в вебе и во многих других отраслях.
Другие примеры интерпретируемых языков — PHP, который активно применяют в вебе для «серверной» части, универсальный Ruby и Perl — его часто используют для автоматизации, системного администрирования или работы с текстом.
Интерпретируемые языки не зависят от системы, поэтому их в теории можно использовать где угодно. Главное, чтобы на конечном устройстве, где будет запускаться код, был установлен интерпретатор.
А вот там, где нужно максимальное быстродействие или близость к «железу», обычно предпочитают компилируемые языки. В них код исполняется быстрее за счет перевода в машинные коды: система понимает их и быстро выполняет.
У некоторых языков, таких как Basic или Python, есть и компилируемая, и интерпретируемая версии. Они используются для разных целей.
Несколько интерпретаторов у одного языка
Чаще всего бывает так, что у одного языка есть несколько интерпретаторов, или, как говорят, несколько реализаций или движков. Яркий пример — JavaScript: там основных интерпретаторов три, причем одним пользуются браузеры на базе Chromium, другим — Mozilla, а третьим — браузеры Apple.
Разные реализации могут чуть-чуть отличаться в исполнении или в обработке некоторых сложных запросов. У каждого движка свои механизмы оптимизации, свои особенности. Если предполагается, что код будет запускаться из-под разных движков, желательно учесть их все. Например, тот же JavaScript: фронтенд-разработчики, работающие с «браузерной» частью сайта, должны учитывать и тестировать поведение кода в разных браузерах. Но общий принцип работы похож у всех.
Как именно должен работать код, определяет спецификация — большой документ, обычно от разработчиков языка, который подробно описывает все возможные команды и принципы. Создатели интерпретаторов ориентируются именно на этот документ.
Достоинства интерпретируемых языков
Интерактивность. Код выполняется построчно, и это удобно. Если нужно протестировать какой-то простой запрос, можно просто включить интерпретатор и отдать ему команду в консоли — все выполнится тут же без временных затрат на компиляцию и передачу системе. А еще так можно выполнять простые действия, например для автоматизации рутины.
Скорость освоения и написания кода. Благодаря уже упомянутой интерактивности язык проще учить. Во-первых, сразу видно, к какому результату приведет то или иное действие, во-вторых, если появится ошибка, интерпретатор укажет где. Да и код пишется быстрее — по этой же причине.
Удобство отладки. Отлаживать код, написанный на интерпретируемом языке, проще по той же причине: он исполняется сразу. В случае с компилируемыми языками ошибка может возникнуть в одном месте, а заметной для компилятора стать в другом. Это затрудняет отладку. С интерпретируемыми языками в этом смысле проще: интерпретатор начинает «ругаться», как только доходит до ошибочного места.
Более того: если компилируемая программа обнаружит ошибку, она не выполнится совсем. А интерпретируемая — выполнится до места сбоя. Это тоже удобно при поиске ошибок, а еще помогает решить хотя бы часть задачи, прежде чем программа «упадет».
Понятность для человека. Большинство интерпретируемых языков — высокоуровневые, близкие к человеку. Поэтому у них понятный синтаксис, код на них легко читается, а сами языки освоить относительно просто. И уж точно проще, чем писать на низкоуровневых языках или вообще на машинных кодах.
Независимость от платформы. Исполнение берет на себя интерпретатор, а не система. Поэтому язык не зависит от ОС, то есть по умолчанию кроссплатформенный. Это выгодно отличает интерпретируемые языки от компилируемых: в них исполнение напрямую зависит от системы. Ведь разные ОС воспринимают машинные коды по-разному, поэтому программы-компиляторы — свои для каждой системы. И код, скомпилированный для Windows, не запустится в Linux или на Mac.
Механизмы оптимизации. На руку программисту играют и сами интерпретаторы: в них встраивают механизмы, которые оптимизируют код сами. Это значит, что, если код написан не самым оптимальным способом, интерпретатор сгладит недостаток оптимизации за счет встроенных механизмов.
Конечно, это не означает, что нужно забыть о качестве кода. Оно все еще важно. Но такая возможность позволяет сконцентрироваться на том, чтобы код был чистым и понятным для человека, и не жертвовать понятностью ради нескольких миллисекунд.
Недостатки интерпретируемых языков
Низкая скорость программ. Сами программы на интерпретируемых языках работают медленнее, чем на компилируемых, потому что код выполняет не система напрямую. Но разница в скорости сглаживается за счет двух факторов: оптимизация самих интерпретаторов и отсутствие промежуточного шага — компиляции, перевода в машинный код. Хотя в критичных по быстродействию процессах предпочитают использовать компилируемые языки, для большинства задач интерпретируемых вполне достаточно.
Риск ошибки. Выше мы говорили, что отлаживать код на интерпретируемых языках легче. Это так, но у преимущества есть оборотная сторона. Так как программа запускается сразу и выполняется до ошибочного места, какую-то ошибку в редко выполняемых блоках кода легко пропустить. Есть риск, что программа выполнится, а разработчик так и не узнает, что в ней ошибка. Компилируемые языки от этого защищены: если ошибка есть хоть где-то, программа просто не запустится. Проблемы, правда, можно избежать за счет качественного тестирования.
Зависимость от установленного интерпретатора. Интерпретируемые языки не зависят от операционной системы, но зависят от интерпретатора. Чтобы код запустился, нужно не только скачать файл с ним, но и установить интерпретатор. Если тот не установлен, компьютер просто не сможет выполнить программу — нечему будет понимать ее. А вот исполняемый файл, созданный через компилятор, можно запустить где угодно, но только в нужной ОС.
Открытость исходного кода. При компиляции в машинные коды «исходники» скрываются, и никто не может посмотреть, как была реализована та или иная функция. Интерпретируемые языки такого достоинства лишены: код не переводится в исполняемый файл, а выполняется интерпретатором сразу. Поэтому исходники остаются открытыми и их может посмотреть кто угодно. Это минус, если код программы — коммерческая тайна или разработчик просто по какой-то причине хочет его скрыть. Придется пользоваться дополнительными инструментами, чтобы «спрятать» написанное.
Какие языки лучше учить: компилируемые или интерпретируемые
Нет однозначного ответа, что лучше: у обоих типов свои сферы применения, достоинства и недостатки. Поэтому мы рекомендуем ориентироваться на область, в которой вы хотите работать, и на языки, которые в ней принято использовать. Например, в геймдеве и при создании приложений под разные ОС обычно применяют компилируемые языки. В вебе и для автоматизации — интерпретируемые. А еще вы можете попробовать разные варианты и разобраться, какой подход вам ближе.
Узнайте больше о программировании и информационных технологиях на наших курсах. Мы поможем получить новую высокооплачиваемую профессию.
0 комментариев