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

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

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

Перевод статьи «Programming Concepts: Compiled and Interpreted Languages»

Рассказывает Аарон Краус 

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

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

Вступление

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

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

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

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

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

Компилируемые языки

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

Низкоуровневые языки как правило являются компилируемыми, поскольку эффективность обычно ставится выше кроссплатформенности.

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

Примерами компилируемых языков являются C, C++, Erlang, Haskell и более современные языки, такие как Rust и Go.

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

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

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

Интерпретируемые языки

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

Раньше процесс интерпретации занимал очень много времени, но с приходом таких технологий, как JIT-компиляция, разрыв между компилируемыми и интерпретируемыми языками сокращается. Примерами интерпретируемых языков являются PHP, Perl, Ruby и Python.

Вот некоторые из концептов, которые стали проще благодаря интерпретируемым языкам:

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

Бонус: байткод-языки

Байткод-языки — это такие языки, которые используют для исполнения кода как компиляцию, так и интерпретацию. Java и фреймворк .NET — это типичные примеры байткод-языков.

На самом деле, Java Virtual Machine (JVM) — это настолько популярная виртуальная машина для интерпретации байткода, что на ней работают реализации нескольких языков.

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

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

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

Заключение

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

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

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

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

Байткод-языки, в свою очередь, пытаются использовать сильные стороны обоих видов языков, и у них это неплохо получается.

Источник: https://tproger.ru/translations/programming-concepts-compilation-vs-interpretation/

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

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

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

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

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

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

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

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

Конечным элементом этого процесса является исполняемый файл.

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

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

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

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

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

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

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

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

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

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

Например, так работают такие языки программирования, как Python. Вы пишете программу. Затем вводите код в интерпретатор Python, и он выполняет все описанные вами шаги. В командной строке вы можете ввести примерно следующее:

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

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

Но эта процедура включает в себя компиляцию кода и добавление в качестве ее части всего интерпретатора Python.

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

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

Такой код быстрее обрабатывается, и его проще написать для исполнителя (части интерпретатора, которая исполняет), который считывает байтовый код, а не код источника.

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

У меня есть эмулятор для игровой приставки NIntendo. Когда я загружаю ROM-файл Dragon Warrior, он форматируется в машинный код, который понимает только процессор NES. Но если я создаю виртуальный процессор, который интерпретирует байтовый код во время работы на другом процессоре, я могу запустить Dragon Warrior на любой машине с эмулятором.

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

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

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

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

А также может вызывать ошибки компиляции.

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

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

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

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

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

Это проблема для конкретных real-time приложений, таких как игры с высоким разрешением и симуляцией. Некоторые интерпретаторы содержат компоненты, которые называются just-in-time компиляторами (JIT).

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

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

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

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

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

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

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

Сообщите мне, что бы вы предпочли: интерпретацию или компиляцию? Спасибо за уделенное время!

Данная публикация представляет собой перевод статьи «Interpretation Versus Compilation» , подготовленной дружной командой проекта Интернет-технологии.ру

Источник: https://www.internet-technologies.ru/articles/interpretaciya-i-kompilyaciya.html

Трансляция, компиляция, интерпретация, линкование

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

Санкт-Петербургский государственный университет

телекоммуникаций имени профессора М.А. Бонч-Бруевича

по дисциплине Информатика

на тему:

Трансляция, линкование, компиляция, интерпретация

Выполнила: студентка 1 курса

Царыгина К.О.

Преподаватель: Левчук Ю.П.

2009 год

Введение

Трансляция, компиляция, интерпретация, линкование

1. Трансляция. Компиляция. Интерпретация

2. Линкование

Заключение

Используемая литература

Введение

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

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

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

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

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

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

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

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

В процессе отладки программы выделяются этапы:

1. трансляция исходного текста программы;

2. компоновка программы;

3. выполнение программы с целью определения логических ошибок;

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

Трансляция, компиляция, интерпретация, линкование

1. Трансляция. Компиляция. Интерпретация

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

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

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

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

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

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

Виды трансляторов

Трансляторы подразделяют на:

· Адресный . Функциональное устройство, преобразующее виртуальный адрес в реальный адрес

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

· Многопроходной . Формирует объектный модуль за несколько просмотров исходной программы.

· Обратный . То же, что детранслятор (декомпилятор, дизассемблер).

· Однопроходной . Формирует объектный модуль за один последовательный просмотр исходной программы.

· Оптимизирующий . Выполняет оптимизацию кода в создаваемом объектном модуле.

· Синтаксически-ориентированный (синтаксически-управляемый) . Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.

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

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

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

Виды компиляции

· Пакетная . Компиляция нескольких исходных модулей в одном пункте задания.

· Построчная . То же, что и интерпретация.

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

Рисунок 1. Компиляция размеченного документа

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

Типы интерпретаторов

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

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

Алгоритм работы простого интерпретатора

1. прочитать инструкцию;

2. проанализировать инструкцию и определить соответствующие действия;

3. выполнить соответствующие действия;

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

Рисунок 2. Схема интерпретации текста Ю. Лотмана

2. Линкование

Линкование (компоновка) — это процесс, при котором все «недокомпилированные» части программы доводятся до конца и связываются между собой в исполняемый файл (или файлы) формата, понятного данной операционной системе. В итоге, мы получаем исполняемую программу.

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

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

· Определённые или экспортируемые имена — функции и переменные, определённые в данном модуле и предоставляемые для использования другим модулям

· Неопределённые или импортируемые имена — функции и переменные, на которые ссылается модуль, но не определяет их внутри себя

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

Рисунок 3. Наглядная схема линкования

Существует два способа создания линкования:

Рисунок 4.Схема «Кольцо»

Рисунок 5. Схема «Елочка»

Заключение

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

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

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

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

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

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

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

Используемая литература

· Роберт У. Себеста. Основные концепции языков программирования

· Вольфенгаген В. Э.

Источник: https://zinref.ru/000_uchebniki/02800_logika/011_lekcii_raznie_33/1710.htm

Компиляция и интерпретация. Основные этапы компиляции

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

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

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

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

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

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

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

*процессор и память любого компьютера (а в широком смысле и вся программная среда, создаваемая операционной системой, является интерпретатором машинного кода);

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

Трансляция (лат. translatio — перевод) — преобразование программы с одного языка программирования на другой, который понятен процессору или программе-интерпретатору.

Транслятор — программа или техническое средство (процессор), выполняющее трансляцию программы.

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

Исходный код => Транслятор => Объектный код.

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

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

Трансляторы:

Интерпретатор — программа или аппаратное средство, выполняющее интерпретацию.

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

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

Виды компиляторов

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

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

*Диалоговый. См.: диалоговый транслятор.

*Инкрементальный. Повторно транслирует фрагменты программы и дополнения к ней без перекомпиляции всей программы.

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

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

*Отладочный. Устраняет отдельные виды синтаксических ошибок.

*Резидентный. Постоянно находится в оперативной памяти и доступен для повторного использования многими задачами.

*Самокомпилируемый. Написан на том же языке, с которого осуществляется трансляция.

*Универсальный. Основан на формальном описании синтаксиса и семантики входного языка. Составными частями такого компилятора являются: ядро, синтаксический и семантический загрузчики.

Процесс компиляции обычно принято делить на три основных этапа :

1.предварительная обработка, анализ и синтез .

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

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

2.Этап анализа включает в себя три фазы .

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

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

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

3.Этап синтеза состоит из следующих фаз .

1) Генерация машинно-независимого кода ;

2) Оптимизация машинно-независимого кода ;

3) Распределение памяти ;

4) Генерация машинного кода;

5) Оптимизация машинного кода .

Источник: https://sdamzavas.net/4-48332.html

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

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

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

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

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

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

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

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

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

Виды трансляторов

Трансляторыподразделяют:

  • Адресный. Функциональное устройство, преобразующее виртуальный адрес (англ. Virtual address) в реальный адрес (англ. Memory address).

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

  • Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.

  • Обратный. То же, что детранслятор. См. также: декомпилятор, дизассемблер.

  • Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.

  • Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.

  • Синтаксически-ориентированный (синтаксически-управляемый). Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.

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

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

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

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

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

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

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

Интерпретатор(англ. interpreterистолкователь, устный переводчик)переводит и выполняет программу строказа строкой.

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

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

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

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

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

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

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

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

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

Практическивсе языкипрограммирования низкого уровняитретьегопоколения, вродеассемблера,СиилиМодулы-2,являются компилируемыми, а болеевысокоуровневыеязыки, вродеPythonилиSQL, —интерпретируемыми.

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

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

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

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

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

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

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

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

Источник: https://studfile.net/preview/3582383/

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