Что это — интерпретатор, и где он используется?

Для реализации задач, описанных в программном коде, процессор компьютера должен произвести ряд операций. Но процессор, как и другие части компьютерного «железа», не понимает языки программирования высокого уровня. Поэтому для того, чтобы добиться исполнения описанных в программе действий, её переводят в понятный процессору объектный код. Конечный результат этого перевода называется объектным модулем или объектным файлом и содержит в себе набор единичек и нулей, понятных процессору компьютера.

Для проведения переводов исходного кода в объектный или промежуточный код используются специальные программы – трансляторы.

Что такое транслятор?

Транслятор (от английского Translate – переводить) — программа, переводящая исходный код (программу, написанную на одном из высокоуровневых языков программирования) в объектный код, используемый процессором компьютера, или в промежуточный код для последующей интерпретации.

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

Существуют также обратные трансляторы, осуществляющие перевод с машинного кода в понятный пользователю язык программирования.

В тех случаях, когда исходный код переводится для последующего исполнения процессором, для трансляции используется компилятор.

Что такое компилятор?

Компилятор (от английского Compile – собирать, накапливать) – это вариант реализации транслятора, который создаётся для перевода программы, написанной на высокоуровневом языке программирования в машинный код, который в последствие будет исполняться процессором компьютера. Этот тип трансляции называется компиляцией.

В большинстве случаев компиляция программы происходит полностью (AOT-компиляция). Компилятор целиком считывает программу, проводит её пошаговый анализ (лексический, синтаксический, семантический), оптимизирует её, очищая от излишних конструкций, но сохраняя исходный смысл операций, и также целиком переводит её в машинный код.

Однако, иногда используется и построчная компиляция. В этом случае машинный код генерируется и исполняется для каждой полной грамматической конструкции исходного кода. От интерпретации такая компиляция отличается способом исполнения.

Для каждого языка программирования и практически для каждой операционной системы используется свой компилятор. Иногда для одного семейства операционных систем может использоваться один и тот же компилятор.

Компиляторы для C++

Так, например, для C++ можно использовать:

  • Microsoft Visual C++ 6.0
  • MS Visual Studio 2005 Professional
  • Intel C++ Compiler 4.5
  • Borland Builder 6.0
  • Borland C++ Compiler
  • g++
  • gcc
  • MinGW 3.2

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

Компилятор для Python

Необходимость самостоятельно компилировать исходный код с Питона в exe-файл для последующей интерпретации возникает нечасто. В тех случаях, когда на компьютер, на котором планируется выполнение программы, уже установлен интерпретатор Python, компиляция обычно не требуется.

Если программе всё же необходима компиляция, можно использовать cx_Freeze.

Компилятор для Java

Язык программирования Java работает с виртуальной машиной Java, которая обрабатывает байт-код (промежуточный код) и передаёт инструкции оборудованию. Виртуальная машина Java, по сути, является интерпретатором.

Компиляторы в Java используются для того, чтобы преобразовать исходный код в байт-код, доступный пониманию виртуальной машины и пригодный для последующей интерпретации.

Чаще всего используются:

  • GNU Compiler for Java
  • Javac

Javac помимо анализа и трансляции, производит ещё и оптимизацию кода.

В целом, за счёт использования виртуальной машины, Java выполняет операции, описанные в исходном коде куда медленнее, чем, скажем, С++. При исполнении некоторых операций Java может уступать в скорости до 7 раз. Для ускорения работы программ на Java используется оптимизация библиотек (в них широко используется native-код), некоторые аппаратные решения для ускоренной обработки байт-кода и JIT-компиляция.

JIT-компиляция

JIT-компиляция – это трансляция байт-кода в машинный код непосредственно во время работы программы. JIT-компиляция может быть применена к любой части программы или ко в
сей программе в целом.

Использование этой технологии позволяет существенно ускорить процесс исполнения задач, поставленных в исходном коде, по сравнению с пошаговой интерпретацией, традиционно применяемой виртуальными машинами.

Что такое интерпретатор?

Интерпретатор (от английского Interpret – толковать) – программа, выполняющая пошаговую обработку исходного кода, его анализ и техническую реализацию этой же части кода.

Проще говоря, в отличие от большинства компиляторов, интерпретатор обрабатывает, а затем исполняет не всю исходную программу, а отдельно каждую её строку, пока программа не будет закончена.

Интерпретаторы бывают двух типов:

  • Простые — осуществляющие исключительно интерпретацию введённого исходного кода.
  • Интерпретаторы компилирующего типа – это система, состоящая из компилятора, транслирующего исходный код в промежуточный, и виртуальной машины, реализующей операции, описанные в коде.

Виртуальная машина

Во многих языках программирования реализацию написанного исходного кода выполняет виртуальная машина. Это часть интерпретатора, получающая на вводе скомпилированный промежуточный код и выполняющая описанные в нём операции.

Давайте рассмотрим алгоритм этого процесса на примере PVM (Python Virtual Machine).

По схожей схеме работают виртуальная машина Java, Common Language Runtime (инструмент для интерпретации С#) и некоторые другие интерпретаторы.

Интерпретатор для PHP

Интерпретатор PHP отличается от большей части виртуальных машин отсутствием создания выполняемого файла. То есть в отличие от, скажем, PVM (Python Virtual Machine) он не кеширует сгенерированный байт-код в памяти. Потому при запуске и отладке программы компиляция одного и того же фрагмента байт-кода происходит несколько раз. Это существенно замедляет работу программы.

Сравнение интерпретаторов и компиляторов

Плюсы интерпретаторов

  • Использование для реализации исходного кода виртуальной машины позволяет интерпретаторам эффективно работать на всех платформах.
  • С интерпретатором можно работать в интерактивном режиме.

Минусы интерпретаторов

  • Исходный код не может работать отдельно без наличия интерпретатора.

Плюсы компиляторов

  • Возможность эффективной оптимизации кода, сокращающей количество операций и итоговое время выполнения поставленных программе задач.
  • Быстродействие – перевод в машинный код и реализация операций процессором происходит в среднем в 1,5 раза быстрее, чем пошаговая трансляция программы в байт-код и последующая реализация её виртуальной машиной.
  • Производительность – исполнимый модуль, получившийся в результате компиляции, обладает оптимальными показателями скорости выполнения и задействует в работе минимум ресурсов компьютера.

Минусы компиляторов

  • И сами компиляторы, и генерируемый ими код рассчитаны на использование в определённой операционной системе и взаимодействие с определённым типом процессора. В других исходных условиях они работать не будут.

Выбор транслятора

Выбор транслятора для работы с той или иной программой, прежде всего, определяется рекомендациями разработчиков этой программы, затем, целями и личными предпочтениями программиста.

Если Вы хотите разобраться в этой теме глубже, рекомендуем прочесть:

Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий

Это учебник по теории написания компиляторов, в котором подробно описаны принципы работы разноуровневых компиляторов (начиная от простейших однопроходных, заканчивая современным компилятором на языке Java), уделяется повышенное внимание лексическому, синтаксическому и семантическому разбору программ в исходном коде, генерации машинного кода.

В.А.Серебряков, М.П.Галочкин.Основы конструирования компиляторов

Ещё один учебник по созданию компиляторов, только теперь отечественный. Глубоко раскрыты темы лексического и семантического анализа, рассмотрены темы автоматизации процесса разработки компиляторов, получения оптимального кода.

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

Интерпретатор (interpreter) — программа или техническое средство, выполняющее интерпретацию, а также вид транслятора, осуществляющего пооперационную (покомандную) обработку и выполнение исходной программы или запроса. В отличие от компилятора, который осуществляет трансляцию всей программы высокого уровня в машинные коды один раз без ее выполнения (создает объектную программу), интерпретатор транслирует исходную программу команда за командой каждый раз при выполнении и не создает объектного модуля. За счет такого режима выполнение программы происходит медленнее, чем в случае ее обработки транслятором, однако при обработке интерпретатором программы выполняются сразу, без промежуточной стадии трансляции.

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

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

При этом интерпретатор извлекает из файла с исходным текстом одну команду, распознает ее и вызывает те или иные функции операционной системы. Интерпретатор определяет команду и переводит (интерпретирует) ее так, чтобы операционная система поняла, что от нее хотят. Скорость выполнения программ в режиме интерпретации намного ниже, чем у компилированного кода, за счет того, что работа программы идет не напрямую с центральным процессором на языке машинных команд, а через программу-посредника, которая и тратит большое количество времени на распознавание исходного текста. В отличие от интерпретаторов, компиляторы «знакомятся» с исходными текстами программы всего один раз, когда делают из текста на языке программирования машинный код.

Простые интерпретаторы анализируют и выполняют (интерпретируют) программу последовательно (покомандно или построчно). Синтаксические ошибки обнаруживаются, когда интерпретатор приступает к выполнению команды (строки) содержащей ошибку. Сложные интерпретаторы компилирующего типа перед выполнением производят компиляцию исходного кода программы в машинный или «промежуточный код». Они быстрее выполняют большие и циклические программы, не занимаются анализом исходного кода в реальном времени. Некоторые интерпретаторы для начинающих программистов (преимущественно, для языка Бейсик) могут работать в режиме диалога, добавляя вводимую строку команд в программу (в памяти) или выполняя команды непосредственно.

Интерпретация (в программировании)

Интерпретация языков программирования, один из методов реализации языков программирования на электронных вычислительных машинах (ЭВМ). При И. каждому элементарному действию в языке соответствует, как правило, своя программа, реализующая это действие, и весь процесс решения задачи представляет собой моделирование на ЭВМ соответствующего алгоритма, записанного на этом языке. При И. скорость решения задач обычно значительно ниже, чем при других методах, однако И. легче реализуется на ЭВМ, а во многих случаях (например, при моделировании работы одной ЭВМ на другой) оказывается и единственно пригодной.

a. объектным кодом программы,

b. графическими примитивами,

c. загрузочным модулем,

d. исходным текстом программы.

52. Обязательным критерием качества программных систем является …

    1. легкость применения,
    2. надежность,
    3. мобильность,
    4. универсальность.

53. Проектирование программ путём последовательного разбиения большой задачи на меньшие подзадачи соответствует…

a. восходящему («снизу — вверх») проектированию,

b. нисходящему («сверху — вниз») проектированию,

c. объектно-ориентированному проектированию,

d. концептуальному моделированию.

54. Методом в объектно-ориентированном программировании является…

a. атрибут, объединяющий объекты в классы,

b. процедура, реализующая действия (операции) над объектом,

c. журнал изменений состояния объекта,

d. визуально свойство объекта.

55. Транслятор, который осуществляет перевод исходной программы в эквивалентную ей результирующую программу на языке машинных команд, называется….

a.

Что такое компилятор, интерпретатор, транслятор

машинным кодом,

b. компилятором,

c. ассемблером,

d. интерпретатором.

56. Для задач анализа и понимания естественных языков на основе языка формальной логики и методов автоматического доказательства теорем используется язык программирования…

a. PROLOG,

b. BASIC,

c. PASCAL,

d. JAVASCRIPT.

57. Главная идея структурного программирования состоит в том, что…

a. структура системы описывается в терминах объектов и связей между ними, а поведение системы- в терминах обмена сообщениями между объектами,

b. используется инкапсуляция и наследование объектов,

c. основными для написания программ являются три типа операторов: линейный, ветвление, организация цикла,

d. при написании программ не используется подпрограммы.

58. Классом в объектно-ориентированном программировании является…

a. матрица ненулевых элементов,

b. множество объектов , имеющих общее поведение и общую структуру,

c. переменная,

d. диапазон значений.


Предыдущая19202122232425262728293031323334Следующая


Дата публикования: 2014-11-02; Прочитано: 282 | Нарушение авторского права страницы



studopedia.org — Студопедия.Орг — 2014-2018 год.(0.001 с)…

Я недавно прочитал всю книгу Драконов (просто для удовольствия, я не собираюсь реализовывать настоящий компилятор), и я остался с этим большим вопросом, болтающимся у меня в голове.

Чем отличается реализация компилятора и интерпретатора?

Для меня компилятор состоит из:

  • лексер
  • Parser (который строит дерево синтаксиса)
  • Сгенерировать промежуточный код (например, 3 адресных кода)
  • Сделайте все эти сумасшедшие вещи, чтобы оптимизировать, если хотите 🙂
  • Сгенерируйте «сборку» или «собственный код» из 3-х адресного кода.

Теперь, очевидно, интерпретатор также имеет тот же лексер и парсер, что и компилятор.
Но что он делает после этого?

  • Он «читает» дерево синтаксиса и выполняет его непосредственно? (вроде как указатель инструкции, указывающий на текущий узел в дереве, а выполнение — один большой обход дерева плюс управление памятью для стека вызовов) (и если да, то как это делается?) Я надеюсь, что выполнение лучше, чем огромный оператор switch, который проверяет, какой тип узла он)

  • Создает ли он 3 адресных кода и интерпретирует это? (если да, то как это делается? Опять же, я ищу что-то более элегантное, чем инструкция с переключателем длиной в милю)

  • Он генерирует реальный собственный код, загружает его в память и запускает? (в какой момент я предполагаю, что это уже не переводчик, а скорее как JIT-компилятор)

Кроме того, в какой момент решается понятие «виртуальная машина»? Что вы используете на языке виртуальной машины? (чтобы быть понятным о моем уровне невежества, для меня виртуальная машина — VMWare, я понятия не имею, как концепция виртуальной машины применяется к языкам программирования / исполняющим программам).

Как вы можете видеть, мой вопрос довольно широк. В основном я ищу не только тот метод, который используется, но в основном для того, чтобы сначала понять большие понятия, а затем понять, как он работает в деталях. Я хочу уродливые, сырые детали. Очевидно, что это скорее поиски ссылок на вещи, которые нужно читать, а не ожидать, что вы ответите на все эти детали здесь.

Благодаря!
Даниил

EDIT: Спасибо за ваши ответы. Я понял, что мой титул вводит в заблуждение. Я понимаю «функциональную» разницу между компилятором и интерпретатором.
То, что я ищу, — это разница в том, как вы реализуете интерпретатор, а не компилятор.
Теперь я понимаю, как реализован компилятор, вопрос в том, как интерпретатор отличается от этого.

Например: VB6 явно является компилятором и интерпретатором. Теперь я понимаю часть компилятора. Тем не менее, я не могу понять, как при работе внутри IDE это может позволить мне остановить программу в любой произвольной точке, изменить код и возобновить выполнение с помощью нового кода. Это всего лишь один крошечный пример, это не тот ответ, который я ищу. То, что я пытаюсь понять, как я объясняю ниже, — это то, что происходит после того, как у меня есть дерево синтаксического анализа.

Интерпретаторы и компиляторы

Компилятор будет генерировать новый код из него на «целевом» языке. Что делает интерпретатор?

Спасибо за помощь!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *