Как работают интерпретаторы компилирующего типа?
1) Интерпретаторы — считывают команды на языке высокого уровня построчно и построчно их выполняют.
То есть считал строку, скомпилировал — получил двоичный код. Выполнил этот двоичный код.
2) Компиляторы — сразу компилируют команды на языке высокого уровня в двоичный код.
При запуске программы эта программа (двоичный код) будет выполнен процессором.
3) Интерпретатор компилирующего типа — компилирует команды на языке высокого уровня в байт код.
Байт код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт код в двоичный код.
Всё верно?
Вопрос в том — работают интерпретаторы компилирующего типа?
Откомпилировал все команды на языке высокого уровня (программу целиком) в байт код. И потом откомпилировал байт код в двоичный код и запустил программу.
Или построчно? Откомпилировал строку из команд на языке высокого уровня, получил «строку» с байт кодом и запустил её?
Или откомпилировал все команды на языке высокого уровня (программу целиком) в байт код. А потом построчно компилируем/запускаем этот байт код?
- Вопрос задан более двух лет назад
- 1054 просмотра
Комментировать
Решения вопроса 0
Ответы на вопрос 6
Программист на «си с крестами» и не только
1) То есть считал строку, скомпилировал — получил двоичный код. Выполнил этот двоичный код.
НЕТ. Считал — выполнил. Выполняется машинный код интерпретатора, а не программы.
3) Байт-код понятен среде/виртуальной машине (.NET, Java), которая компилирует байт-код в двоичный код
В ЧИСТОМ СЛУЧАЕ — НЕТ. Считал команду байт-кода — выполнил. Точно так же выполняется машинный код интерпретатора, а не программы. Что-то вроде:
switch (opcode) < case OP_ADD: < auto res = stack.pop() + stack.pop(); stack.push(res); >. >
Байт-код используется по нескольким причинам.
1. 3 быстрее 1.
2. С расширением языка мы меняем только компиляцию в байт-код. Оптимизация байт-кода, интерпретатор — остаются.
А компиляция в машинный код в 1 и 3 — это так называемая JIT-компиляция. Она может выполняться не всегда. Одни команды могут быть в машинном коде, а другие — интерпретироваться.
Кроме того, байт-код часто используется и в классических компиляторах 2-го типа! Это позволяет делать многоплатформенные коллекции компиляторов — все frontend’ы компилируют в байт-код, затем с байт-кодом делаем какую-то магию вроде оптимизации, отдаём его backend’у, и тот готовит OBJ-файл для нужного процессора.
Ответ написан более двух лет назад
Комментировать
Нравится 5 Комментировать

Системный администратор со стажем.
Вы как то неверно представляете себе что такое компиляция, отсюда все вопросы.
- Берем программу целиком, прочитали, проанализировали, и перевели ее целиком в машинный код. Это компиляция.
- Берем одну инструкцию, переводим ее в машинный код, и выполняем это интерпретация
Компиляторы — сразу компилируют команды на языке высокого уровня в двоичный код.
При запуске программы эта программа (двоичный код) будет выполнен процессором.
Не сразу. Компиляторы читают программу, анализируют, и создают программу выполняющую эти же действия но уже в машинном коде.
- Вы можете прочитать инструкцию, проанализировать ее, понять какие материалы, запчасти понадобятся, возможно оптимизировать какие-то действия и составить план действий по ремонту. Это и есть компиляция.
- Но вы можете прочитать первую строку инструкции где написано — снимите двигатель. Выполнить ее, после чего перейти к чтению второй строки инструкции. Это интерпретация.
1) Интерпретаторы — считывают команды на языке высокого уровня построчно и построчно их выполняют.
То есть считал строку, скомпилировал — получил двоичный код. Выполнил этот двоичный код.
Идет поочередное выполнение команд . Прочитал инструкцию на языке программирования, и перевел ее в машинный код и выполнил. Никакой компиляции. Для компиляции нужно прочитать всю программу.
Результат работы компилятора — программа на другом языке.
Результат работы интерпретатора — выполненная инструкция
Разницу замечаете?
Особенности интерпретаторов
Интерпретатор и компилятор – два элемента, которые отвечают за непосредственное преобразование высокоуровневого языка программирования или сценария в машинный код. Несмотря на то, что данные компоненты выполняют одни и те же операции, они отличаются друг от друга.
Далее предстоит разобраться с тем, что собой представляют интерпретаторы и компиляторы. Рассмотрим ключевые особенности каждого «преобразователя» кода, наглядные примеры работы, а также их достоинства и недостатки. Все это пригодится как новичкам, так и опытным разработчикам.
Компиляция
Компилятор – это специальная программа на компьютере. Она переводит имеющийся код с одного языка разработки на другой. Популярный инструмент, без которого трудно представить современное программирование.
Компиляторы берут приложения целиком, а затем преобразовывают в исполняемый компьютерный код. Чтобы справиться с поставленной задачей, требуется целое программное обеспечение. Связано это с тем, что современные компьютеры понимают лишь то, что выражено при помощи двоичных кодов.
У интерпретаторов и компиляторов языков есть одна цель – преобразовать исполняемое приложение в машинный код. После выполнения процедуры считывания устройство будет успешно распознавать имеющийся контент. Примеры – это приложения, интерпретация которых проведена через C или C++.
Здесь стоит обратить внимание на следующие моменты:
- Компиляторы применяются для программ, которые переводят исходное приложение с высокого уровня на язык разработки более низкого.
- Compiler выполняет различные функции. Он может организовывать предварительную обработку данных, семантический анализ, парсинг, а также оптимизацию контента. Это делает работу с приложением более удобным и простым.
Выше – пример того, как выглядит компиляция исходного кода той или иной программы.
Сильные стороны
Компиляторы имеют далеко не одно преимущество. К сильным сторонам соответствующих компонентов относят следующие моменты:
- Программный код уже переведен в машинный. На его обработку требуется намного меньше времени.
- Документы типа .exe выполняются быстрее, чем исходный код. Объектные программы сохраняются. Это делает приложение более удобным – оно может быть запущено в любое удобное пользователю время.
- Полученные объектные приложения сложнее скорректировать. Такие утилиты будут обладать надежной защитой.
А еще программирование с использованием компиляторов предусматривает проверку исходного кода на синтаксические ошибки. Это делает процесс написания софта более быстрым и удобным. Обнаруженная ошибка многими языками будет подчеркиваться. Устранить ее станет намного проще даже новичкам.
Слабые стороны
Несмотря на достоинства, рассматриваемый инструмент имеет недостатки. К ним относят такие моменты:
- Использование большого количества памяти на компьютере. Связано это с особенностями выполняемых преобразований.
- Затраты по времени. Процесс формирования объектного приложения производится не моментально.
- Толкования исходного кода должны быть 100% достоверными и однозначными. В противном случае сформировать объектное программное обеспечение не получится.
Это – только один из двух доступных вариантов преобразования исходного кода. Теперь можно рассмотреть интерпретаторы языков и их особенности.
Интерпретатор
Для преобразования приложений могут использоваться разные инструменты. Программы иногда используют интерпретаторы (interpreters). Так называют специальные компьютерные приложения, которые занимаются преобразованием каждого программного оператора высокого уровня. На выходе получается машинный код.
Сюда включены разные коды: исходные, предварительно скомпилированные, а также разнообразные сценарии.
Интерпретатор языка – машинная программа. Она непосредственно выполняет набор инструкций, а также отвечает за выполнение заданных функций. В ходе операций проводится интерпретация без компилирования. Примеры – языки Python, Matlab, Perl.
Интерпретаторы языков работают так же, как и compilers. Они отвечают за преобразование ЯП высокого уровня в более низкий. А именно – в машинный. Но interpretator выполняет функции при их непосредственном запуске.
Плюсы
Среди основных достоинств интерпретаторов выделяют:
- Облегчение работы с исходным кодом.
- Использование минимального объема памяти устройства. Связано это с тем, что у интерпретируемых программ используется принцип преобразования по одной инструкции раз за разом.
- Вы выполните отладку утилиты намного быстрее и комфортнее. Связано это с тем, что программа-интерпретатор выполняет связку обнаруженного сообщения об ошибке с обрабатываемым контентом.
Такой вариант помогает ускорить исходный исполняемый файл, а также делает работу написанного софта более комфортной на устройствах с небольшим объемом памяти.
Минусы
Интерпретаторы языков кроме преимуществ имеет ряд недостатков. О них должен помнить каждый разработчик.
Интерпретация может затянуть время исполнения программы. Связано это с тем, что каждый раз для запуска нужно поэтапно преобразовывать имеющиеся функции. А еще программы-интерпретаторы выполняются только там, где имеется соответствующий инструментарий. Если на устройстве отсутствует interpreter, воспользоваться приложением не получится.
Как работают инструменты
Стоит обратить внимание на то, как работают рассматриваемые элементы. В случае с компилятором процессы проходят так:
- Компилятор создает программу.
- Проводится анализ всех операторов языка. На этом этапе сделаем проверку правильности.
- При обнаружении ошибок компилятор выдает соответствующее сообщение. В противном случае имеющийся контент переводится в машинный тип.
При компилировании допускается связывание различных кодовых файлов в программы, пригодные для запуска (пример – формат .exe). После этого имеющийся софт успешно запустится.
Интерпретатор работает иначе:
- Происходит создание программы.
- Построчно выполняются исходные операторы. Эти манипуляции реализовываются непосредственно во время исполнения программы.
- Связь файлов отсутствует. Машинного кода тоже не будет.
Выше – примеры того, как выглядит работа компиляторов и интерпретаторов. Использование этих инструментов обуславливается конкретным языком разработки.
Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в Otus !
Особенности интерпретатора Python

У Python есть одна интересная особенность, которая его выделяет среди других языков программирования. Мы знаем, что Python — интерпретируемый язык, но его способ интерпретации несколько отличается от других похожих. В свою очередь это порождает достаточно неочевидные вещи в поведении самого Питона. Знание таких особенностей, позволяет лучше понять поведение Python.
Компилятор и интерпретатор
Для начала рассмотрим отличие компилятора от интерпретатора. Ключевое различие в том, что компилятор на выходе даёт исполняемый код. То есть исходный код программы используется для генерации другого кода — исполняемого. Именно исполняемый файл и работает. Если мы изменим исходный код, то потребуется новая компиляция, чтобы получить рабочую программу.
Интерпретатор работает непосредственно с исходным кодом. Сам по себе интерпретатор как бы сопоставляет команды из исходного файла с тем, что уж есть в интерпретаторе и построчно их выполняет. Если изменить исходный код, то интерпретатор на лету подхватит изменения.
Анализ исходного кода
Перед тем, как компилятор или интерпретатор начнут выполнение программы обычно проверяется синтаксис исходного кода. Например проверка парности скобок, кавычек, отступов и т.д. После этого нужно проверить ключевые слова, потом доступность функций, модулей и т.п. Когда этот этап пройдён, проверяются типы данных, всякие логические ошибки — то есть перед запуском программы следует убедиться, что она корректно написана и может быть выполнена.
Компилятор, очевидно, должен пройти все этапы проверки и лишь в конце происходит сборка программы. Если на любом этапе возникают ошибки, то компилятор просто откажется собирать итоговый файл.
Интерпретатор же, работает чуть по другому. Поскольку исполняется каждый исходный файл, то проверка на корректность происходит уже во время его выполнения. При этом интерпретатор может как обрабатывать файл целиком, так и построчно.
Интерпретация целого файла
Для примера рассмотрим PHP, поскольку именно в нём реализован подобный подход. Интерпретатор PHP анализирует файл целиком. Если в любой строчке файла есть ошибки, то PHP не позволит запустить данный файл. Например, такой простой файл, где мы специально допустим ошибку:
Из за «blabla» PHP вывалится с ошибкой «PHP Fatal error: Uncaught Error: Undefined constant «blabla»». При этом первая строчка с «hello» не будет выполнена.
Теперь рассмотрим другой код:
Он выполняется как положено, но обратите внимание, что функцию мы объявили уже после того, как её использовали. То есть интерпретатор загрузил весь файл, построил по нему карту функций и сделал их доступными как минимум в пределах данного файла.
Теперь для исследования давайте создадим ещё одну функцию с тем же именем и попробуем выполнить файл. PHP вываливается с ошибкой «PHP Fatal error: Cannot redeclare a()». То есть мы не можем создать две функции с одинаковым именем.
Запомним эти особенности и теперь посмотрим как ведёт себя Python
Построчная интерпретация
Выполним тот же код, чтобы понять отличия:
print('hello') blabla
Python вываливается с ошибкой «NameError: name ‘blabla’ is not defined». Но при этом первая строчка с «hello» была выполнена. То есть Python выполняет код построчно.
Теперь второй пример:
print('hello') a(10) def a(x): print(x)
Опять ошибка: «NameError: name ‘a’ is not defined». То есть Python ничего не знает о том, что функция объявлена ниже.
Попробуем объявить две одноимённые функции:
print('hello') def a(x): print(x) def a(x): print(x*2) a(10) # 20
Когда дело дойдёт до выполнения функции, то Python использовал последнюю объявленную.
Из этого можно сделать важный вывод: Python построчный интерпретатор, где команды выполняются сверху вниз, и это отличает его от других интерпретаторов. Наиболее близким по поведению к Python можно назвать Basic, который когда-то был крайне популярным.
Байт-код
Байт-код — это специальный файл, который является промежуточным перед непосредственным исполнением файла. Например в Java компилятор отдаёт не исполняемый файл, а байт-файл, который в свою очередь выполняется виртуально машиной (она под конкретную систему). В Python что-то подобное — исходный код трансформируется в байт-код, только в памяти и потом интерпретируется виртуальной машиной.
Но есть одна особенность — если в других языках, байт-код формируется уже после проверки на ошибки, то в Python — он формируется безусловно как есть. Для примера можно любой пример с ошибками скомпилировать в pyc-файл (это и есть байт-код) с помощью python -m compileall . и убедиться, что файлы создаются без каких-либо проблем.
Таким образом байт-код в Python — это просто бинарная форма исходного кода без особых проверок.
Особенности Python
Они проистекают именно из-за этой технической особенности интерпретатора.
Мы можем выполнять код до строки с ошибкой
Это довольно сильно затрудняет отладку. Например если в файле какой-то ошибочный код выполняется после многочисленных циклов или условий, то мы можем никогда об этом не узнать, пока не сработают все эти условия или циклы.
Можно затереть любые другие функции
На Python можно спокойно переписать любые, даже стандартные функции. Например такой вот «дикий» код:
print1 = print def print(x): print1('hello') print(10) # hello print(20) # hello print(30) # hello
Теперь на любой print() будет выводиться «hello».
Другой пример: можно «убить» любую функцию:
print = 10 list = 20 str = 30 dict = 40 range = 50
Вспомните как часто для имени строки используется «str»? А в Python это стандартная функция. Можно случайно затереть любую функцию и Python даже не выдаст предупреждения.
При программировании на Python нужно как-то следить за именованием функций и переменных. Можно случайно использовать одно имя для функции и переменной, а потом не понимать почему код работает неверно. Проблему можно было бы решить, если в Python можно было бы использовать какой-то символ для обозначения переменных: как в PHP символ «$». Но в Python доступны только цифры, буквы и символ подчеркивания.
Стоит ли удивляться обилию идентификаторов с подчеркиванием в Python-программах? Просто ничего другого нет.
Я бы посоветовал для переменных использовать верблюжью нотацию Pascal (т.н. CamelCase), где первый символ указывается с большой буквы:
My = 'google' MyName = 'Маша' MyAge = 26
Она наиболее близка к общепринятой (mixedCase) и избавит от использования символа подчеркивания.
Неожиданное выполнение кода
Построчное выполнение кода в Python возможно в достаточно неожиданных местах, например при описании класса:
class MyClass: print('Як справи?') k = 42 def out(self): print(10) print('Hello!') print(k)
Простой запуск кода, выведет «Як справи?», «Hello!» и переменную k , хотя мы даже не объявляли создание объекта.
Кстати этот пример показывает особенности ООП в Python. Если в других языках инструкция class это начало шаблона типа данных, единый блок, который не должен выполняться вне объекта, то Python всё это воспринимает «в лоб» — для него class — максимум отдельная область видимости (scope) для методов и полей, а всё что внутри выполняется как обычный код.
Это как раз «чудеса» работы интерпретатора, а не какая-то «особенная объектная модель» Python.
Компилятор и интерпретатор: понимание основ


Что такое компиляция, линковка, run time?

Что такое язык программирования, и какие они бывают?

Что такое синтаксис в программировании

Что такое митапы и зачем они айтишнику

Что такое сигнатура в программировании: терминология и примеры
Если вы когда-нибудь задавались вопросом, как компьютер может понимать и выполнять программы на языке, понятном только человеку, значит пора узнать, что такое компилятор и интерпретатор. Добро пожаловать в увлекательный мир программирования! В этой статье мы рассмотрим один из ключевых инструментов программиста — что такое компилятор, как он работает, какие виды бывают и где применяются. А самое главное, какая разница между компилятором и интерпретатором. Готовы окунуться в мир компьютерных языков вместе с нами? Тогда начнем!
Определение

Компиляторы — программ, которые преобразуют исходный код программы в машинный код, понятный компьютеру. Среди этих видов есть векторизующие, гибкие, диалоговые, инкрементальные, интерпретирующие, отладочные, резидентные, самокомпилируемые и универсальные.
Кроме того, всех их можно условно разделить на две группы:
- те, которые работают с конкретными языками программирования;
- те, которые служат системами сборки программ. Примерами таких компиляторов являются GCC, gnat, clang, xcode, gfortran, Makefile и CMake.
Интерпретаторы же это программы, которые выполняет интерпретацию, т.е. чтение и выполнение программного кода, без предварительной компиляции в машинный язык.
Существуют два типа:
- простой тип выполняет команды моментально, но может обнаружить ошибки только в момент выполнения.
- второй тип — компилирующий, использует компилятор для перевода исходного кода в промежуточный, а затем интерпретирует его. Этот тип работает быстрее, но требует больше ресурсов и правильного исходного кода.
Некоторые такие трансляторы могут работать в режиме диалога или цикла чтения-вычисления-печати (REPL). В таком режиме интерпретатор считывает законченную конструкцию языка, выполняет её и выводит результаты.

Процесс интерпретация — это анализ и выполнение исходной программы или запроса в режиме построчной обработки, без предварительной трансляции в машинный код. Это дает возможность быстро проверять и тестировать код без необходимости его компиляции. Однако, процесс интерпретации требует больших вычислительных мощностей и может приводить к более медленной работе программы.
- Преимущества:
- Значительно облегчает работу с исходным кодом программы.
- Использует минимальный объем памяти компьютера при переводе по одной инструкции.
- Может связать сообщения об ошибках с выполнением инструкций.
- Недостатки:
- Затрачивается время на интерпретацию программы в каждый раз, когда она выполняется.
- Возможность выполнения только на компьютерах, где установлен соответствующий транслятор.
Сравнение компилятора и интерпретатора
| Компилятор | Интерпретатор | |
| Что это | Программа, которая преобразует исходный код на языке высокого уровня в машинный язык | Программа, которая выполняет исходный код на языке высокого уровня |
| Работа | Читает весь код программы и создает исполняемый файл | Читает и выполняет каждую строку кода по очереди |
| Ошибка | Сообщения об ошибках выводятся после прохождения компиляции | Сообщения об ошибках выводятся по мере выполнения кода |
| Исполнение | Исполняемые файлы работают быстрее | Интерпретируемый код работает медленнее, чем скомпилированный |
| Использование | Рекомендуется для крупных проектов и для языков, где требуется высокая производительность | Рекомендуется для быстрой разработки и отладки, а также для языков, которые используются в интерактивной среде |
| Примеры языков | C++, Java, Swift, Rust, Go | Python, Ruby, JavaScript, PHP, Perl |
Здесь мы можем увидеть, что компиляторы быстрее, но сложнее в использовании при исправлении ошибок и изменении программы, создают быстрый и эффективный код. В то же время, интерпретаторы позволяют легче исправлять и изменять программы, но выполняются медленнее, позволяют более быстро менять код, но могут иметь меньшую производительность.

Похожие материалы
Что такое компиляция, линковка, run time?
Что такое язык программирования, и какие они бывают?
Что такое синтаксис в программировании
Что такое митапы и зачем они айтишнику
Что такое сигнатура в программировании: терминология и примеры
Что такое компилятор и интерпретатор?
Компилятор и интерпретатор — это два разных способа преобразования и выполнения исходного кода программы. Компилятор преобразует исходный код в машинный код заранее, в то время как интерпретатор выполняет эту операцию постепенно, во время работы программы. Я часто выбираю между ними, исходя из требований проекта.
Какие преимущества и недостатки компилятора?
Компиляторы обычно предлагают лучшую производительность и эффективность, так как они заранее преобразуют исходный код в машинный код. Однако они требуют дополнительного времени на этапе компиляции.
Какие преимущества и недостатки интерпретатора?
Интерпретаторы могут быстро начать выполнение программы без предварительной компиляции, что полезно для скриптов и тестирования. Однако они могут быть менее эффективными в производительности, поскольку каждую команду приходится интерпретировать отдельно.
В каких ситуациях лучше использовать компилятор?
Компиляторы обычно используются для больших проектов, где важна производительность и эффективность, а также для разработки программного обеспечения на низком уровне, такого как драйверы устройств и операционные системы.
В каких ситуациях лучше использовать интерпретатор?
Интерпретаторы подходят для скриптов, быстрой разработки и тестирования, а также для выполнения кода в контролируемых средах, где безопасность является приоритетом.
Можно ли использовать и компилятор, и интерпретатор в одном проекте?
Да, некоторые языки программирования, такие как Python и JavaScript, используют так называемые «JIT» (Just-In-Time) компиляторы, которые сочетают преимущества обеих подходов.