Содержание

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

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

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

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

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

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

Основа для сравнениясоставительпереводчик
входЭто занимает всю программу за раз.
Это занимает одну строку кода или инструкции за один раз.
ВыходОн генерирует промежуточный объектный код.Он не производит никакого промежуточного объектного кода.
Рабочий механизм
Компиляция выполняется перед выполнением.Компиляция и исполнение происходят одновременно.
скорость
Сравнительно быстрееПомедленнее
объем памяти
Требование к памяти больше из-за создания объектного кода.Это требует меньше памяти, поскольку не создает промежуточный объектный код.
ошибки
Показать все ошибки после компиляции, все одновременно.Отображает ошибку каждой строки одну за другой.
Обнаружение ошибокСложноПроще сравнительно
Относящиеся языки программирования
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 и т. Д.

Заключение

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

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

Интерпретатор и компилятор: сходства и различия

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

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

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

Подробнее в статье:
История языков программирования: самый первый язык

Пример кода ассемблера

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

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

Про сложные языки здесь:

Какой язык программирования самый сложный

Высокоуровневые

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

На них разрабатывают разнообразные программы, начиная с игр и фоторедакторов, заканчивая нейросетями и обработчиками данных.

Код на JavaScript

Это всем знакомые Python, C++, C#, Java, PHP и многие другие ЯП. Они обладают как плюсами, так и минусами:

  • Объемность – программы на этих языках занимают много места в памяти, да и по скорости уступают предыдущим.
  • Портативность – работать с языками такого рода можно на почти любом компьютере. Написанные на них скрипты не связаны одной моделью процессора, и, зачастую, ограничены только операционной системой (Linux, macOS, Windows).
  • Понятность – высокоуровневые ЯП состоят из слов английского языка, их изучение намного проще.

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

Подробнее о видах ЯП тут:
Что такое язык программирования: виды и востребованность

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

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

Упрощенный принцип работы компилятора

Структура

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

  • Компиляция – сам транслятор кода;
  • Компоновка – процесс собирания переведенного кода в исполняемый файл.

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

Результат работы

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

Байт код

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

Переход от высокоуровневого языка к машинному коду

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

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

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

Типы

Обычный

Механизм его работы был описан выше. Он просто переводит и сразу выполняет команды по строкам и продолжает, если нет ошибок или каких-либо помех.

Компилирующего типа

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

Как он устроен

Чем же всё-таки различаются компиляторы и интерпретаторы?

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

Сильные и слабые стороны:

Преимущества компилятора:
  • Быстрота – пожалуй, самый основной плюс. Сначала код переводится в понятный машине вид, а уже после ее можно выполнить. Также прибавку к скорости дает тот факт, что перед исполнением вся программа проходит проверку на ошибки, и соответственно, программист не будет ждать пол часа, чтобы обнаружить пропущенную запятую в середине программы.
  • Надёжность – результат работы компилятора не зависит от исходного скрипта, поэтому у неаккуратного пользователя будет меньше шансов его испортить. Да и работа злоумышленников в таком случае значительно затруднена.
  • Кроссплатформенность – после компиляции можно получить выполняемую программу, например exe файл, распространение которого между операционными системами не составит труда.
Недостатки компилятора:
  • Объем — во время компиляции переводится вся программа, поэтому выходной файл выходит большим.
  • Точность – для того, чтобы компилировать программу, в ней не должно быть ошибок, что может быть проблематично, если вы хотите проверить только ее часть.
Преимущества интерпретатора:
  • Простота отладки – интерпретатор позволяет довольно легко устранять ошибки из скрипта. Ведь он выполняет код по строкам, и остановится, если в проверяемой строке ошибка, тем самым указав на нее.
  • Компактность – интерпретатор занимает намного меньше места в памяти компьютера.
Недостатки интерпретатора:
  • Медлительность – из-за особенностей своей работы, интерпретатор значительно уступает по скорости обработки кода другим трансляторам.
  • Привязанность – в то время как компилятор создает рабочую программу, интерпретатор лишь выполняет ее, поэтому каждый раз эту операцию нужно выполнять по новой, поэтому передавать интерпретируемый скрипт между компьютерами без подходящего интерпретатора не выйдет.

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

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

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

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

Процесс интерпретатора и компилятора:

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

 

                                            

Проблемы со скоростью:

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

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

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

Когда программа должна быть запущена и выполнена быстро, интерпретатор может сначала сыграть свою роль, сэкономив время компиляции и выполнив немедленно. После запуска программы компилятор постепенно вступает в игру со временем, и после компиляции все большего и большего количества кода в локальный код вы можете добиться более высокой эффективности выполнения. Когда ресурсы памяти среды выполнения программы ограничены, вы можете использовать интерпретатор для сохранения памяти, а для компиляции и выполнения вы можете использовать для повышения эффективности. В то же время интерпретатор также можно использовать в качестве запасного выхода для агрессивной оптимизации компилятора, что позволяет компилятору выбирать некоторые методы оптимизации, которые в большинстве случаев могут напоминать скорость работы в зависимости от вероятности. Когда гипотеза о радикальной оптимизации неверна, ее можно вернуть путем обратной оптимизации Объяснение статуса продолжается. Трансфер изhttps://blog.csdn.net/xuqiaobo/article/details/52534947


Интеллектуальная рекомендация

Инициализация загрузки Springboot

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

Глава 9 «Режим прототипа»

1.

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

javascript хранит два десятичных знака

Интуитивное объяснение функций активации сигмоида, танха и релю

Ссылка ссылка:https://www.cnblogs.com/hutao722/p/9732223.html     Код реализации: Графическое объяснение выглядит следующим образом: Сравнение трех функций:   Производные формулы трех ф…

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

Используйте лямбда, предоставляемую jdk8 для параллельных вычислений add2 использует параллельные потоки для вычислений, поэтому порядок вывода не гарантируется The behavior of this operation is expli…

Вам также может понравиться

Руководство пользователя Linux завершено

Руководство пользователя Linux завершено Операционная система — centos7 1. Загрузите китайский программный пакет. 2. Разархивируйте, скомпилируйте и установите 3. Чтобы не оскорблять человека, создаем…

Silverlight Quotation Bee двухмерная графическая библиотека Пример: форма линии (LineCap) в конце сегмента линии

LineCap указывает форму конечной точки открытого пути. Существует три разных типа: cap_butt, cap_round и cap_square. На следующем коде показаны три различных типа LineCap….

netty-time-Second Solution

Timeserver, TimeserverHandler в одной и той же статье. FrameDecoder is an implementation of ChannelHandler which makes it easy to which deals with the fragmentation issue. FrameDecoder calls decode me…

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

Это устройство позволяет вам наслаждаться полным погружением в изображения 360 ° VR и эффекты объемного звука 3D. вместе сВиртуальная реальностьС развитием всех слоев общества на рынке растет спро…

Говорить о весенней ботинке

Spring Boot Весенний дизайн загрузки — упростить начальную конструкцию и процесс разработки пружинных приложений.

После использования Sprilboot очень просто построить пружинное приложение и разработка…

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

 
Cyrax ©   (2006-11-20 13:44) [0]

1. Трансляторы, компиляторы и интерпретаторы
Транслятор (в пер. с англ. — «переводчик») – это программа, принимающая на вход программу на одном языке и преобразующая её в программу на другом языке. Исходными и це-левыми языками могут быть как языки высокого уровня, так и низкого (промежуточный байт код или язык ассемблера), в том числе и машинный код.
Примеры трансляторов: assembler (язык ассемблера -> машинный код), дизассемблер (язык ассемблера -> машинный код), компиляторы и декомпиляторы языков высокого уровня, утилита, преобразующая pascal-код  в C-код, javac (транслятор Java) и др.
Компилятор – это частный случай (разновидность) трансляторов. А именно, такой транслятор, который преобразует программу на некотором языке программирования в машинный код. В строгом понимании под машинным кодом следует понимать машинный код процессора. Именно такого понимания придерживаются авторы книги «PHP 5» Дмитрий Котеров и Алексей Костарев, рассматривающие процесс преобразования кода с языка высокого уровня на промежу-точный код (например, байт-код или p-код) как трансляцию (трансляцию в широком понимании, не относящейся к компиляции). С другой стороны, промежуточный код тоже можно рассматри-вать как машинный, только машиной уже является не процессор, а виртуальная машина (CLR для .NET и JVM для Java). Такая абстракция позволяет представить процесс преобразования кода с языка высокого уровня на промежуточный код как компиляцию (разновидность трансляции). Та-кой подход наиболее распространён. Универсальность первого подхода заключается в том, что он не противоречит второму подходу, поскольку компилятор – это транслятор.
Следует отметить, что процесс преобразования процессорного кода в промежуточ-ный нельзя рассматривать как компиляцию (это трансляция процессорного кода в промежуточ-ный), поскольку компиляция подразумевает обработку сверху вниз, т. е. от языка более высокого уровня к языку более низкого (тогда как трансляция может происходить в любом направлении, в том числе и на одном уровне (например, pascal -> С)).
Интерпретатор – это программа, «просматривающая» код на некотором языке про-граммирования и «выполняющая» одну его инструкцию за другой. Основной функцией про-грамм, транслирующих (в частности, компилирующих) и интерпретирующих код является та, ко-торая выполняется на последнем этапе работы таких программ. Поэтому программы, которые сначала транслируют (компилируют согласно второму подходу в понимании компиляторов) код на языке высокого уровня в промежуточный код, а затем его интерпретируют, называют интер-претаторами (с оптимизирующим транслятором (первый подход) или компилирующего типа (второй подход)).
Ключевые отличие интерпретаторов от компиляторов:
1. интерпретатор обнаруживает синтаксические ошибки только когда интерпретиру-ет данную инструкцию
2. интерпретируемые языки позволяют формировать и изменять команды в процессе выполнения программы (для компилируемых языков это возможно только на этапе работы пре-процессора с помощью макросов)
2. интерпретатор ещё и «выполняет» преобразуемый код (естественно, с помощью процессора)
В определении интерпретаторов также существует два подхода. Согласно первому подходу (авторы книги «PHP 5» Дмитрий Котеров и Алексей Костарев) интерпретаторы не явля-ются подмножеством трансляторов, поскольку интерпретаторы не выдают на выходе преобразо-ванного кода программы. Второй подход относит интерпретаторы к множеству трансляторов, по-скольку интерпретатор всё же транслирует инструкции в машинный код (которые сразу же вы-полняет процессор), хотя и не выдаёт преобразованный код программы.

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

Строгий подход Абстрактный подход
Сторонники авторы книги «PHP 5» Дмитрий Ко-теров и Алексей Костарев Авторы большинства статей в Ин-тернете
Классификация программ, преобра-зующих программный код Трансляторы и интерпретаторы. Компиляторы – частный случай трансляторов Трансляторы.
Компиляторы и интерпретаторы – частные случаи трансляторов
Характеристика интерпретаторов, выполняющих предварительную трансляцию в промежуточный код Интерпретатор с оптимизирующим транслятором или интерпретирую-щий транслятор (с основной функци-ей интерпретации) Интерпретатор компилирующего типа

Чистые компиляторы: C, C++, Pascal, Assembler
Чистые интерпретаторы: Basic, JavaScript, JScript, командный язык DOS (выполняю-щий bat-файлы), shell (командный язык Unix), Python и его разновидности, JVM (виртуальная машина Java), PHP до версии 3, CLR (общеязыковая среда исполнения технологии .NET).
Интерпретаторы с оптимизирующей трансляцией: PHP с версии 4, Perl
Трансляторы в промежуточный код: .NET-языки (Visual C#, Visual J#, Visual Basic .NET, Visual C++ .NET), javac (транслятор Java).

______________________________________________________________
Зацените статью и, собственно, своё мнение (только не обо мне, а об изложенном)…


 
Cyrax ©   (2006-11-20 13:46) [1]

Так, с таблицеё чё-то не вышло. Сейчас будет…


 
Александр Иванов ©   (2006-11-20 13:50) [2]

Слишком много букв, причем о вещах, которые уже описаны в толстенных книгах.


 
Игорь Шевченко ©   (2006-11-20 13:59) [3]


> Зацените статью

Графоманство


 
Курдль ©   (2006-11-20 14:04) [4]

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


 
KilkennyCat ©   (2006-11-20 14:04) [5]

ой.


 
Cyrax ©   (2006-11-20 14:09) [6]

Игорь Шевченко ©   (20.11.06 13:59) [3]

Зато всё по полочкам…

Александр Иванов ©   (20.11.06 13:50) [2]
Слишком много букв, причем о вещах, которые уже описаны в толстенных книгах.

В этих толстенных книгах везде написано по-разному. Причём об одних и тех же вещах — то копмилятор, то транслятор (или интерпретатор). Толковых разьяснений я ещё не встречал (только это, которое сам сочинил).
Я что -гений ?:))


 
boriskb ©   (2006-11-20 14:10) [7]

Cyrax ©   (20. 11.06 13:44)

Дельная вещь.
Ты разобрался.
В голове улеглось
Чтобы лучше улеглось, все постарался систематизировано записать.
Я так часто делал.

Только на всеобщее обозрение не надо было выставлять.
🙂


 
KilkennyCat ©   (2006-11-20 14:11) [8]

> Я что -гений ?:))

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


 
Джо ©   (2006-11-20 14:12) [9]

Много ошибок и неточностей. Например:
Чистые интерпретаторы: … JVM (виртуальная машина Java).
Ну, и см.  [4] Курдль ©.


 
Cyrax ©   (2006-11-20 14:14) [10]

boriskb ©   (20. 11.06 14:10) [7]

Возможно, выпендрёж…
Впрочем, я хотел обсудить детали. Чтоб не писать всё заново — копирнул.
Вот 4-й пост — вот это и нужно…


 
click   (2006-11-20 14:22) [11]

с дефисами проблемы имхо…
а в остальном… чтош, мысли в слух тебе удалось весьма похвально отформатировать…


 
Cyrax ©   (2006-11-20 14:27) [12]

Курдль ©   (20.11.06 14:04) [4]
Определение компилятора дано неточно (под это определение подходит и ассемблер).

Ну так чем ассемблер (не язык, а транслятор) не компилятор ??

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

Ну а это уже не чистые интерпретаторы…

Джо ©   (20.11.06 14:12) [9]
Много ошибок и неточностей. Например:
Чистые интерпретаторы: … JVM (виртуальная машина Java).

Что — не чистый ?


 
Vga ©   (2006-11-20 14:35) [13]

> Джо ©   (20.11.06 14:12) [9]
> Много ошибок и неточностей. Например:
> Чистые интерпретаторы: … JVM (виртуальная машина Java)
> .
>
> Что — не чистый ?

Это виртуальная машина. Причем, вполне может и сперва откомпилировать код, а потом запускать (JIT-компиляция).


 
Джо ©   (2006-11-20 14:39) [14]

> [12] Cyrax ©   (20.11.06 14:27)
> Что — не чистый ?

Совершенно верно. Равно как и технология .Net в которой также используется JIT-компиляция.


 
Курдль ©   (2006-11-20 14:41) [15]


> Cyrax ©   (20.11.06 14:27) [12]
> Ну так чем ассемблер (не язык, а транслятор) не компилятор ??

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

Основным отличием интерпретатора является то, что он транслирует и сразу инициирует выполнение предложения за предложением.


 
Курдль ©   (2006-11-20 14:43) [16]


> Джо ©   (20.11.06 14:39) [14]


> Vga ©   (20.11.06 14:35) [13]

Такие трансляторы называют Common-трансляторами.


 
Vga ©   (2006-11-20 14:46) [17]

> [16] Курдль ©   (20. 11.06 14:43)

А как называют трансляторы вроде lua, которая сперва компилирует программу в байткод своей VM, потом выполняет на ней без фокусов типа JIT?


 
Cyrax ©   (2006-11-20 15:00) [18]

Курдль ©   (20.11.06 14:41) [15]
Ассемблер отличается от компилятора тем, что он транслирует одно предложение ЯП строго в одну машинную команду.

Одна команда asm -> одна команда процессора ?  Это что — фокус ?
Но даже если взять какой-то гипотетический язык выше машкода, где
одна команда языка -> одна команда процессора, то это тоже будет компилятор…

Основным отличием интерпретатора является то, что он транслирует и сразу инициирует выполнение предложения за предложением.

Да, JVM — не чистый интерпретатор, т.к. компилит весь код в натив (JIT»ом), только потом его запускает…
Но вот JIT — чистый копмилятор. ..


 
Anatoly Podgoretsky ©   (2006-11-20 15:04) [19]

> Cyrax  (20.11.2006 15:00:18)  [18]

Компилятор/Интерпритарор к ассемблеру не имеют отношения, есть и интерпритирующие ассемблеры.


 
Курдль ©   (2006-11-20 15:05) [20]


> Cyrax ©   (20.11.06 15:00) [18]
> Одна команда asm -> одна команда процессора ?  Это что — фокус ?

А ты не задумывался, почему не бывает «чистого» ассемблера, а он всегда с какими-то мерзкими добавочками типа «Ассемблер 386» или «Ассемблер РС»?

Дальше ты начинаешь утомлять. Я дал тебе точное определение и отличия трансляторов (возможно, они устарели).


 
Cyrax ©   (2006-11-20 15:38) [21]

Anatoly Podgoretsky ©   (20. 11.06 15:04) [19]
Компилятор/Интерпритарор к ассемблеру не имеют отношения, есть и интерпритирующие ассемблеры.

Интерпретирующий ассемблер — интерпретатор, компилирующий — компилятор (и транслятор)…


 
oldman ©   (2006-11-20 18:39) [22]


> Транслятор (в пер. с англ. — «переводчик») – это программа,
>  принимающая на вход программу на одном языке и преобразующая
> её в программу на другом языке.

Мдя…


 
DrPass ©   (2006-11-20 18:44) [23]


> компилирующий — компилятор

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


 
oldman ©   (2006-11-20 18:46) [24]


> DrPass ©   (20. 11.06 18:44) [23]
> Ассемблер по сути выполняет только подстановку — машинные коды вместо их символических обозначений

давно???


 
Anatoly Podgoretsky ©   (2006-11-20 19:50) [25]

> DrPass  (20.11.2006 18:44:23)  [23]

MacroAssembler


 
DrPass ©   (2006-11-21 00:07) [26]


> oldman ©   (20.11.06 18:46) [24]
> давно???

Изначально


> Anatoly Podgoretsky ©   (20.11.06 19:50) [25]

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


 
MeF Dei Corvi ©   (2006-11-21 00:47) [27]


> Ассемблер по сути выполняет только подстановку — машинные
> коды вместо их символических обозначений

А подстановка не есть преобразование?
К тому же есть ассемблеры, анализирующие код на лишние недостижимые команды.
FASM, например, очень интересный ассемблер.
http://ru.wikipedia.org/wiki/FASM


Программирование

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

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

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

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

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

Интерпретатор — программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.

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

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

Очень часто эмулятор используется для выполнения старых программ на новых вычислительных машинах. Обычно новые компьютеры обладают более высоким быстродействием и имеют более качественное периферийное оборудование. Это позволяет эмулировать старые программы более эффективно по сравнению с их выполнением на старых компьютерах. Примером такого подхода является разработка эмуляторов домашнего компьютера ZX Spectrum с микропроцессором Z80. До сих пор находятся любители поиграть на эмуляторе в устаревшие, но все еще не утратившие былой привлекательности, игровые программы. Эмулятор может также использоваться как более дешевый аналог современных компьютерных систем, обеспечивая при этом приемлемую производительность, эквивалентную младшим моделям некоторого семейства архитектур. В качестве примера можно привести эмуляторы IBM PC совместимых компьютеров, реализованные на более мощных компьютерах фирмы Apple. Ряд эмуляторов, написанных для IBM PC, с успехом заменяют различные игровые приставки.

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

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

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

Макропроцессоры используются и с языками высокого уровня. Они увеличивают функциональные возможности таких языков как PL/1, C, C++. Особенно широко макропроцессоры применяются в C и C++, позволяя упростить написание программ. Примером широкого использования макропроцессоров является библиотека классов Microsoft Foundation Classes (MFC). Через макровставки в ней реализованы карты сообщений и другие программные объекты. При этом, макропроцессоры повышают эффективность программирования без изменения синтаксиса и семантики языка.

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

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

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

В состав чего входят транслятор интерпретатор ассемблера

1. Трансляторы, компиляторы и интерпретаторы: определение, общая схема работы. Варианты взаимодействия блоков транслятора.

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

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

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

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

Интерпретатор — программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не «захламлять» внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.

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

Наиболее часто встречаются две разновидности трансляторов:

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

Рис. 1. Функциональные блоки транслятора

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

Дата добавления: 2015-04-21 ; просмотров: 7 ; Нарушение авторских прав

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Читайте также:
  1. БИЛЕТ -1
  2. Билет 1
  3. Билет 1
  4. Билет 1
  5. БИЛЕТ 1
  6. Билет 1
  7. Билет 1
  8. Билет 1
  9. Билет 1
  10. Билет 1

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

Не нашли то, что искали? Воспользуйтесь поиском:

Лучшие изречения: Сдача сессии и защита диплома — страшная бессонница, которая потом кажется страшным сном. 8794 — | 7154 — или читать все.

78.85.5.224 © studopedia.ru Не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования. Есть нарушение авторского права? Напишите нам | Обратная связь.

Отключите adBlock!
и обновите страницу (F5)

очень нужно

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

  1. А этот текст отобразится уже с новой строки.
  2. Введение в информатику
  3. Введение в информатику
  4. Вопрос 1
  5. Использование радиочастотного диапазона
  6. Китайская философия
  7. Кодирование.
  8. Компиляция и интерпретация программ
  9. Маркировка боеприпасов
  10. МЕТОДИЧЕСКИЕ РЕКОМЕНДАЦИИ 4 страница
  11. Нелинейные структуры данных 161

Принципы функционирования систем программирования. Современные системы.

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

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

Компилятор — это транслятор, переводящий текст программы в машинный код.

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

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

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

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

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

Обработка модульной программы.

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

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

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

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

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

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

Семантический анализ и генерация кода.

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

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

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

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

Тип лексемы№ лексемы

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

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

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

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

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

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

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

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

Make-файл. К этой же проблеме кодирования относится средство поддержки разработки программных проектов. Одним из популярных средств, ориентированных на работу одного или нескольких программистов, является т.н. make-средство. Название происходит от соответствующей команды ОС UNIX. C make-командой связан т.н. make-файл, в котором построчно указываются взаимосвязи всевозможных файлов, получаемых при трансляции, редактировании связей, и т.д., и те действия, которые надо выполнить, если эти взаимосвязи нарушаются. В частности можно сказать, что некоторый исполняемый файл зависит от группы объектных файлов, и если эта связь нарушена, то надо выполнить команду редактирования связей (link . ). Что значит нарушение зависимости и что значит связь? Make-команда проверяет существование этих объектных файлов. Если они существуют, то времена их создания должны быть более ранние, чем время создания исполняемого файла. В том случае, если это правило будет нарушено (а это проверяет make-команда), то будет запущен редактор связей (link), который заново создаст исполняемый файл. Тем самым такое средство позволяет нам работать с программой, состоящей из большого количества модулей, и не заботитьсяо том, соответствует ли в данный момент времени исполняемый файл набору объектных файлов или не соответствует (можно просто запустить make-файл).

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

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

Ассе́мблер (от англ. assemble — собирать) — компилятор с языка ассемблера в команды машинного языка.

Под каждую архитектуру процессора и под каждую ОС или семейство ОС существует свой Ассемблер. Существуют также так называемые «кросс-ассемблеры», позволяющие на машинах с одной архитектурой (или в среде одной ОС) ассемблировать программы для другой целевой архитектуры или другой ОС, и получать исполняемый код в формате, пригодн Наиболее известными ассемблерами для операционной системы DOS являлись Borland Turbo Assembler (TASM) и Macro Assembler (MASM). Также в своё время был популярен простой ассемблер A86.

При появлении операционной системы Microsoft Windows появилось расширение TASM, именуемое TASM32, позволившее создавать программы для выполнения в среде Windows. Последняя известная версия Tasm — пятая, включая различные к ней дополнения. Но официально развитие программы полностью остановлено.

Совсем по-другому обстоит дело с программой MASM. Она продолжает развиваться и по сей день, последние версии включены в наборы DDK. Но версия программы, направленная на создание программ для DOS, не развивается.

Для более удобного создания программ на ассемблере для Windows появился пакет, названный MASM32, автором которого является Стивен Хатчессон (aka hutch—). Более подробная информация доступна на сайте пакета MASM32

Настоящие ценители языка используют ассемблер FASM, бескорыстно предоставленный в общее пользование и написанный Томазом Грижтаром (Tomasz Grysztar). Официальный сайт ассеблера FASM

Несколько иначе обстоит ситуация с ассемблерами для другой известной операционной системы GNU/Linux. В её состав входит компилятор gcc, включающий в себя ассемблер gas (GNU Assembler)… Но в нём используется AT&T синтаксис, в отличие от Intel-синтаксиса, используемого в большинстве остальных ассемблеров.

Также существует открытый проект ассемблера, версии которого доступны под различные операционные системы, и который позволяет получать объектные файлы для этих систем. Называется этот ассемблер NASM (Netwide Assembler).

YASM это переписанная с нуля версия NASM под лицензией BSD (с некоторыми исключенями).

FASM — молодой, но быстро развивающийся и завоёвывающий популярность ассемблер, распространяется с исходным кодом, есть версии для KolibriOS, GNU/Linux и Microsoft Windows, использует Intel-синтаксис. Также fasm поддерживает инструкции AMD64. Достоинством является очень сильный макроязык, разнообразие форматов выходных файлов и несколько изменённый (в лучшую сторону, но несколько непривычный для «старой школы») синтаксис.

Дата добавления: 2015-01-03 ; Просмотров: 1269 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

компилятор против.

Переводчик: Какая разница?

Автор: John Smith

Часы

Обновлено

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

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

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

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

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

КЛЮЧЕВОЕ ОТЛИЧИЕ

  • Компилятор преобразует код, написанный на языке программирования высокого уровня, в машинный код сразу, до запуска программы, тогда как интерпретатор преобразует каждый высокоуровневый оператор программы один за другим в машинный код. код во время работы программы.
  • Скомпилированный код работает быстрее, а интерпретируемый код работает медленнее.
  • Компилятор отображает все ошибки после компиляции, а интерпретатор отображает ошибки каждой строки одну за другой.
  • Компилятор основан на модели связывания-загрузки трансляции, тогда как интерпретатор основан на методе интерпретации.
  • Компилятор принимает всю программу, а интерпретатор — одну строку кода.

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

нельзя.
Основа различия Компилятор Переводчик
Шаги программирования
  • Создайте программу.
  • Compile проанализирует или проанализирует все операторы языка на предмет их правильности. Если неверно, выдает ошибку
  • Если ошибок нет, компилятор преобразует исходный код в машинный код.
  • Он связывает различные файлы кода в исполняемую программу (известную как exe)
  • Запустить программу
  • Создать программу
  • Нет связывания файлов или генерации машинного кода
  • Операторы исходного кода выполняются построчно ВО ВРЕМЯ выполнения
Преимущество Код программы уже переведен в машинный код. Таким образом, время выполнения кода меньше. Интерпретаторы проще в использовании, особенно для новичков.
Недостаток Вы не можете изменить программу, не вернувшись к исходному коду. Интерпретируемые программы могут работать на компьютерах с соответствующим интерпретатором.
Машинный код Сохранить машинный язык как машинный код на диске Машинный код вообще не сохраняется.
Время работы Скомпилированный код работает быстрее Интерпретируемый код работает медленнее
Модель Он основан на модели связывания-загрузки языкового перевода. Основан на методе интерпретации.
Генерация программы Генерирует выходную программу (в виде исполняемого файла), которую можно запускать независимо от исходной программы. Не создавать программу вывода. Таким образом, они оценивают исходную программу каждый раз во время выполнения.
Исполнение Выполнение программы отдельно от компиляции. Он выполняется только после компиляции всей программы вывода. Выполнение программы является частью процесса интерпретации, поэтому выполняется построчно.
Требования к памяти Целевая программа выполняется независимо и не требует компилятора в памяти. Интерпретатор существует в памяти во время интерпретации.
Лучше всего подходит для Привязано к конкретной целевой машине и не может быть перенесено. C и C++ — самые популярные языки программирования, использующие модель компиляции. Для веб-сред, где важно время загрузки. Из-за того, что выполняется исчерпывающий анализ, компиляция занимает относительно больше времени для компиляции даже небольшого кода, который нельзя запускать несколько раз. В таких случаях переводчики лучше.
Оптимизация кода Компилятор видит весь код заранее. Следовательно, они выполняют множество оптимизаций, которые ускоряют выполнение кода 90 050. Интерпретаторы видят код построчно, поэтому оптимизация не так надежна, как компиляторы
Динамическая типизация Сложно реализовать, поскольку компиляторы не могут предсказать, что произойдет во время поворота. Интерпретируемые языки поддерживают динамическую типизацию
Применение Лучше всего подходит для производственной среды Лучше всего подходит для программы и среды разработки.
Ошибка выполнения Компилятор отображает все ошибки и предупреждения во время компиляции. Поэтому запустить программу без исправления ошибки Интерпретатор читает один оператор и показывает ошибку, если таковая имеется. Вы должны исправить ошибку, чтобы интерпретировать следующую строку.
Ввод Требуется вся программа Требуется одна строка кода.
Выход Compliers генерирует промежуточный машинный код. Интерпретатор никогда не генерирует промежуточный машинный код.
Ошибки Отображать все ошибки после компиляции одновременно. Отображает все ошибки каждой строки одну за другой.
Связанные языки программирования
C, C++, C#, Scala, Java используют компилятор. PHP, Perl, Ruby использует интерпретатор.

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

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

Также проверьте:- Учебное пособие по проектированию компилятора для начинающих

Роль интерпретатора

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

ЯЗЫКИ ВЫСОКОГО УРОВНЯ

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

МАШИННЫЙ КОД

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

КОД ОБЪЕКТА

При компиляции исходного кода машинный код, созданный для разных процессоров, таких как Intel, AMD и ARM, отличается. Чтобы сделать код переносимым, исходный код сначала преобразуется в объектный код. Это промежуточный код (похожий на машинный код), который не поймет ни один процессор. Во время выполнения объектный код преобразуется в машинный код базовой платформы.

Java одновременно компилируется и интерпретируется.

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

Также проверьте: — Учебное пособие по Java для начинающих: изучите основы программирования на Java

Каковы основные различия

В этом руководстве объясняются основные различия между компилятором и интерпретатором, а также преимущества и работа компиляторов и интерпретаторов:

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

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

Чему вы научитесь:

  • Компилятор и интерпретатор: Ключевые различия
    • Что такое компилятор
    • Что такое интерпретатор
    • Компилятор против интерпретатора
    • СОЕДИНЕНИЯ: Interpreter Over Compiler
    • Преимущества: Compiler uperpreter
    • .
      • Рекомендуемая литература

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

    Компьютерные программы написаны на понятных человеку языках, называемых языками высокого уровня. Некоторыми примерами языков высокого уровня являются C, Java, C++ и т. д. В этих языках используются слова из английского языка, поэтому их легко изучать и использовать людям.

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

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

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

    Рекомендуемая литература =>> Основы компьютерного программирования

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

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

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

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

    • Компилятор сразу переводит программу, написанную на языке высокого уровня, в машинопонятный код.
    • Машинопонятный код известен как объектный код.
    • Код объекта представляет собой комбинацию двоичного числа (0 и 1).
    • Программа, написанная на любом языке высокого уровня, также известна как исходная программа или программа, написанная на исходном коде.
    • Один и тот же объектный код может выполняться каждый раз, когда необходимо запустить программу высокого уровня. Нет необходимости компилировать программу каждый раз, если только не было изменений в исходном коде.
    • Из-за генерации промежуточного кода компиляторам требуется больший объем памяти.
    • Компиляторам требуется больше времени для анализа исходной программы.
    • Принимая во внимание общее выполнение программы, компиляторы обычно работают быстрее.
    • C и C++ являются примерами языков, в которых исходная программа компилируется перед выполнением.

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

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

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

    Работа интерпретатора

    • Интерпретатор переводит программу, написанную на языке высокого уровня, в машинопонятный код построчно во время выполнения программы.
    • Во время преобразования программы в машинопонятный код не генерируется промежуточный код.
    • Программа на языке высокого уровня, также известная как исходная программа, должна интерпретироваться каждый раз, когда программа должна выполняться.
    • Поскольку промежуточный код не генерируется, интерпретаторам не требуется большой объем памяти.
    • Интерпретаторам требуется меньше времени на анализ исходной программы, поскольку вся программа не транслируется сразу в машинный код.
    • Учитывая общее выполнение программы, интерпретаторы обычно работают медленно.
    • Javascript, PHP, Ruby и Perl являются примерами языков, исходный код которых интерпретируется.

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

    В таблице ниже поясняются основные различия между ними: Переводит программу высокого уровня в код машинного языка — все сразу. Преобразует код программы высокого уровня в код машинного языка — по одной строке кода за раз. Создается и временно сохраняется промежуточный код. Он называется Объектным кодом. Каждая строка кода транслируется в машинный код и выполняется одновременно. Переведенный код не сохраняется. Компиляция программы выполняется быстрее. Интерпретаторы медленнее компиляторов Сгенерированный объектный код можно запускать вместо перевода исходной программы каждый раз, когда должно быть выполнено выполнение. Исходная программа должна выполняться каждый раз (будут выполняться и перевод, и выполнение), поскольку объектный код не генерируется. Все найденные ошибки отображаются вместе после завершения компиляции программы. Поскольку трансляция и выполнение происходят построчно, поэтому ошибки, если таковые имеются, отображаются для каждой строки по мере ее трансляции в машинный код. Выполнение кода и компиляция кода — это два разных процесса. Выполнение кода является частью процесса интерпретации кода. Оптимизация кода выполняется до выполнения кода, что ускоряет процесс выполнения. Поскольку за один раз интерпретируется и выполняется одна строка кода, оптимизации кода не происходит. Сгенерированный код объекта временно сохраняется на диске. Код машинного языка, сгенерированный во время выполнения каждой строки, никогда не сохраняется. Перед компиляцией компилятор сначала анализирует программу и сообщает обо всех найденных ошибках. Интерпретатор анализирует одну строку за раз и сообщает об обнаруженной ошибке и не переходит к следующей строке кода, пока ошибка не будет исправлена. Отладка скомпилированной программы относительно сложна, так как все обнаруженные ошибки сообщаются вместе. Отладка интерпретируемой программы относительно проста, так как выполняется одна строка за раз и сообщается об ошибке. Динамическую типизацию трудно реализовать для языков, основанных на компиляторах. Динамическая типизация поддерживается языками, основанными на интерпретаторах. C и C++ являются примерами языков, на которых написанный код компилируется. Javascript, PHP, Ruby и Perl являются примерами языков, на которых написанный код интерпретируется.

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

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

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

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

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

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

    Часто задаваемые вопросы

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

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

    Q #2) Компилятор или интерпретатор быстрее?

    Ответ: Перевод кода с помощью компилятора выполняется быстрее по сравнению со временем, которое требуется интерпретатору для того же фрагмента кода.

    Q #3) Что такое компилятор и его типы?

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

    • Однопроходные компиляторы
    • Двухпроходные компиляторы
    • Многопроходные компиляторы

    Q #4) Является ли Python компилятором или интерпретатором?

    Ответ: Код Python интерпретируется, но перед интерпретацией исходный код сначала преобразуется в байт-код, который затем выполняется интерпретатором Python. Исходный код Python хранится в виде файла .py, который затем транслируется в байт-код и сохраняется как .pyc или 9.0228 .pyo расширение файла.

    Вопрос №5) Какие существуют три типа трансляторов?

  • Переводчики
  • Сборщики

Вопрос № 6) Какие существуют два типа языка низкого уровня?

Ответ: Два типа языков низкого уровня:

  • Машинный язык
  • Язык ассемблера

Q #7) В чем разница между компилятором, интерпретатором и ассемблером?

Ответ:

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

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

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

Заключение

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

Рекомендуемая литература =>> Лучшие компиляторы Python

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

Рекомендуемая литература

Разница между компилятором и интерпретатором: [Полное сравнение]

Содержание

show

  • Что такое компиляторы?
  • Кто такой переводчик?
  • Разница между компилятором и интерпретатором
  • Заключение
  • Часто задаваемые вопросы
  • Дополнительные ресурсы

Если бы мы отправились в другую страну, где общение на родном языке затруднено, жизнь была бы опасной. Ожидать чего-то взамен, когда нас попросят, было бы сложно, если бы у нас не было переводчика. Хотя мы и не бываем каждый день в разных странах, мы общаемся с кем-то, кто не понимает ни одного человеческого языка; Компьютер. Мы разговариваем с компьютером через язык программирования высокого уровня, но знаете ли вы, что язык программирования — это не окончательный язык, понятный компьютеру? У нас есть системное программное обеспечение, известное как компиляторы и интерпретаторы, которые помогают сделать перенос более плавным. Что это за компиляторы и интерпретаторы? они одинаковы? Есть ли разница между компиляторами и интерпретаторами?

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

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

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

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

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

  • Лексический анализ : Разделение исходного кода на абстрактный фрагмент, известный как лексема. Для каждой лексемы создается токен, относящийся к тому, является ли она ключевым словом, строкой или какой-либо другой переменной.
  • Анализ синтаксиса : Назначенные токены структурированы для формирования абстрактного синтаксического дерева (AST) и проверены на наличие ошибок в синтаксисе.
  • Семантический анализ : AST проверяется на наличие семантических ошибок, таких как неправильное назначение переменной, использование необъявленной переменной, использование ключевых слов в качестве переменных и т. д.
  • Промежуточная генерация кода или более промежуточных кодовых форм.
  • Оптимизация : Процесс компиляции ищет несколько способов улучшения задачи.
  • Генерация кода : Компилятор преобразует промежуточный оптимизированный код в машинный код, после чего исходная программа преобразуется в объектную программу.

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

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

  • Компиляторы транслируют программы за одну операцию.
  • Процесс занимает меньше времени.
  • Загрузка ЦП выше.
  • Проверка синтаксических и семантических ошибок может производиться одновременно.
  • Многие языки высокого уровня, включая C, C++ и Java, легко его поддерживают.

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

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

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

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

Работа интерпретатора

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

Преимущества переводчиков

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

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

Роль интерпретатора

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

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

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

Основа Компилятор Интерпретатор
Анализ Вся программа анализируется компилятором за один раз. В интерпретаторе выполняется построчный анализ программы.
Машинный код Сохраняет машинный код в дисковом хранилище. Машинный код нигде не хранится.
Выполнение Выполнение программы происходит только после компиляции всей программы. Выполнение программы происходит после оценки каждой строки, поэтому ошибка возникает построчно, если таковая имеется.
Время выполнения Скомпилированная программа работает быстрее. Поскольку он требует меньше времени, он намного быстрее, чем интерпретатор. Интерпретируемая программа работает медленнее. Поскольку он требует больше времени, он намного медленнее, чем компилятор.
Поколение Компиляция дает выходную программу, которая работает независимо от исходного файла. Интерпретация не дает никакой программы вывода и поэтому оценивается при каждом выполнении.
Оптимизация Компилятор читает всю программу и несколько раз выполняет поиск для сокращения времени выполнения. Строгая оптимизация не выполняется, поскольку код оценивается построчно.
Ошибка и ошибка выполнения Все ошибки отображаются в конце компиляции, и программа не может быть запущена, пока ошибка не будет устранена. Отображает ошибки от строки к строке. Программа работает до тех пор, пока ошибка не будет найдена, и продолжает работу над ее устранением.
Ввод Компилятор берет всю программу для анализа. Интерпретатор принимает строки кода для анализа.
Вывод Компилятор выдает промежуточные формы кода или объектный код. Интерпретатор не генерирует никаких промежуточных кодовых форм.
Языки программирования C, C++, C#, Java — это языки программирования на основе компилятора. PHP, PERL, Ruby — языки программирования на основе интерпретатора.
Использование ЦП Использование ЦП выше в компиляторах. Интерпретатор использует меньше ЦП, чем компилятор.
Локализация ошибок Локализация ошибок затруднена. Ошибки локализовать проще, чем в компиляторе.
Эффекты ошибки Ошибка может привести к реорганизации всей программы. Ошибки вызывают реорганизацию только части программы.
Гибкость В общем, компиляторы не отличаются гибкостью. Интерпретатор обеспечивает большую гибкость.
Проверка ошибок Вы можете одновременно проверять как синтаксические, так и семантические ошибки. Проверяются только синтаксические ошибки.

Заключение

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

Часто задаваемые вопросы

В: Что лучше? Компилятор или интерпретатор?
A: Качество зависит от потребности. Интерпретатор очень полезен при отладке, но в целом выполнение выполняется медленно. Хотя компилятор сканирует весь исходный код, исправление ошибок немного затруднено. Выбор напрямую зависит от конечного результата.

В: Что быстрее? Компилятор или интерпретатор?
A: Если рассматривать процесс, интерпретатор быстрее компилятора. Однако, как только программа скомпилирована, время выполнения или выполнение скомпилированной программы переинтерпретированы быстрее.

В: Может ли кто-нибудь использовать интерпретатор вместо компилятора?  
A: Да. Интерпретаторы имеют такие преимущества, как более простая отладка, переносимость и т. д. В зависимости от необходимости можно использовать интерпретатор вместо компилятора.

В: Является ли Python интерпретатором или компилятором?
A: Известно, что Python является интерпретируемым языком. Однако компиляция кода Python скрыта от пользователей. Программы Python преобразуются в байт-коды, промежуточную форму, которую понимает машина. Таким образом, Python находится в центре обоих параметров.

В: Каковы примеры переводчиков?
A: Некоторые примеры интерпретаторов включают интерпретатор Python, интерпретатор PERL, интерпретатор Ruby, интерпретатор PHP и т. д.

  • Онлайн-компилятор Python
  • Онлайн-компилятор Javascript
  • Компилятор и интерпретатор в программировании

    Типы и варианты использования компиляторов и интерпретаторов

    Фото Cookie the Pom на Unsplash

    Я до сих пор помню дискуссию с моим коллегой, в которой я сказал: «Это транспайлер», а он ответил: «Транс… что ?»

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

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

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

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

    • Компилятор переводит код, написанный на языке программирования высокого уровня в язык более низкого уровня, такой как язык ассемблера, объектный код и машинный код (двоичные 1 и 0 бит). Он преобразует код заранее, прежде чем программа запустится.
    • Интерпретатор переводит код построчно во время работы программы. Вероятно, в какой-то момент своей карьеры вы неосознанно пользовались переводчиками.
    Компилятор против интерпретатора

    Как у компиляторов, так и у интерпретаторов есть плюсы и минусы:

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

    Язык программирования высокого уровня обычно называют «компилируемым языком» или «интерпретируемым языком». Однако на практике они могут иметь как компилируемые, так и интерпретируемые реализации. C, например, называется компилируемым языком, несмотря на существование интерпретаторов C. Первые движки JavaScript были простыми интерпретаторами, но все современные движки используют JIT-компиляцию из соображений производительности.

    Интерпретаторы использовались еще в 1952 году для облегчения программирования, а также для перевода между низкоуровневыми машинными языками. Первым интерпретируемым языком высокого уровня был Лисп. Python, Ruby, Perl и PHP — другие примеры языков программирования, использующих интерпретаторы.

    Ниже приведен неполный список типов интерпретаторов:

    1. Интерпретатор байт-кода

    Тенденция к интерпретации байт-кода и своевременной компиляции стирает различие между компиляторами и интерпретаторами.

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

    — Википедия

    2. Интерпретатор многопоточного кода

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

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

    3. Интерпретатор абстрактного синтаксического дерева

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

    Архитектура транспилятора TypeScript

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

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

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

    4. Своевременная компиляция

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

    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-компилятор откладывает компиляцию до времени выполнения. Обычно он работает внутри интерпретатора.

    Примеры:

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

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

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

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

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

    Пример:

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

    10. Сборщик

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

    Ассемблер

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

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

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

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

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

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

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

    Инструмент

    Сайт tomassetti.me изменился: теперь он является частью strumenta.com. Вы по-прежнему будете находить все новости в обычном качестве, но в новом оформлении.

      Согласно их определениям, разница между компилятором и интерпретатором кажется достаточно ясным:

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

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

        Все ли языки, использующие виртуальную машину, интерпретируются?

        Действительно ли они все скомпилированы?

        Вы могли бы сказать и : язык сначала компилируется в промежуточной форме/языке, а затем эта промежуточная вещь интерпретируется во время выполнения. Что также приводит к другой проблеме: компилятор и интерпретатор следует рассматривать не как одну программу, а скорее как группу программ, систему. То, что вы, как пользователь, считаете компилятором, на самом деле может включать более одной программы. Например, он может включать компоновщик: программу, которая объединяет разные объектные файлы в один файл, чтобы его было легче использовать. Нечто подобное можно сказать и о переводчике.

        Можете ли вы рассказать мне все о компиляторах и интерпретаторах?

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

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

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

        Как вы распространяете программу

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

        Если у вас есть скомпилированная программа, вы можете запустить ее без необходимости установки чего-либо еще. Это упрощает распространение. С другой стороны исполняемый файл работает на одной конкретной платформе : для разных операционных систем и разных процессоров нужны разные скомпилированные версии. Например, скомпилированная программа на C++ может работать на компьютере с процессором x86, но не на компьютере с чипом ARM. Или это может работать в системе Linux, но не в системе Windows.

        Если вы собираетесь интерпретировать программу, вы можете распространять одну и ту же копию среди пользователей на разных платформах. Однако им потребуется интерпретатор, работающий на их конкретной платформе 9.0229 . Вы можете распространять исходный код или промежуточную форму. Интуитивный способ взглянуть на интерпретатор таков: он похож на функцию eval в JavaScript. Он работает везде, где работает JavaScript, но для работы на этой платформе требуется интерпретатор JavaScript.

        Кроссплатформенная поддержка

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

        Это потому, что по большей части вы просто создаете программу для платформы интерпретатора. Это будет сам интерпретатор, который переведет его в надлежащий вид для реальной платформы (например, Windows/Linux и x86/ARM). Конечно, на каждой платформе все еще есть некоторые различия, о которых вы должны знать. Типичным примером является символ-разделитель каталогов.

        Вместо этого, когда вы компилируете программу, вам нужно позаботиться обо всех небольших различиях между каждой платформой. Это происходит отчасти потому, что скомпилированные языки, как правило, являются языками низкого уровня, такими как C++, поэтому они дают вам меньший доступ к системе и, следовательно, большую ответственность. Но другая причина заключается в том, что все библиотеки, которые вы используете, сами должны поддерживать разные платформы. Итак, если они не поддерживают Windows, вы не можете поддерживать Windows.

        Скорость имеет несколько граней

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

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

        Скорость выполнения по сравнению со скоростью разработки

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

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

        Тайны отладки

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

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

        Отличие средств разработки

        Хотя на практике все это верно, это может быть менее актуально, чем кажется. На самом деле, если вы подумаете о своем опыте, вы, вероятно, обнаружите, что отладка JavaScript сложнее, чем отладка C++ . Почему это? Отчасти это дизайн самих языков. JavaScript использует динамическую типизацию, а C++ использует статическую типизацию. Последнее облегчает обнаружение ошибок на ранней стадии. Но в конечном итоге все сводится к инструментам разработки. Компилировать C++ вручную сложно, поэтому большинство людей используют IDE для его разработки. С другой стороны, вы можете легко использовать текстовый редактор и инструменты командной строки для разработки на JavaScript.

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

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

        Резюме

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

        Это важный аспект, который необходимо продумать, особенно если вы хотите создать свой собственный язык программирования. Расмус Лердорф создал PHP таким, чтобы его было легко использовать. И действительно, его было невероятно проще использовать по сравнению с альтернативами, по крайней мере, на момент его создания. Но начинался он больше как библиотека, чем как язык. И хотя он сильно улучшился, он все еще страдает от своего начала. Вы по-прежнему можете создавать хороший PHP-код, но это делает меньше пользователей, чем обычно. Потому что, если , вам просто нужно что-то, что работает , охрана, обслуживание и т.д., все остальное позже.

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

        5 вещей, которые нужно сделать правильно при создании языка

        Получите контрольный список по электронной почте и получите дополнительные советы по созданию языков

        Имя

        Электронная почта

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

        Я хотел бы узнать больше о дизайне языка

        Работает на ConvertKit

         

        Категории

        Подробнее о языковой инженерии

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

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

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

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

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

        Стать сертифицированным экспертом Python за 25 часов

        Интерпретатор 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 также предлагает преимущество ускорения кода.