Разное

Отличие компилятора от интерпретатора: компилятор — Разница между компилятором и интерпретатором

Содержание

В чем разница между реализацией компилятора и интерпретатора?

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

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

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

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

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

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

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

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

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

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

спасибо!
Даниэль!—1—>


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

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

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

21

автор: Daniel Magliola

короткий ответ:

  • компилятор преобразует исходный код в исполняемый формат для последующего исполнения
  • интерпретатор оценивает исходный код для немедленного выполнения

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

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

интерпретатор, оптимизированный в фоновом режиме, также изучает лучшие способы выполнения кода возможно

summary: разница действительно сводится к «подготовке кода для последующего выполнения» или «выполнить код прямо сейчас»

7

автор: Steven A. Lowe

компилятор-это программа, которая переводит программу на одном языке программирования, в программу на другом языке программирования. Вот так — просто и ясно.

интерпретатор переводит язык программирования в его семантическое значение.

чип x86 является интерпретатором для машинного языка x86.

Javac-это компилятор java для виртуальной машины java. java, исполняемое приложение, является интерпретатором для jvm.

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

интерпретаторы обычно, но не всегда, имеют цикл чтения-оценки-печати.

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

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

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

Это не так ясно, как раньше. Раньше он строил дерево синтаксического анализа, связывал его и выполнял его (часто связывая в последнюю секунду).

BASIC был в основном сделан таким образом.

вы можете утверждать, что вещи, которые запускают байт — код (java/.net) без выполнения JIT, являются interpriters-но не в традиционном смысле, так как вам все еще нужно «скомпилировать» байт-код.

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

Это было гораздо менее формально, чем настоящая книга дракона, но я надеюсь, что это информативно.

в отношении этой части вашего вопроса, на который другие ответы на самом деле не обращались:

кроме того, в какой момент концепция
«виртуальной машины»? Что
вы используете виртуальную машину для
язык?

виртуальные машины, такие как JVM или CLR, являются уровнем абстракции, который позволяет повторно использовать оптимизацию компилятора JIT, сборку мусора и другие детали реализации для совершенно разных языков, которые скомпилирован для запуска на виртуальной машине.

Они также помогают вам сделать спецификацию языка более независимой от фактического оборудования. Например, хотя код C теоретически переносим, вам постоянно приходится беспокоиться о таких вещах, как endianness, размер типа и выравнивание переменных, если вы действительно хотите создать переносимый код. В то время как с Java JVM очень четко указан в этих отношениях, поэтому языковому дизайнеру и его пользователям не нужно беспокоиться о них; это работа JVM implementer для реализации указанного поведения на фактическом оборудовании.

2

автор: Michael Borgwardt

после того, как дерево разбора доступно, существует несколько стратегий:

1) непосредственно интерпретировать AST (Ruby, оригинальный интерпретатор WebKit)
2) преобразование кода — > в байтовые коды или машинный код

для достижения Edit-and-Continue счетчик программы или указатель инструкции должны быть пересчитаны и перемещены. Это требует сотрудничества со стороны IDE, поскольку код может быть вставлен до или после маленькой желтой стрелки.

один из способов это может быть сделано для встраивания позиции счетчика программы в дерево синтаксического анализа. Например, может быть специальное заявление под названием «break». Счетчик программы должен быть расположен только после инструкции «break» для продолжения работы.

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

Если вы ищете книгу, структура и интерпретация компьютерных программ («книга Мастера») — хорошее место, чтобы начать с концепций интерпретатора. Вы всегда имеете дело только с кодом схемы, который может быть пройден, оценен и передан, как если бы это был AST.

и Питер Норвиг имеет короткий пример, объясняющий основную идею с помощью Python (со многими другими примерами в комментариях), и вот еще один маленький пример в Википедии.

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

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

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

для VMs: plinth и j_random_hacker описали компьютерное оборудование как своего рода интерпретатор. Верно и обратное — интерпретаторы-это машины; их инструкции оказываются более высокого уровня, чем инструкции реального Иса. Для интерпретаторов VM-стиля программы фактически напоминают машинный код, albiet для очень простая машина. байт-код Java использует всего несколько «регистров», один из которых содержит счетчик программ. Таким образом, интерпретатор VM больше похож на аппаратный эмулятор, чем интерпретаторы в примерах, которые я связал выше.

но обратите внимание, что по причинам скорости Oracle JVM по умолчанию работает, переводя запуски инструкций байт-кода Java в инструкции x86 («just in time compilation»).

НОУ ИНТУИТ | Лекция | Основы компиляторов

Аннотация: Основные понятия. Компиляторы и интерпретаторы. Входной язык, целевой
язык, язык реализации. T-диаграммы. Прямой компилятор. Раскрутка. Кросс-трансляторы.
Виртуальные машины. Компиляция «на лету».

Основные задачи компиляторов

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

Трансляторы бывают двух типов: компиляторы (compiler) и интерпретаторы (interpreter). Процесс компиляции состоит из двух частей: анализа (analysis) и синтеза (synthesis). Анализирующая часть компилятора разбивает исходную программу на составляющие ее элементы (конструкции языка) и создает промежуточное представление исходной программы. Синтезирующая часть из промежуточного представления создает новую программу, которую компьютер в состоянии понять. Такая программа называется объектной программой. Объектная программа может в дальнейшем выполняться без перетрансляции. В качестве промежуточного представления обычно используются деревья, в частности, так называемые деревья разбора. Под деревом разбора понимается дерево, каждый узел которого соответствует некоторой операции, а сыновья этого узла — операндам.

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

В отличие от компилятора, интерпретатор не создает никакой новой программы, а просто выполняет каждое предложение языка программирования. Можно сказать, что результатом работы интерпретатора является «число».

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

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

Компилятор

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

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

Существует огромное количество различных языков программирования, начиная с таких традиционных языков программирования как Fortran и Pascal и кончая современными объектно-ориентированными языками такими, как C# и Java. Практически каждый язык программирования имеет какие-то особенности с точки зрения создателя транслятора. Однако мы начнем с рассмотрения разнообразных целевых языков компиляторов.

Определение транслятора, компилятора, интерпретатора и ассемблера — Студопедия

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

Результатом работы транслятора будет результирующая программа, но только в том случае, если текст исходной программы является правильным — не со­держит ошибок с точки зрения синтаксиса и семантики входного языка. Если исходная программа неправильная (содержит хотя бы одну ошибку), то результатом работы транслятора будет сообщение об ошибке (как правило, с допол­нительными пояснениями и указанием места ошибки в исходной программе). В этом смысле транслятор сродни переводчику, например, с английского, которому подсунули неверный текст.

Компилятор – это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера.

Таким образом, компилятор отличается от транслятора лишь тем, что его ре­зультирующая программа всегда должна быть написана на языке машинных ко­дов или на языке ассемблера. Результирующая программа транслятора, в общем случае, может быть написана на любом языке — возможен, например, транслятор программ с языка Pascal на язык С. Соответственно, всякий компилятор являет­ся транслятором, но не наоборот — не всякий транслятор будет компилятором. Например, упомянутый выше транслятор с языка Pascal на С компилятором яв­ляться не будет.

Ассемблер – компилятор, который переводит каждую команду исходной программы в одну машинную команду.



Интерпретатор — это программа, которая воспринимает входную программу на исходном языке и выполняет ее.

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

4.3 Общая схема работы компилятора

Основные функции компилятора:


1) проверка исходной цепочки символов на принадлежность к входному языку;

2) генерация выходной цепочки символов на языке машинных команд или ассемблере.

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

На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код.

Данные этапы состоят из более мелких стадий, называемых фазами. Состав фаз и их взаимодействие зависит от конкретной реализации компилятора. Но в том или ином виде в каждом компиляторе выделяются следующие фазы:

1) лексический анализ;

2) синтаксический анализ;

3) семантический анализ;

4) подготовка к генерации кода;

5) генерация кода.

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

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

Общая схема работы компилятора представлена на рисунке 4.3.

 
 

Рисунок 4.1– Общая схема работы компилятора

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

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

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

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

Транслятор (от английского 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), уделяется повышенное внимание лексическому, синтаксическому и семантическому разбору программ в исходном коде, генерации машинного кода.

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

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

Разница между компилятором и интерпретатором (со сравнительной таблицей)

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

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

Компилятор и интерпретатор — это разновидности языкового переводчика. Что такое языковой переводчик? Этот вопрос может возникнуть у вас в голове.

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

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

  1. Таблица сравнения
  2. Определение
  3. Ключевые отличия
  4. Заключение

Таблица сравнения

Основа для сравнения Компилятор Интерпретатор
Ввод Одновременно выполняется целая программа. Требуется по одной строке кода или инструкции за раз.
Выходные данные Создает промежуточный объектный код. Он не создает промежуточного объектного кода.
Рабочий механизм Перед выполнением выполняется компиляция. Компиляция и выполнение происходят одновременно.
Скорость Сравнительно быстрее Медленнее
Память Требование к памяти больше связано с созданием объектного кода. Он требует меньше памяти, так как не создает промежуточный объектный код.
Ошибки Отображать все ошибки после компиляции одновременно. Отображает ошибку каждой строки по очереди.
Обнаружение ошибок Сложно Сравнительно проще
Соответствующие языки программирования C, C ++, C #, Scala, машинописный текст использует компилятор. PHP, Perl, Python, Ruby используют интерпретатор.

Определение компилятора

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

Компилятор работает по фазам; различные этапы можно сгруппировать в две части:

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

Теперь давайте подробно разберемся в работе каждого этапа.

  1. Лексический анализатор : он сканирует код как поток символов, группирует последовательность символов в лексемы и выводит последовательность токенов со ссылкой на язык программирования.
  2. Syntax Analyzer : На этом этапе токены, сгенерированные на предыдущем этапе, проверяются на соответствие грамматике языка программирования, независимо от того, являются ли выражения синтаксически правильными или нет. Для этого он создает деревья синтаксического анализа.
  3. Семантический анализатор : Он проверяет, соответствуют ли выражения и операторы, сгенерированные на предыдущем этапе, правилу языка программирования, и создает аннотированные деревья синтаксического анализа.
  4. Генератор промежуточного кода : Он генерирует эквивалентный промежуточный код исходного кода.Существует много представлений промежуточного кода, но наиболее широко используется TAC (трехадресный код).
  5. Code Optimizer : Уменьшает потребность программы во времени и пространстве. Для этого он устраняет избыточный код, присутствующий в программе.
  6. Генератор кода : это последняя фаза компилятора, на которой создается целевой код для конкретной машины. Он выполняет такие операции, как управление памятью, назначение регистров и оптимизация для конкретной машины.

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

Определение переводчика

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

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

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

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

Ключевые различия между компилятором и интерпретатором

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

  1. Компилятор принимает программу в целом и переводит ее, а интерпретатор переводит оператор программы за оператором.
  2. Промежуточный код или целевой код генерируется в случае компилятора.В отличие от интерпретатора, не создает промежуточный код.
  3. Компилятор сравнительно быстрее, чем интерпретатор, так как компилятор берет всю программу за один раз, тогда как интерпретаторы компилируют каждую строку кода за другой.
  4. Компилятору требуется больше памяти, чем интерпретатору, из-за генерации объектного кода.
  5. Компилятор

  6. представляет все ошибки одновременно, и трудно обнаружить ошибки в контрастных ошибках отображения интерпретатора каждого оператора по отдельности, и легче обнаружить ошибки.
  7. В компиляторе при возникновении ошибки в программе он останавливает ее трансляцию, и после устранения ошибки вся программа переводится заново. Напротив, когда в интерпретаторе возникает ошибка, он предотвращает его перевод, и после устранения ошибки перевод возобновляется.
  8. В компиляторе процесс требует двух шагов, на которых сначала исходный код транслируется в целевую программу, а затем выполняется. В интерпретаторе Это одноэтапный процесс, в котором исходный код компилируется и выполняется одновременно.
  9. Компилятор используется в таких языках программирования, как C, C ++, C #, Scala и т. Д. С другой стороны, интерпретатор используется в таких языках, как PHP, Ruby, Python и т. Д.

Заключение

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

Хотя и компилятор, и интерпретатор имеют определенные преимущества и недостатки, например, интерпретируемые языки считаются кроссплатформенными, т.е.е., код переносимый. В отличие от компилятора, ему также не нужно предварительно компилировать инструкции, что позволяет сэкономить время. Скомпилированные языки быстрее в процессе компиляции.

.

Разница между интерпретатором и компилятором

Вы знакомы с компьютерным программированием? Если да, то там вы услышите термины интерпретатор и компилятор. Здесь вы получите подробную информацию о различии между интерпретатором и компилятором . Что ж, эти два термина очень сбивают с толку новичков, которые только начали учиться программировать.
Прежде чем узнавать различия, вы должны знать определение и то, какую работу они выполняют на самом деле. Этот контент поможет вам получить ответы и поможет различать интерпретатор и компилятор.

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

Что такое переводчик в компьютере

Как мы все знаем, компьютер понимает только двоичный код 0 и 1 , поэтому ему необходимо использовать стороннее приложение, чтобы понять язык. Если вы изучаете информатику, вы должны знать, что интерпретатор — это компьютерная программа, которая построчно выполняет написанный вами программный код.

Он преобразует код в двоичную форму, и компьютер сможет понять вашу команду. Здесь ваша команда описывается исходным кодом, и интерпретатор очень умен, чтобы выполнить команду.
Если в интерпретаторе отображается какая-либо ошибка, вы получите сообщение об ошибке от интерпретатора. Вы можете решить эту проблему, просто перейдя в точную командную строку.

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

Читайте также связанный пост: Типы топологии сети

Разница между ростом и развитием

Что такое компилятор в компьютере

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

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

Нет ничего важнее, чем запустить программу, написанную кодами с подходящими интерференциями.Компилятор выполнит эту работу за вас и выполнит программу. Компилятор берет целую программу за раз и компилирует их. Эта компиляция выполняется перед выполнением.

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

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

Примеры интерпретатора

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

Это популярные языки программирования, использующие компилятор и интерпретатор.

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

Сходства между компилятором и интерпретатором

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

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

  • Java использует и компилятор, и интерпретатор.

Читайте также: Разница между данными и информацией

Разница между HTTP и HTTPS

Преимущества компилятора над интерпретатором

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

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

Преимущества компиляторов

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

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

Если интерпретаторы переводят только построчную команду, компилятор переводит всю программу в машинное понимание. Вы также получите преимущества компьютера и Недостатки компьютера .

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

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

Хотя интерпретатор и компилятор имеют сходство между собой, есть и некоторые различия.Как вы знаете, некоторые языки используют компилятор, а некоторые — интерпретатор. Вы можете просмотреть эту сравнительную таблицу , чтобы лучше понять разницу между компилятором и интерпретатором . Давайте посмотрим на сравнительную таблицу ниже.

Краткое описание различий между интерпретатором и компилятором

КОМПИЛЯТОР ПЕРЕВОДЧИК
1. Он переводит полный исходный код за раз. 1. Он переводит по одной строке кода за раз.
1. Он переводит по одной строке кода за раз. 2. Сравнительно медленнее.
3. Для работы требуется больше памяти. 3. Интерпретатор использует меньше памяти, чем компилятор для выполнения.
4. Компилятору сложно обнаруживать ошибки. 4. Переводчику легче обнаруживать ошибки.
5. После сканирования всей программы отображается предупреждение об ошибке. 5. При обнаружении ошибки она останавливается.
6. Перед выполнением программы выполняется компиляция. 6. Компиляция и выполнение программы выполняются одновременно.

Надеюсь, вы поняли основные различия интерпретатора и компилятора. Два из них очень важны для определенных языков.

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

Постарайтесь выучить хотя бы один язык программирования в этом мире высоких технологий. Python — это язык, который использует и компилятор, и интерпретатор.

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

Связанный пост, который вы можете прочитать, чтобы расширить свои знания

Разница между Интернетом и Интранетом

Плюсы и минусы технологий

Разница между RAM и ROM

и более.Комментарии ниже, если у вас есть какие-либо вопросы.

.Компилятор

против интерпретатора — полная разница между компилятором и интерпретатором

В чем разница между компилятором и интерпретатором?

Компилятор — это компьютерная программа, которая преобразует язык высокого уровня (исходный код) в машинный язык (объектный язык), тогда как интерпретатор — это компьютерная программа, которая выполняет программы, написанные на языке высокого уровня (исходный код).

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

Интерпретатор против компилятора: сравнительная таблица

Различия между компилятором и интерпретатором приведены в таблице ниже:

Переводчик Компилятор
Различные этапы программирования:

1. Создание программы.
2. Нет генерации машинного кода или связывания файлов.
3. Операторы в исходном коде выполняются во время выполнения, по одной строке за раз.

Различные шаги программирования:

1. Создание программы.
2. Компиляция программы для синтаксического анализа или анализа операторов за один раз на их правильность.
3. В случае неправильной инструкции выдается ошибка.
4. Если программа не содержит ошибок, компилятор переведет ее из исходного кода в код двоичного языка.
5. Различные файлы кода связаны, чтобы сформировать исполняемую программу, называемую exe.
6. Программа выполнена.

После интерпретации программы могут работать только в системах, имеющих соответствующий интерпретатор. Программа не может быть изменена без возврата к исходному коду.
Интерпретаторы проверяют одну строку за другой, поэтому общее время, необходимое для интерпретации всей программы, больше, чем время, затрачиваемое компилятором на выполнение своей работы. Поскольку программный код уже переведен на машинный язык, время выполнения кода меньше. Он компилирует всю программу сразу и, следовательно, работает быстрее.
Интерпретатор не создает целевой код или промежуточный код . Компилятор генерирует целевой код или промежуточный код.
Интерпретатор не генерирует объектный код, поэтому требуется мало памяти. Компилятор генерирует объектный код, поэтому ему требуется больше места в памяти.
Интерпретатор отображает ошибки каждого отдельного оператора одну за другой; это позволяет пользователю легко обнаруживать ошибки Компилятор показывает все ошибки одновременно.Поэтому распознать ошибки по отдельности непросто.
Когда в интерпретаторе возникает ошибка, процесс перевода для определенной строки приостанавливается. Как только ошибка устранена, начинается процесс перевода следующей строки. В компиляторе, если в программе обнаруживается ошибка, процесс трансляции останавливается. После отладки вся программа снова проходит процесс перевода.
Он основан на модели интерпретации. Он основан на модели связывания и загрузки языкового перевода.
Интерпретатор используется для интерпретации программ, написанных на Ruby, Python, Java, PHP и т. Д. Компилятор полезен для компиляции языков программирования, таких как Scala, C, C ++, C # и т. Д.
В качестве входных данных принимает одну строку программного кода. Вся программа формирует входные данные для компилятора.
Интерпретатор подходит для разработки и программной среды. Компилятор лучше всего подходит для производственной среды.
Интерпретируемые машинные языки поддерживают причину динамического набора текста Динамическую типизацию сложно реализовать, поскольку компиляторы не могут предсказать события во время очереди.
Машинные коды вообще не сохраняются. Компилятор хранит машинный язык в виде машинных кодов на диске.

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

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

Роль компилятора

  • Компилятор должен соблюдать все установленные правила синтаксиса языка, на котором он был разработан.
  • Компилятор — это просто компьютерная программа. Он не способен отлаживать или исправлять ошибки, обнаруженные в программе.
  • В случае ошибки пользователям становится необходимо как можно скорее внести необходимые изменения в синтаксис программы, иначе она не сможет скомпилировать.
  • На этапе анализа компилятор проверяет грамматику, синтаксис и семантику кода, после чего может быть сгенерирован промежуточный код. Эта фаза включает семантический анализатор, лексический анализатор и синтаксический анализатор для его функциональности.
  • Фаза синтеза — это этап, на котором оптимизируется промежуточный код. На этом этапе также создается целевой код, который включает в себя генератор кода и оптимизатор кода.

Что такое переводчик?

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

Роль переводчика

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

Компилятор и интерпретатор Java

Java — это скомпилированный язык компьютерного программирования. Однако вместо непосредственной компиляции в исполняемый машинный код он сначала компилируется в двоичную промежуточную форму, называемую байт-кодом JVM. После этого байт-код компилируется или интерпретируется по мере необходимости для запуска программы.Поскольку Java является одновременно и интерпретатором, и компилируемым языком программирования, он часто известен как язык интерпретатора компилятора. Это также объясняет, использует ли Java компилятор или интерпретатор — он использует оба.

Заключение

Пункты выше хорошо объяснили определение, роль и различия между компилятором и интерпретатором . Объяснение компилятора и интерпретатора показывает, что они оба предназначены для выполнения одной и той же работы. Однако они, как правило, отличаются в своих операционных процедурах.Будь то интерпретатор на Java или компилятор, используемый для перевода команд Java, и у них есть свои плюсы и минусы, различные функции экономии времени, области приложений и т. Д.

.

Разница между компилятором и интерпретатором

В области компьютеров инструкции, данные пользователем, обычно на языке высокого уровня, тогда как компьютер понимает инструкции только в двоичном формате, язык компьютера известен как машинный язык. Единственная цель компилятора и интерпретатора — преобразовать заданный пользователем язык высокого уровня в язык машинного уровня, чтобы компьютер понимал и выполнял набор команд, управляемый пользователем.«Если и интерпретатор, и компилятор используются для единственной цели, то каково значение каждого из них, по этой причине текущий отчет направлен на изучение разницы между компилятором и интерпретатором ». Компилятор будет переводить вводимый пользователем язык высокого уровня на машинный язык, то есть в двоичные коды, тогда как интерпретатор также преобразует язык высокого уровня в язык машинного уровня, но интерпретатор сначала сгенерирует промежуточный код, а затем преобразует язык высокого уровня на язык машинного уровня.

Следующий контекст дает краткое описание различий между компилятором и интерпретатором

Разница между компилятором и интерпретатором:

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

Компилятор

— это уникальная программа, которая выполняет инструкции, написанные на определенном языке программирования, и преобразует их в машинный код, понятный компьютеру.Интерпретатор выполняет ту же работу, что и компилятор, но основным отличием является то, что он преобразует язык высокого уровня в промежуточный код, который выполняется процессором. Обычно разработчик составляет набор инструкций, используя любой язык программирования, такой как C, Java, Pascal, Python и т. Д. Инструкция, написанная программистом, называется исходным кодом. Программист должен запустить компилятор или интерпретатор, относящийся к языку, используемому для написания исходного кода.Интерпретатор исследует и последовательно запускает каждую строку исходного кода, не рассматривая сразу всю программу. Тем не менее, программы, созданные компиляторами, работают намного быстрее, чем те же самые инструкции, выполняемые интерпретатором.

Основные различия между компилятором и интерпретатором :
  • Компилятор переводит инструкцию высокого уровня на машинный язык, но интерпретатор переводит инструкцию высокого уровня в промежуточный код.
  • Компилятор выполняет всю программу за раз, но интерпретатор выполняет каждую строку отдельно.
  • Компилятор сообщает список ошибок, возникших в процессе выполнения, но интерпретатор прекращает перевод вскоре после обнаружения ошибки, выполнение других строк программы будет выполнено после уточнения ошибки.
  • Автономный исполняемый файл создается компилятором, в то время как интерпретатор является обязательным для программы интерпретатора.

Отличия на основе различных характеристик:
  • В компиляторе время анализа и обработки программы больше, в то время как интерпретатор тратит меньше времени на анализ и обработку программы.
  • Результирующий код компилятора имеет форму машинного кода или двоичного формата, в случае интерпретатора результирующий код находится в виде промежуточного кода.
  • В случае

.

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

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