Содержание

1.3 Компилятор и интерпретатор — Основы программирования

Как Компилятор так и Интерпретатор имеют одно предназначение — конвертировать инструкции языка высокого уровня (как C или Java) в бинарную форму, понятную компьютеру. Это программное обеспечение, используемое для запуска высокоуровневых программ и кодов выполняемых различные задачи. Для разных высокоуровневых языков разработаны специфичные компиляторы/интерпретаторы. Не смотря на то что как компилятор так и интерпретатор преследуют одну и ту же цель, они отличаются способом выполнения своей задачи, то есть конвертирования высокоуровневого языка в машинные инструкции. В этой статье мы поговорим о базовой работе обоих и выделим главные отличия между компилятором и интерпретатором.

Компилятор

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

На картинке показано базовое очертание процесса компиляции. Тут программа написанная на языке высокого уровня показана как «Исходный код», а сконвертированный называется «Исполняемый код».

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

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

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

Ниже перечислены главные отличия между компилятором и интерпретатором:

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

Как работает интерпретатор / компилятор



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

compiler-construction interpreter
Поделиться Источник developer     04 марта 2010 в 06:24

8 ответов


  • Использует ли CUDA интерпретатор или компилятор?

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

  • Как компилятор и интерпретатор используются на одном языке?

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



60

Компиляторы

Компиляторы были первым видом программ-переводчиков, которые были написаны. Идея проста: вы пишете программу, а затем передаете ее компилятору, который ее переводит. Затем вы запускаете результат.

Переводчики

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

д.

Характеристики компилятора:

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

Характеристики переводчика:

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

Поделиться Adriaan Stander     04 марта 2010 в 06:29



31

Переводчик S — > T принимает код, выраженный на исходном языке S, и переводит его в эквивалентный код, выраженный на другом (целевом) языке T.

Примеры переводчиков:

  • Компиляторы-переводит высокоуровневый код в низкоуровневый, например Java — > JVM
  • Ассемблеры-переводит код языка assembly в машинный код, например x86as — > x86
  • Высокоуровневые переводчики-переводят код с одного PL на другой, например Java — > C
  • Декомпиляторы-переводят низкоуровневый код в высокоуровневый, например Java JVM байт-код -> Java

Переводчик с можно кода, выраженная в языке С, и немедленно выполняет этот код. Он работает, извлекая, анализируя и выполняя одну инструкцию за раз.

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

  • Интерпретация программы намного медленнее, чем выполнение собственного машинного кода
  • Интерпретация языка высокого уровня происходит в ~100 раз медленнее
  • Интерпретация языка среднего уровня (например, байт-кода JVM) происходит ~10 медленнее
  • Если инструкция вызывается повторно, она будет многократно проанализирована — отнимает много времени!
  • Нет необходимости компилировать код

Поведение

  • Компилятор переводит исходный код в машинный, но не выполняет исходный или объектный код.

  • Интерпретатор выполняет исходный код по одной инструкции за раз, но не переводит исходный код.

Представление

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

Интерпретирующие компиляторы

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

Интерпретирующий компилятор сочетает быстрый перевод с умеренно быстрым исполнением при условии, что:

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

Пример: JDK предоставляет интерпретирующий компилятор для Java.

Поделиться martynas     04 мая 2014 в 12:48



19

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

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


(источник: answers.com )

Как правило, интерпретатор стоит дорого.

Поделиться KMån     04 марта 2010 в 07:31


  • Динамический / статический язык и компилятор / интерпретатор

    У меня есть несколько вопросов: Динамический язык программирования всегда интерпретируется? Думаю, да, но почему? Существуют ли какие-либо динамические языки со статической системой набора текста? Язык программирования со статической системой типизации всегда компилируется? Другими словами,…

  • PHP Интерпретатор / Компилятор

    Я пытаюсь понять, как работает компилятор/интерпретатор php.

    Я попытался загрузить исходный код php и попытался понять, как он работает. Я не смог найти соответствующую документацию. WOuld было бы здорово, если бы кто-то мог пролить свет на модули, которые делают компилятор php, а также на то, как…



18

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

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

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

Например: компилятор выдаст почти всю ошибку сразу, но интерпретатор будет работать до тех пор, пока инструкция, которую вы написали неправильно

Как работает интерпретатор / компилятор?

  • В отличие от компилируемых языков, которые переводятся на машинный язык заранее (справа).
  • Интерпретируемые языки переводятся во время выполнения.
  • интерпретаторы dBASE и BASIC (средние) переводят исходный исходный код.
  • Java и интерпретаторы Visual Basic (слева) переводят байт-код , который является промежуточным языком, скомпилированным из исходного исходного кода .

Источник

Поделиться Premraj     21 июля 2015 в 23:18



7

Разница в том, как они работают

Вопрос: для чего используются компиляторы и интерпретаторы ?

Ответ: большинство программ написаны на языках высокого уровня (c#,java…). языки высокого уровня-это те, которые содержат понятные слова и фразы. С другой стороны, компьютер (к тому времени, когда я написал эту статью) понимает машинный код, который является 0-м и 1-м только двоичным/машинным кодом. Поэтому нам нужно преобразовать высокоуровневый код в исходный код, который является (Machine code/binary)., отсюда и слово converting.

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

Но у обоих есть другой способ ‘Translating’ код

Разница:

Компилятор:

преобразует исходный код в какую-то промежуточную форму. Для статического языка компилятор обычно преобразует исходный код в assembly, который обычно не хранится на диске, затем ассемблер вызывается для преобразования assembly в двоичный код, который обычно хранится в виде объектного файла (обычно суффикс.o или .obj), затем компоновщик вызывается для связывания объектных файлов с двоичным исполняемым файлом. Также принято называть весь этот процесс компиляции, сборки, связывания компиляцией. Таким образом, вы можете вызвать gcc компилятор, но на самом деле он вызывает cc1, который является компилятором для компиляции, as, который является ассемблером для сборки, ld, который является компоновщиком для связывания.

Переводчик:

язык, который имеет промежуточную так называемую форму байт-кода, исходный код сначала преобразуется в байт-код, этот процесс можно назвать компиляцией, примером служит javac. Байт-код не может быть запущен на хост-машинах, ему нужна программа, которая на самом деле является процессом с точки зрения OS, чтобы интерпретировать байт-код на хост-машине, эта программа называется интерпретатором, подумайте о java. Некоторые языки, такие как python, выполняют компиляцию и интерпретацию с помощью одного

— оба из: https://www.quora.com/What-are-the-differences-between-a-compiler-an-interpreter-and-an-assembler-Provide-examples

Сравнение

Переводчик

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

Компилятор

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

— от: https:/ / www.programiz.com / article/difference-compiler-interpreter

Примеры с языками

Интерпретированный

  • Python
  • Ruby
  • PHP
  • JAVA (Всемогущий)
  • Perl
  • R
  • Powershell

составленный

  • C
  • C++
  • C#
  • Objective-C
  • SWIFT
  • Fortran

Поделиться user 451     05 июня 2015 в 14:31



0

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

Выражаясь прямо и интуитивно:

  • Компилятор -это то, что переводит читаемый человеком исходный код в машинный код, который компьютер может прочитать и выполнить.

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

Поделиться Calculus     15 июня 2018 в 10:16



0

Компиляторы-компилятор переводит исходный язык на целевой. Затем целевой язык принимает входные данные и выдает выходные.

Компилятор создает целевой код путем компиляции исходного кода

затем целевой код принимает входные данные и выдает выходные

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

Интерпретатор сопоставляет ввод с выводом с помощью исходной программы

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

Справочник- компиляторы: принципы, методы и инструменты АХО ака драконья книга

Поделиться vaibhaw.vipul     25 февраля 2018 в 09:21



-1

Посмотрите на книгу PLAI, это лучшее вступление к реализации дыманического языка, которое я когда-либо находил:

Языки программирования: применение и интерпретация (c) Шрирам Кришнамурти

Эта книга посвящена написанию интерпретатора для динамического языка в схеме (dr.Racket), с ее помощью вы можете написать свой собственный интерпретатор для любого языка и добавить несколько советов по OOP из

и SmallTalk и SOM: простая объектная машина:

Все современные интерпретаторы включают компилятор внутри: компилируют высокоуровневые элементы в низкоуровневый, но переносимый байт-код или используют JIT для компиляции в машинный код в RAM.

PS: если кто-то хочет написать систему SmallTalk на Python, пожалуйста, обратите внимание на меня.

Поделиться Dmitry Ponyatov     28 марта 2017 в 07:17


Похожие вопросы:


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

Возможно ли, чтобы язык программирования имел интерпретатор и компилятор? если да, то как ? ** я думаю, что у RUBY есть компилятор и интерпретатор ** спасибо


Использует ли Python компилятор, интерпретатор или их комбинацию?

Возможный Дубликат : CPython-это интерпретатор байт-кода? Мой вопрос таков: Использует ли Python компилятор, интерпретатор или их комбинацию?


Что Titanium использует интерпретатор или компилятор

Может ли кто-нибудь объяснить мне, использует ли Titanium mobile интерпретатор или компилятор для создания приложений для Android и iOS.


Использует ли CUDA интерпретатор или компилятор?

Это немного глупый вопрос, но мне интересно, использует ли CUDA интерпретатор или компилятор? Мне интересно, потому что я не совсем уверен, как CUDA удается заставить исходный код работать на двух. ..


Как компилятор и интерпретатор используются на одном языке?

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


Динамический / статический язык и компилятор / интерпретатор

У меня есть несколько вопросов: Динамический язык программирования всегда интерпретируется? Думаю, да, но почему? Существуют ли какие-либо динамические языки со статической системой набора текста?…


PHP Интерпретатор / Компилятор

Я пытаюсь понять, как работает компилятор/интерпретатор php. Я попытался загрузить исходный код php и попытался понять, как он работает. Я не смог найти соответствующую документацию. WOuld было бы…


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

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


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

Как компилятор или интерпретатор используется в PHP. Может ли кто-нибудь объяснить.


Компилятор и интерпретатор предпочтительнее

Когда компилируемый язык предпочтительнее интерпретируемого и наоборот ? Я знаю, что компилятор компилирует весь код сразу и производит объектный код, в то время как интерпретатор интерпретирует код…

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

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

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

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

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

Сравнительная таблица

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

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

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

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

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

Фазы компилятора

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

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

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

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

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

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

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

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

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

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

  1. Компилятор берет программу целиком и переводит ее, а интерпретатор переводит оператор программы в оператор.
  2. Промежуточный код или целевой код генерируется в случае компилятора. В отличие от интерпретатора не создает промежуточный код.
  3. Компилятор сравнительно быстрее, чем Interpreter, поскольку компилятор берет всю программу за один раз, тогда как интерпретаторы компилируют каждую строку кода за другой.
  4. Компилятору требуется больше памяти, чем интерпретатору из-за генерации объектного кода.
  5. Компилятор представляет все ошибки одновременно, и трудно обнаружить ошибки в контрастном интерпретаторе, отображая ошибки каждого оператора одну за другой, и легче обнаружить ошибки.
  6. В компиляторе, когда в программе возникает ошибка, он останавливает ее перевод, и после устранения ошибки вся программа переводится снова. Напротив, когда в интерпретаторе возникает ошибка, она препятствует ее переводу, а после устранения ошибки перевод возобновляется.
  7. В компиляторе процесс требует двух шагов, в которых сначала выполняется перевод исходного кода в целевую программу, а затем выполнение. Находясь в интерпретаторе Это один шаг процесса, в котором исходный код компилируется и выполняется одновременно.
  8. Компилятор используется в таких языках программирования, как C, C ++, C #, Scala и т. Д. С другой стороны, Интерпретатор используется в таких языках, как Java, PHP, Ruby, Python и т. Д.

Заключение

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

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

Компиляторы и интерпретаторы. — Информатика, информационные технологии

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

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

Компиляторы полностью обрабатывают весь текст программы (его называют исходным кодом или source code). Они осуществляют поиск синтаксических ошибок, выполняют семантический анализ и только затем, если текст программы в точности соответствует правилам языка, его автоматически переводят (транслируют) на машинный язык (говорят: генерируют объектный код или object code). Нередко при этом выполняется оптимизация с помощью набора методов, позволяющих повысить быстродействие программы. Сгенерированный объектный код обрабатывается специальной программой — сборщиком или редактором связей, который производит связывание объектного и машинного кодов. Текст программы преобразуется в готовый к исполнению ЕХЕ-файл {исполнимый код), его можно сохранить в памяти компьютера или на диске. Этот файл имеет самостоятельное значение и может работать под управлением операционной системы. Его можно перенести на другие компьютеры с процессором, поддерживающим соответствующий машинный код.

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

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

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

Системы программирования.

Процесс создания программы включает:

Составление исходного кода программы (рисунок 1) на языке программирования.

Этап трансляции, необходимый для создания объектного кода программы.

Построение загрузочного модуля, готового к исполнению.

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

Рисунок 1. Процесс создания программы, готовой к исполнению

Совокупность этих программных средств входит в состав системы программирования:

Текстовый редактор (необходимый для создания и редактирования исходного кода программы на языке программирования).

Компилятор.

Редактор связей.

Отладчик.

Библиотеки функций.

Справочная система.

Статьи к прочтению:

Основы программирования: Компилятор и интерпретатор


Похожие статьи:

Компиляторы, интерпретаторы и байт-код | Computerworld Россия

Определение

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

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

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

Компиляторы, которым предстоит обеспечить значительное увеличение скорости вычислений, уже создаются в исследовательских лабораториях ряда компаний — Hewlett-Packard, Intel, MetaWare, Microsoft и других. В феврале прошлого года компания Silicon Graphics объявила о том, что ее оптимизированные компиляторы позволяют увеличить на 30-100% по сравнению с существующими продуктами производительность программ, работающих на компьютерах с процессорами Itanium и операционной системой Linux.

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

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

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

Другие пути

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

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

Идеология Java опирается на третий, своего рода компромиссный подход — байт-код. При использовании байт-кода высокоуровневые программы преобразуются в промежуточный вид, способный исполняться на различных аппаратных платформах. Байт-код Java преобразуется в машинный код с помощью специального интерпретатора, называемого виртуальной машиной Java (Java Virtual Machine — JVM). JVM формирует выделенное пространство в памяти, которое отделено от памяти основной системы, для хранения байт-кода и порождаемых структур.

Использование динамических (just-in-time, JIT — «точно в срок») компиляторов увеличивает производительность Java-приложений. В этом случае не JVM исполняет байт-код, а JIT-компилятор преобразует его в «родной» для данной машины код. Таким образом, с одной стороны, повышается производительность скомпилированного кода, а с другой — сохраняется переносимость, свойственная Java.

Hewlett-Packard придерживается аналогичной тактики со своим TurboChai — средой Java для встроенных приложений. В TurboChai производительность увеличивается за счет преобразования наиболее часто используемого кода в данном встроенном приложении. С помощью выборочной компиляции в HP стараются оптимальным образом управлять использованием памяти, в то же время достигая скоростей, сравнимых с теми, которых позволяют добиться JIT-компиляторы. TurboChai использует байт-код Java в качестве входной информации и генерирует исходные тексты ANSI C, а затем использует любой компилятор для языка Си для получения оптимизированного «родного» машинного кода.

В прошлом году Microsoft анонсировала C#, объектно-ориентированный язык программирования, согласованный с XML. Корпорация подает новый язык как логическое продолжение Си и C++ для Web-приложений. Ключевыми модулями станут Common Language Runtime для C# и специальный компилятор, который преобразует текст, написанный на традиционных языках Кобол, Perl, Фортран или других, в промежуточный язык, который будет работать на новой платформе Microsoft .Net.

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


Создание инструментальных средств разработки
ИнструментарийЧто новогоЦели
Оптимизированные компиляторыОбеспечивают высокую производительность процессорной обработки за счет распараллеливания, предсказания ветвлений и спекулятивных вычисленийПомогают реализовать потенциал 64-разрядных процессоров
JIT-компиляторыВ реальном времени компилируют кодУвеличивают производительность интерпретируемых языков, таких как Java
«Выборочные» компиляторыКомпилируют только часто используемый кодУвеличивают производительность, не тратя понапрасну дорогостоящие ресурсы памяти

Поделитесь материалом с коллегами и друзьями

Как работает JavaScript. Ранее JavaScript предназначался для… | by Артур Хайбуллин | NOP::Nuances of Programming

Ранее JavaScript предназначался для использования в веб-браузерах, однако ситуация изменилась с развитием Node. Мы знаем, как, где и когда его использовать. Но известно ли, что происходит за этими сценариями?

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

JavaScript — это высокоуровневый ЯП, а компьютер понимает только единицы и нули. Каким образом компьютер понимает написанный код? В этой статье мы рассмотрим ответ на один единственный вопрос: как работает JavaScript?

Приступим.

Это главный герой, который отвечает за понимание компьютером JS-кода. Движок JavaScript принимает код и преобразует его в машиночитаемый язык. Он выполняет работу переводчика, преобразующего JS-код на понятный компьютеру язык. Как и JS, каждый ЯП также обладает движком, делающий написанный код понятным для компьютера.

У JavaScript есть множество различных движков, доступных для использования. На этой странице Википедии можно найти их список. Они также называются движками ECMAScript (подробнее об этом ниже).

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

Движок — это язык, который разбивает код и переводит его. А V8 — это один из самых популярных движков JavaScript, который используется в Chrome и NodeJS и написан на низкоуровневом языке C++. Написать движок может кто угодно, что может привести к путанице.

Для поддержания контроля за этими механизмами был создан стандарт ECMA, который предоставляет характеристики написания движка и всех функций JavaScript. По этой причине в ECMAScript 6, 7, 8 и т. д. реализованы новые функции JavaScript, а движки обновлены для поддержки этих новых функций. Следовательно, необходимо проверять доступность расширенной функции JS в браузерах во время разработки.

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

Теперь рассмотрим с более технической точки зрения.

Так выглядит движок JS изнутри. Вводимый код проходит через следующие стадии:

  1. Парсер
  2. AST
  3. Интерпретатор выдает байт-код
  4. Профайлер
  5. Компилятор выдает оптимизированный код

Не волнуйтесь, подробности рассмотрим в течение нескольких минут.

Однако для начала разберем важное различие.

Есть два способа преобразования кода в машиночитаемый язык. Концепция, о которой мы поговорим, применима не только к JavaScript, но и к большинству ЯП, таких как Python, Java и т. д.

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

Рассмотрим на примере.

function add(a, b) {
return a+b
}for(let i = 0; i < 1000; i++) {
add(1 + 1)
}

В приведенном выше примере функция add, которая добавляет два числа и возвращает сумму, вызывается 1000 раз.

  1. При передаче этого файла интерпретатору, он читает его построчно и сразу выполняет функцию, пока цикл не закончится. Таким образом, он просто переводит код в то, что компьютер понимает на ходу.
  2. При передаче этого файла компилятору, он читает всю программу, выполняет анализ действий и производит оптимизированный код на языке, который понимает машина. Это как взять X (JS-файл) и создать Y (оптимизированный код, понятный машине). Если использовать интерпретатор для Y (оптимизированный код), результат будет таким же, как при интерпретации X (JS-код).

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

  • Интерпретатор построчно преобразует исходный код в эквивалентный машинный код.
  • Компилятор сразу преобразует весь исходный код в машинный код.
  • Преимущество интерпретатора заключается в немедленном выполнении кода без необходимости компиляции, что может быть полезно для запуска JS-файлов в браузере. Однако процесс замедляется при необходимости преобразования большего количества JS-кода. Вспомните маленький фрагмент кода, в котором функция вызывалась 1000 раз. В этом случае вывод остается прежним, даже если функция add была вызвана 1000 раз. Такие ситуации замедляют работу интерпретатора.
  • В таких случаях компилятор может выполнить некоторые оптимизации, заменив цикл одним числом 2 (1 + 1 добавлялось каждый раз), поскольку он остается неизменным для всех 1000 итераций. Окончательный код, который выдает компилятор, оптимизирован и выполняется намного быстрее.

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

Теперь вернемся к основной схеме движка JS.

Итак, зная плюсы и минусы компилятора и интерпретатора, можно использовать преимущества каждого. Здесь и появляется компилятор JIT (Just In Time). Он представляет собой комбинацию интерпретатора и компилятора, и большинство браузеров теперь реализуют эту функцию для повышения эффективности. Движок V8 также использует эту функцию.

В этом процессе:

  1. Парсер идентифицирует, анализирует и классифицирует различные части программы. Например, устанавливает, является ли элемент функцией, переменной и т.д. с помощью ключевых слов JavaScript.
  2. Затем AST (абстрактные синтаксические деревья) создают древовидную структуру на основе классификации парсера. В AST Explorer можно узнать о том, как строится дерево.
  3. Затем дерево передается интерпретатору, который создает байт-код. Как мы узнали ранее, байт-код не является кодом самого низкого уровня, однако его можно интерпретировать. На этой стадии браузер работает с доступным байт-кодом с помощью движка V8, чтобы пользователю не приходилось ждать.
  4. В то же время профайлер ищет оптимизации кода, а затем передает входные данные компилятору. Компилятор выдает оптимизированный код, в то время как байт-код временно используется для рендеринга в браузере. Как только компилятор создает оптимизированный код, временный байт-код полностью заменяется новым оптимизированным кодом.
  5. Таким образом используются лучшие качества интерпретатора и компилятора. Интерпретатор выполняет код, в то время как профайлер ищет оптимизацию, а компилятор создает оптимизированный код. Затем байт-код заменяется оптимизированным кодом, который является кодом более низкого уровня, таким как машинный код.

Это означает, что производительность будет постепенно улучшаться, не блокируя время выполнения.

Как и в случае с машинным кодом, не все компьютеры понимают байт-код. Чтобы интерпретировать его на машиночитаемый язык, необходимо промежуточное ПО, такое как виртуальная машина, или движок (например, Javascript V8). По этой причине браузеры могут выполнять этот байт-код из интерпретатора во время вышеупомянутых 5-ти стадий с помощью движков JavaScript.

В результате возникает следующий вопрос:

Да, но не совсем. На ранних этапах JavaScript Брендан Айк создал движок JavaScript ‘SpiderMonkey’. У движка был интерпретатор, который говорил браузеру, что нужно делать. Сейчас есть не только интерпретаторы, но и компиляторы, а код не только интерпретируется, но и компилируется для оптимизации. Технически все зависит от реализации.

Читайте также:

Почему первый компилятор был написан до первого интерпретатора?

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

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

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

Чтобы быть правдой, простота, требуемая от компиляторов, была такова, что компиляторы были не очень хороши (оптимизация кода все еще находилась в зачаточном состоянии, когда вообще рассматривалась). Рукописный машинный код имел, по крайней мере, до конца шестидесятых годов, репутацию значительно более эффективного, чем код, сгенерированный компилятором. Была даже концепция коэффициента расширения кода , которая сравнивала размер скомпилированного кода с работой очень хорошего программиста. Обычно оно было больше 1 для большинства (всех?) Компиляторов, что означало более медленные программы и, что гораздо важнее, более крупные программы, требующие больше памяти. Это было все еще проблемой в шестидесятых.

Интерес компилятора заключался в простоте программирования, особенно для пользователей, которые не были специалистами по вычислительной технике, таких как ученые в различных областях. Этот интерес был не производительность кода. Но все же время программиста считалось дешевым ресурсом. Стоимость была в компьютерное время, до 1975-1980, когда стоимость перешла от аппаратного обеспечения к программному обеспечению. Это означает, что некоторые профессионалы не воспринимали всерьез даже компилятор .

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

Случай с Лиспом очень особенный, потому что это был чрезвычайно простой язык, который сделал его выполнимым (а компьютер стал немного больше в 58). Что еще более важно, интерпретатор Lisp был доказательством концепции самоопределимости Lisp ( мета-цикличности ), независимо от какой-либо проблемы юзабилити.

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

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

Компиляторы и интерпретаторы — это программы, которые помогают преобразовывать язык высокого уровня (исходный код) в машинные коды для понимания компьютерами. Компьютерные программы обычно пишутся на языках высокого уровня. Язык высокого уровня — это язык, понятный людям. Чтобы было понятно, они содержат слова и фразы из широко используемых языков, например английского или других языков. Однако компьютеры не могут понимать языки высокого уровня, как мы, люди.Они могут понимать только программы, разработанные в двоичных системах, известных как машинный код. Начнем с того, что компьютерная программа обычно пишется на языке высокого уровня, который описывается как исходный код. Эти исходные коды должны быть преобразованы в машинный язык, и здесь появляется роль компиляторов и интерпретаторов.
Различия между интерпретатором и компилятором
Интерпретатор переводит только один оператор программы за раз в машинный код. Компилятор сканирует всю программу и сразу переводит ее в машинный код.
Интерпретатору требуется гораздо меньше времени для анализа исходного кода. Однако общее время выполнения процесса намного меньше. Компилятору требуется много времени для анализа исходного кода. Однако общее время, необходимое для выполнения процесса, намного меньше.
Интерпретатор не генерирует промежуточный код. Следовательно, интерпретатор очень эффективен с точки зрения своей памяти. Компилятор всегда генерирует промежуточный объектный код. Потребуются дополнительные ссылки. Следовательно, требуется больше памяти.
Продолжает перевод программы непрерывно, пока не будет обнаружена первая ошибка. Если обнаружена какая-либо ошибка, она перестает работать, и, следовательно, отладка становится легкой. Компилятор генерирует сообщение об ошибке только после сканирования всей программы, и, следовательно, отладка при работе с компилятором относительно сложнее.
Интерпретаторы используются, например, в таких языках программирования, как Ruby и Python. Compliers используются, например, в языках программирования, таких как C и C ++.

Как работают интерпретатор и компилятор?

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

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

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

Реклама


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

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

Составители и интерпретаторы. Добро пожаловать во вторую статью в… | Фаисал Чироу | HackerNoon.com

Добро пожаловать во вторую статью из серии Давайте построим язык программирования (LBPL) . Если вы не знакомы с серией, цель LBPL — помочь вам перейти от 0 к 1 в реализации языка программирования.

Эта статья дает очень общий обзор структуры компиляторов и интерпретаторов.

Простейшее определение компилятора — это программа, которая переводит код, написанный на языке программирования высокого уровня (например, JavaScript или Java), в код низкого уровня (например, Assembly), непосредственно исполняемый компьютером или другой программой, например виртуальной машиной. .

Например, компилятор Java преобразует код Java в байт-код Java, выполняемый JVM (виртуальной машиной Java).Другими примерами являются V8, движок JavaScript от Google, который преобразует код JavaScript в машинный код, или GCC, который может преобразовывать код, написанный на языках программирования, таких как C, C ++, Objective-C, Go среди других, в собственный машинный код.

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

Компилятор можно разделить на 2 части.

  • Первый, обычно называемый , внешний интерфейс сканирует представленный исходный код на предмет синтаксических ошибок, проверяет (и при необходимости определяет) тип каждой объявленной переменной и гарантирует, что каждая переменная объявлена ​​перед использованием.Если есть какая-либо ошибка, он предоставляет пользователю информативные сообщения об ошибке. Он также поддерживает структуру данных, называемую таблицей символов , которая содержит информацию обо всех символах , найденных в исходном коде. Наконец, если ошибка не обнаружена, другая структура данных, промежуточное представление кода , строится из исходного кода и передается в качестве входных данных во вторую часть.
  • Вторая часть, серверная часть использует промежуточное представление и таблицу символов , созданную внешней частью для генерации кода низкого уровня.

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

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

Структура компилятора

Лексический анализ

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

Лексему можно рассматривать как однозначно идентифицируемую строку символов на исходном языке программирования, например, ключевые слова , такие как , если , , в то время как или func , идентификаторы , строки , номера , операторы или одиночные символы например (, ) , . или : .

Токен — это объект, описывающий лексему . Наряду со значением лексемы (фактическая строка символов лексемы) он содержит такую ​​информацию, как ее тип ( это ключевое слово? идентификатор? оператор? …) и позицию (номер строки и / или столбца) в исходном коде, где он встречается.

Последовательность лексем, сгенерированная во время лексического анализа

Если компилятор встречает строку символов, для которой он не может создать токен , он остановит свое выполнение, выдав ошибку; например, если он встречает неверно сформированную строку или число или недопустимый символ (например, не-ASCII-символ в Java).

Синтаксический анализ

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

Абстрактное синтаксическое дерево, созданное после синтаксического анализа.

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

Если на этом этапе ошибок не обнаружено, компилятор переходит к этапу семантического анализа .

Семантический анализ

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

  • Вывод типа . Если язык программирования поддерживает вывод типа, компилятор попытается определить тип всех нетипизированных выражений в программе. Если тип успешно выведен, компилятор аннотирует соответствующий узел в AST с информацией о выведенном типе.
  • Типовой контроль . Здесь компилятор проверяет, что все значения, присваиваемые переменным, и все аргументы, участвующие в операции, имеют правильный тип.Например, компилятор следит за тем, чтобы ни одной переменной типа String не было присвоено значение Double или что значение типа Bool не передается функции, принимающей параметр типа Double , или что мы не пытаемся разделить строку String на Int , «Hello» / 2 (если это не разрешено определением языка).
  • Управление символами . Наряду с выполнением вывода и проверки типов компилятор поддерживает структуру данных, называемую таблицей символов , которая содержит информацию обо всех символах (или именах), встречающихся в программе.Компилятор использует таблицу символов , чтобы ответить на такие вопросы, как Объявлена ​​ли эта переменная перед использованием? , Есть ли две переменные с одинаковыми именами в одной области? Каков тип этой переменной? Доступна ли эта переменная в текущей области? и многие другие.

Результатом этапа семантического анализа является AST с аннотациями и таблица символов .

Генерация промежуточного кода

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

Трехадресный код ( 3AC ) в простейшей форме — это язык, на котором инструкция является присваиванием и имеет не более 3 операндов.

Большинство инструкций в 3AC имеют вид a : = b <оператор> c или a : = b .

На приведенном выше рисунке изображен код 3AC , сгенерированный из аннотированного AST , созданного во время компиляции функции

  func  sum (n:  Int ):  Int  = {
n * (n + 1) / 2
}

Генерация промежуточного кода завершает фазу внешнего интерфейса компилятора.

Оптимизация

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

Например, очень простой оптимизацией кода 3AC в предыдущем примере было бы исключить временное присвоение t3: = t2 / 2 и напрямую присвоить id1 значение t2 / 2 .

Генерация кода

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

Завершим эту статью заметкой о разнице между компиляторами и интерпретаторами.

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

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

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

Вы дошли до конца. 🎉

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

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

Компилятор vs.Интерпретатор в программировании

1. Кросс-компилятор

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

2. Собственный компилятор

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

3. Компилятор начальной загрузки

Компилятор, написанный на языке, который он собирается компилировать.

4. Декомпилятор

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

5. Компилятор исходного кода (Transpiler)

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

Примеры:

  • Emscripten: переводит C / C ++ в JavaScript.
  • Babel: переносит код JavaScript с ES6 + на ES5.
  • Cfront: исходный компилятор для C ++ (примерно с 1983 г.).Он использовал C в качестве целевого языка и создал код C без стиля отступа и без красивого промежуточного кода C, поскольку сгенерированный код обычно не предназначался для чтения людьми.

6. Переписчик языка

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

7. Компилятор байт-кода

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

Примеры: компиляторы байт-кода для Java и Python.

8. Оперативный компилятор (JIT-компилятор)

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

Примеры:

  • Самый ранний опубликованный JIT-компилятор относится к LISP в 1960 году.
  • Последний метод появился в таких языках, как Smalltalk, в 1980-х.
  • Затем JIT-компиляция привлекла всеобщее внимание среди современных языков, таких как Java, . NET Framework, Python и самые современные реализации JavaScript.
JRE (Java Runtime Environment) Функциональность

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

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

9. Компиляция AOT

Компиляция с опережением времени (AOT) — это подход к компиляции языка программирования более высокого уровня или промежуточного представления, такого как байт-код Java, до выполнения.

Пример:

Инфраструктура Angular использует опережающий компилятор (AOT) для преобразования кода HTML и TypeScript в код JavaScript во время сборки, чтобы обеспечить более быструю визуализацию позже в браузере, когда код выполняется.

10. Ассемблер

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

Ассемблер

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

Компилятор и интерпретатор на Python | Различные реализации Python

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

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

Компилятор — это программа, которая переводит исходный язык или язык программирования высокого уровня (например, Java, C ++) в целевой машинный код (двоичные биты — 1 и 0), который ЦП может обрабатывать и понимать. Программа для перевода написана в редакторе и известна как исходные тексты.Акт перевода исходного кода в машинный или двоичный код известен как компиляция.
Используется компилятор, подходящий для языка программирования, в котором указано имя имени файла, содержащего исходные операторы. Во время компиляции все операторы языка будут проанализированы или проанализированы, чтобы убедиться в их правильности. Если ошибки нет, компилятор затем преобразует исходный код в машинный код, который затем готов к выполнению.
Результат компиляции также известен как объектный код или объектный модуль.Однако в объектно-ориентированном программировании его не следует путать с объектом, поскольку это не одно и то же.
Задача компилятора обычно делится на несколько этапов. Эти этапы включают лексический анализ, синтаксический анализ, сематический анализ, генератор промежуточного кода, оптимизатор кода и генератор кода. Каждый из этих этапов помогает преобразовать исходный код, разбивая его на токены, генерируя деревья синтаксического анализа и оптимизируя исходный код.

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

Интерпретатор — это программа, которая также преобразует язык программирования высокого уровня (например, Python, PHP, Perl) в машинный код.Несмотря на то, что он похож на компилятор, способ выполнения кода отличается для обоих. В отличие от компилятора, который просто преобразует исходный код в машинный код, интерпретатор может запускаться непосредственно как исполняемая программа. В отличие от компилятора, он преобразует исходный код в машинный код во время выполнения программы, а не до ее запуска.
Интерпретаторы не производят никакого промежуточного объектного кода, как компиляторы. В интерпретаторах исходный код компилируется и выполняется одновременно. Он продолжает переводить программу до тех пор, пока не обнаружит первую ошибку, после чего останавливается.Следовательно, легко отлаживать. В интерпретаторах исходные операторы выполняются построчно, в отличие от компилятора, который конвертирует всю программу сразу.
Интерпретатор также выполняет лексирование, синтаксический анализ и проверку типов, аналогично компилятору. Однако интерпретаторы напрямую обрабатывают синтаксическое дерево, а не генерируют из него код.

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

Python обычно называют интерпретируемым языком. Это означает, что каждая строка кода выполняется одна за другой.Однако это действительно связано с процессом компиляции. Причина, по которой Python называется интерпретируемым языком, заключается в том, что компилятор в Python выполняет относительно меньше работы, чем интерпретатор или компилируемый язык, такой как C или Rust.
Однако сам по себе язык программирования не говорит о том, где он компилируется или интерпретируется. Скорее, это решает свойство реализации. Интерпретатор Python обычно устанавливается как / usr / local / bin / python, если он доступен в системе.
В Python компиляция происходит, когда код компилируется в более простую форму, называемую байт-кодом. Байт-код на самом деле не интерпретируется в машинный код, если нет какой-либо реализации, такой как PyPy. Байт-коды выполняются виртуальной машиной Python (PVM), которая имитирует упрощенную среду выполнения.
Процесс компиляции в байт-код полностью неявный. Это означает, что вы никогда не вызываете компилятор. Вместо этого вы просто запускаете файл .py. Отсутствие явного шага компиляции является причиной того, что исполняемый файл Python известен как интерпретатор Python.
Первым шагом интерпретатора является чтение кода или инструкции Python. Затем он проверяет синтаксис каждой строки и проверяет, правильно ли отформатирована инструкция. Интерпретатор может отображать ошибки каждой строки одну за другой.
Важной особенностью Python является интерактивная подсказка. Оператор Python можно набрать и немедленно выполнить. Большинство скомпилированных языков могут не иметь такой интерактивности. Python компилируется в байт-код, и этот байт-код немедленно выполняется без явного шага компиляции.

Различные реализации Python

PyPy

PyPy — это интерпретатор Python, разработанный на основе RPython — подмножества языка программирования Python. Многие программисты предпочитают PyPy другим реализациям, поскольку он предлагает оптимальную скорость и производительность. Интерпретатор может очень быстро и эффективно понимать и интерпретировать исходный код Python. Он поставляется со встроенным компилятором Just-in-Time или JIT. Компилятор JIT используется для ускорения интерпретации исходных кодов PyPy по сравнению с другими интерпретаторами.
PyPy также может использоваться разработчиками для эффективного выполнения долговременных кодов. Различные исследования показывают, что Python более требователен к памяти по сравнению с другими языками программирования. Таким образом, разработчики пытаются найти способы уменьшить потребление памяти, не влияя на производительность приложения Python. Поскольку PyPy намного легче интерпретаторов, написанных на языке программирования C, таком как CPython, он снижает потребление памяти.

CPython

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

Джайтон

Jython — это еще одна реализация Python, которая компилирует код Python в байт-код Java. Используя Jython, мы можем запускать Python в любой среде, которая поддерживает и запускает виртуальную машину Java или JVM. Более того, он имеет возможность импортировать и использовать любой класс Java, например модуль Python. Jython поддерживает как статическую, так и динамическую компиляцию.

IronPython

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

Битерун

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

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

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

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

Компилятор

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

Все этапы компиляции исходного кода делятся на две фазы: , анализ, , и , синтез, .

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

Переводчик

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

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

Типы различий Компилятор Переводчик
Шаги программирования
  • Напишите программу в исходном коде.
  • Compile проанализирует операторы вашей программы и проверит их правильность.Если в программе обнаружена ошибка, выдается сообщение об ошибке.
  • Если программа не содержит ошибок, компилятор преобразует исходный код программы в машинный код.
  • Компилятор связывает все файлы кода в единую исполняемую программу, известную как exe-файл.
  • Наконец, он запускает программу и генерирует выходные данные.
  • Напишите программу в исходном коде.
  • Не происходит связывания файлов или машинный код не генерируется отдельно.
  • Программные операторы исходного кода выполняются построчно во время их выполнения. Если ошибка обнаруживается в каком-либо конкретном интерпретаторе операторов, он останавливает дальнейшее выполнение, пока ошибка не будет удалена.
Тип перевода Компилятор сразу переводит полный программный код высокого уровня в машинный код. Интерпретатор переводит по одному оператору программного кода за раз в машинный код.
Преимущество Поскольку исходный код уже преобразован в машинный код, время выполнения кода сокращается. Поскольку исходный код интерпретируется построчно, обнаружение и исправление ошибок становится проще.
Недостаток Если вы хотите изменить свою программу по какой-либо причине, будь то ошибка или логические изменения, вы можете сделать это, только вернувшись к исходному коду. Интерпретируемые программы могут работать только на тех компьютерах, на которых установлен один и тот же интерпретатор.
Машинный код Он хранит преобразованный машинный код из вашей исходной программы на диске. Он никогда не сохраняет машинный код на диске.
Продолжительность Компилятору требуется огромное количество времени для анализа исходного кода. Однако в целом скомпилированный программный код работает быстрее при сжатии интерпретатором. Интерпретатору требуется меньше времени для анализа исходного кода по сравнению с компилятором. Однако в целом интерпретируемый программный код работает медленнее по мере сжатия компилятора.
Создание программы Компилятор генерирует вывод программы (в виде файла exe), который может выполняться отдельно от программы с исходным кодом. Интерпретатор не генерирует отдельный машинный код в качестве выходной программы.Таким образом, он проверяет исходный код каждый раз во время выполнения.
Исполнение Процесс выполнения программы происходит отдельно от процесса ее компиляции. Выполнение программы происходит только после компиляции всей программы. Процесс выполнения программы является частью шагов интерпретации, поэтому он выполняется построчно одновременно.
Требования к памяти Скомпилированная программа преобразуется в промежуточный объектный код, и в дальнейшем требуется компоновка.Таким образом, требуется больше памяти. Интерпретируемая программа не генерирует промежуточный код. Таким образом, нет необходимости в дополнительной памяти.
Лучше всего подходит для Скомпилированная программа привязана к конкретной целевой машине. Для выполнения на машине требуется тот же компилятор; C и C ++ — самые популярные языки программирования, основанные на модели компиляции. В веб-средах компиляция занимает относительно больше времени для выполнения даже небольшого кода, который не может выполняться несколько раз.Поскольку время загрузки имеет важное значение в веб-среде, интерпретаторы лучше. JavaScript, Python, Ruby основаны на модели интерпретатора.
Ошибка выполнения Компилятор показывает полные сообщения об ошибках и предупреждения во время компиляции программы. Таким образом, невозможно запустить программу без исправления программных ошибок. Отладка программы при работе с компилятором сравнительно сложна. Интерпретатор читает программу построчно; он показывает ошибку, если присутствует в этой конкретной строке.Вы должны сначала исправить ошибку, чтобы интерпретировать следующую строку программы. Отладка сравнительно проста при работе с интерпретатором.

Достоинства и недостатки компилятора

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

Достоинства и недостатки переводчика

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


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

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

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

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

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

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

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

Сравнительная таблица

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Заключение

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

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

Что такое переводчик? | Интерпретатор против компилятора

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

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

ПЕРЕВОДЧИК ПРОТИВ КОМПИЛЯТОРА

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

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

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

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

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

И интерпретаторы, и компиляторы доступны для большинства языков высокого уровня.Однако BASIC и LISP специально разработаны для выполнения интерпретатором. Кроме того, языки описания страниц, такие как PostScript, используют интерпретатор. Например, каждый принтер PostScript имеет встроенный интерпретатор, выполняющий инструкции PostScript.

Динамический и статический набор текста

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

.