Привет, сегодня поговорим про транслятор, обещаю рассказать все что знаю. Для того чтобы лучше понимать что такое транслятор, интерпритатор, компилятор, декомпилятор, трансляция , настоятельно рекомендую прочитать все из категории Языки и методы программирования. Теория трансляции.
транслятор — программа или техническое средство, выполняющее трансляцию программы. трансляция программы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определенном смысле, равносильную первой. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдает для печати текста программы и т. д. Язык, на котором представлена входная программа, называется исходным языком, а сама программа — исходным кодом. Выходной язык называется целевым языкомили объектным кодом. В общем случае, понятие трансляции относится не только к языкам программирования, но и к другим языкам — как формальным компьютерным (вроде языков разметкитипа HTML), так и естественным (русскому, английскому и т. п.).
5. Трансляторы
Виды трансляторов
- Диалоговый. Обеспечивает использование языка программирования в режиме разделения времени (англ.).
- Синтаксически-ориентированный (синтаксически-управляемый). Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.
- Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.
- Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.
- Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.
- Тестовый. Набор макрокоманд языка ассемблера, позволяющих задавать различные отладочные процедуры в программах, составленных на языке ассемблера.
- Обратный. Для программы в машинном коде выдает эквивалентную программу на каком-либо языке программирования (см.: дизассемблер, де компилятор ).
Общая схема трансляторов, компонентов трансляторов и связанных с ними инструментов представлена на рис. 5.2, где сплошная линия означает обязательную связь между компонентами, а пунктирная — возможность включения одного компонента в другой. Подчеркнем, что многие компоненты могут являться общими для различных видов трансляторов и инструментов.
Обратим внимание на то, что многие другие программные инструменты могут рассматриваться как языковые трансляторы, например:
- текстовые редакторы (транслируют текст и специфические команды форматирования в некоторый образ);
- процессоры запросов (транслируют высокоуровневый язык запросов в реляционный язык (например, SQL));
- программы доказательства теорем (преобразуют спецификацию теоремы в некоторый метаязык).
Урок 1. Часть 5. Что такое транслятор, компилятор, интерпретатор и байт-код
Реализации
Цель трансляции — преобразовать текст с одного языка на другой, который понятен адресату текста. В случае программ-трансляторов, адресатом является техническое устройство (процессор) или программа-интерпретатор.
Компилятор
Язык процессоров (машинный код) обычно является низкоуровневым. Существуют платформы, использующие в качестве машинного язык высокого уровня (например,iAPX-432 ), но они являются исключением из правила в силу сложности и дороговизны. Транслятор, который преобразует программы в машинный язык, принимаемый и исполняемый непосредственно процессором, называется компилятором.
Процесс компиляции, как правило, состоит из нескольких этапов: лексического, синтаксического и семантического анализов, генерации на основе результатов анализов промежуточного кода, оптимизации промежуточного кода и генерации результирующего объектного кода, в данном случае машинного. Помимо этого, программа, как правило, имеет внешние инфраструктуры: сервисы, предоставляемые операционной системой и сторонние библиотеки (например, файловый ввод-вывод или графический интерфейс), для чего машинный код программы необходимо связать с этими сервисами и функциями библиотек. Связывание со статическими библиотеками выполняется редактором связей или компоновщиком (который может представлять собой отдельную программу или быть частью компилятора), а с операционной системой и динамическими библиотеками связывание выполняется при начале исполнения программы загрузчиком.
Достоинство компилятора: программа компилируется один раз и при каждом выполнении не требуется дополнительных преобразований . Об этом говорит сайт https://intellect.icu . Соответственно, не требуется наличие компилятора на целевой машине, для которой компилируется программа. Недостаток: отдельный этап компиляции замедляет написание и отладку и затрудняет исполнение небольших, несложных или разовых программ.
Этапы компиляции
Компиляция исходных текстов на Си в исполняемый файл происходит в три этапа.
Препроцессинг
Эту операцию осуществляет текстовый препроцессор.
Исходный текст частично обрабатывается — производятся:
- Замена комментариев пустыми строками
- Текстовое включение файлов — #include
- Макроподстановки — #define
- Обработка директив условной компиляции — #if , #ifdef , #elif , #else , #endif
Компиляция
Процесс компиляции состоит из следующих этапов:
- Лексический анализ. Последовательность символов исходного файла преобразуется в последовательность лексем.
- Синтаксический анализ. Последовательность лексем преобразуется в дерево разбора.
- Семантический анализ. Дерево разбора обрабатывается с целью установления его семантики (смысла) — например, привязка идентификаторов к их декларациям, типам, проверка совместимости, определение типов выражений и т. д.
- Оптимизация. Выполняется удаление излишних конструкций и упрощение кода с сохранением его смысла.
- Генерация кода. Из промежуточного представления порождается объектный код.
Результатом компиляции является объектный код.
Объектный код — это программа на языке машинных кодов с частичным сохранением символьной информации, необходимой в процессе сборки.
При отладочной сборке возможно сохранение большого количества символьной информации (идентификаторов переменных, функций, а также типов).
Компоновка
Также называется связывание, сборка или линковка.
Это последний этап процесса получения исполняемого файла, состоящий из связывания воедино всех объектных файлов проекта.
При этом возможны ошибки связывания.
Если, допустим, функция была объявлена, но не определена, ошибка обнаружится только на этом этапе.
Особенность подключения пользовательских библиотек в Си
Подключение пользовательской библиотеки в Си на самом деле не так просто, как кажется.
Ассемблер
В случае, если исходный язык является языком ассемблера (низкоуровневым языком, близким к машинному языку), то компилятор такого языка называется ассемблером.
Интерпретатор
Другой метод реализации — когда программа исполняется с помощью интерпретатора вообще без трансляции. Интерпретатор программно моделирует машину, цикл выборки-исполнения которой работает с командами на языках высокого уровня, а не с машинными командами. Такое программное моделирование создает виртуальную машину, реализующую язык.
Этот подход называется чистой интерпретацией. Чистая интерпретация применяется, как правило, для языков с простой структурой (например, АПЛ или Лисп). Интерпретаторы командной строки обрабатывают команды в скриптах в UNIX или в пакетных файлах (.bat) в MS-DOS также как правило в режиме чистой интерпретации.
Достоинство чистого интерпретатора: отсутствие промежуточных действий для трансляции упрощает реализацию интерпретатора и делает его удобнее в использовании, в том числе в диалоговом режиме. Недостаток — интерпретатор должен быть в наличии на целевой машине, где должна исполняться программа. Также, как правило, имеется более или менее значительный проигрыш в скорости. А свойство чистого интерпретатора, что ошибки в интерпретируемой программе обнаруживаются только при попытке выполнения команды (или строки) с ошибкой, можно признать как недостатком, так и достоинством.
Существуют компромиссные между компиляцией и чистой интерпретацией варианты реализации языков программирования, когда интерпретатор перед исполнением программы транслирует ее на промежуточный язык (например, в байт-код или p-код), более удобный для интерпретации (то есть речь идет об интерпретаторе со встроенным транслятором). Такой метод называется смешанной реализацией. Примером смешанной реализации языка может служить Perl. Этот подход сочетает как достоинства компилятора и интерпретатора (бо́льшая скорость исполнения и удобство использования), так и недостатки (для трансляции и хранения программы на промежуточном языке требуются дополнительные ресурсы; для исполнения программы на целевой машине должен быть представлен интерпретатор). Также, как и в случае компилятора, смешанная реализация требует, чтобы перед исполнением исходный код не содержал ошибок (лексических, синтаксических и семантических).
Динамическая компиляция
По мере увеличения ресурсов компьютеров и расширения гетерогенных сетей (в том числе Интернета), связывающих компьютеры разных типов и архитектур, выделился новый вид интерпретации, при котором исходный (или промежуточный) код компилируется в машинный код непосредственно во время исполнения, «на лету». Уже скомпилированные участки кода кэшируются, чтобы при повторном обращении к ним они сразу получали управление, без перекомпиляции. Этот подход получил название динамической компиляции.
Достоинством динамической компиляции является то, что скорость интерпретации программ становится сравнимой со скоростью исполнения программ в обычных компилируемых языках, при этом сама программа хранится и распространяется в единственном виде, независимом от целевых платформ. Недостатком является бо́льшая сложность реализации и бо́льшие требования к ресурсам, чем в случае простых компиляторов или чистых интерпретаторов.
Этот метод хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java,.NET Framework, Perl, Python.
Усложнители декомпиляции (шифраторы, обфускаторы)
в последнее время были проведены значительные исследования в области защиты программ от декомпиляции (http://www.cs.washington.edu/homes/douglas/publish/). Существует специальный класс программ (шифраторов, обфускаторов), усложняющих декомпиляцию. Такие программы используют два основных подхода.
- Общее (универсальное) усложнение.
- Целенаправленное усложнение (направленное против конкретного декомпилятор а).
+Основная идея усложнителей заключается в ухудшении кода. Усложненный код после декомпиляции должен быть непонятен и нечитаем программистом.
Декомпиляторы
программа, позволяющая по программе на языке низкого уровня (обычно это коды некоторой машины) получить программу на высокоуровневом языке, в некотором смысле ей эквивалентную. Под эквивалентностью чаще всего понимают эквивалентность внешних проявлений работы исходной программы и декомпилированной (http://www.it.uq.edu.au/groups/csm/dcc.html).
При решении разнообразных практических проблем в области программирования зачастую бывает полезно декомпилировать имеющиеся программы, исходные тексты которых недоступны. Эта задача пока что может быть решена лишь в частных случаях, хотя методы, применяемые для всех частных случаев, имеют много общего.
+Одной из важных составных частей задачи декомпиляции является анализ потоков управления при помощи исследования графа управления, полученного на этапе предварительного анализа программы на низкоуровневом языке. Дуги графа соответствуют условным и безусловным переходам между базовыми блоками программы, и он не содержит никакой информации об управляющих конструкциях высокого уровня, из которых должна состоять декомпилированная программа. Восстановление этих структур и есть основная задача анализа потоков управления при декомпиляции. Процесс, который необходимо выполнить при решении этой задачи, часто называют структуризацией графа управления. При структуризации каждую вершину графа управления надо сделать частью какой-либо высокоуровневой управляющей конструкции.
В настоящее время наиболее известны следующие декомпиляторы:
- Mocha и Crema входят в состав программного продукта Jbuilder компании Borland Inc. (http://www.borland.com/));
- Source Tee Java Decompiler (компании SourceTee Software Co. (http://www.srctec.com/decompiler/));
- Jad (авторская разработка Павла Кузнецова (http://www.sai.msu.su/sal/F/1/JAD.html)).
Смешение понятий трансляции и интерпретации
Трансляция и интерпретация — разные процессы: трансляция занимается переводом программ с одного языка на другой, а интерпретация отвечает за исполнение программ. Однако, поскольку, целью трансляции, как правило, является подготовка программы к интерпретации, то эти процессы обычно рассматриваются вместе. Например, языки программирования часто характеризуются как «компилируемые» или «интерпретируемые», в зависимости от того, что преобладает при использовании языка: компиляция или интерпретация. Причем, практически все языки программирования низкого уровня и третьего поколения, вроде ассемблера, Си или Модулы-2, являются компилируемыми, а более высокоуровневые языки, вроде Python или SQL, — интерпретируемыми.
С другой стороны, существует взаимопроникновение процессов трансляции и интерпретации: интерпретаторы могут быть компилирующими (в том числе с динамической компиляцией), а в трансляторах может требоваться интерпретация для конструкций метапрограммирования (например, для макросов в языке ассемблера, условной компиляции в Си или шаблонов в C++).
Более того, один и тот же язык программирования может и транслироваться, и интерпретироваться, и в обоих случаях должны присутствовать общие этапы анализа и распознавания конструкций и директив исходного языка. Это относится и к программным реализациям, и к аппаратным — так, процессоры семейства x86 перед исполнением инструкций машинного языка выполняют их декодирование, выделяя в опкодах поля операндов (регистров, адресов памяти, непосредственных значений), разрядности и т. п., а в процессорах Pentium с архитектурой NetBurst тот же самый машинный код перед сохранением во внутреннем кэше дополнительно транслируется в последовательность микроопераций.
Вау!! Ты еще не читал? Это зря!
- Двоичный транслятор (двоичный в двоичный, обычно код)
- Переводчик языка ассемблера (низкоуровневый исходный код, код)
- Преобразователь исходного текста в исходный (высокоуровневый исходный код , код)
- Rewriter (от источника к источнику, обычно код)
- Конвертер файлов (двоичный в двоичный, обычно данные)
- Транскодер (двоичный в двоичный, данные )
Напиши свое отношение про транслятор. Это меня вдохновит писать для тебя всё больше и больше интересного. Спасибо Надеюсь, что теперь ты понял что такое транслятор, интерпритатор, компилятор, декомпилятор, трансляция и для чего все это нужно, а если не понял, или есть замечания, то нестесняся пиши или спрашивай в комментариях, с удовольствием отвечу. Для того чтобы глубже понять настоятельно рекомендую изучить всю информацию из категории Языки и методы программирования. Теория трансляции
Источник: intellect.icu
3. Системы программирования
Интерпретаторы проводят анализ текста программы построчно и после нажатия Enter (переход к новой строке) сообщают об ошибке. Это огромное достоинство интерпретаторов, так как программисту не нужно пытаться найти ошибку во всём тексте программы. Минус — программы выполняются медленнее.
Компиляторы переводят всю написанную программу полностью. Плюс — быстрее скорость выполнения, минус — в случае ошибки приходится находить проблему вручную.
Программы разрабатывают на языках программирования.
Язык программирования — формальный язык, который предназначен для разработки программ.
Первые языки программирования были машинно-ориентированные, после создания языков высокого уровня их стали делить по области применения.
Классификация языков программирования
Языки для обучения программированию | Бейсик, Pascal, Logo, Python, КуМир |
Языки для написания интернет-сайтов | PHP, JavaScript, Python |
Профессиональные языки | Java, C, C(++), C#, Delphi, Lazarus |
Любая система программирования имеет ряд динамически подключаемых библиотек. Разберём использование модулей, входящих в библиотеки в двух самых распространённых языках программирования: PascalABC и Python.
PascalABC
Название (как вызвать) | Назначение |
Uses crt | Позволяет открывать выполнение программы в новом окне |
Uses GraphABC | Позволяет работать с графикой |
Python
Название (как вызвать) | Назначение |
import math | Подключает дополнительные возможности — использование математических функций: sqrt, abc, sin, cos и др. |
from fractions import Fraction | Поддерживает работу с рациональными числами |
Источник: www.yaklass.ru
Определение транслятора, компилятора, интерпретатора и ассемблера
Транслятор – это программа, которая переводит входную программу на исходном (входном) языке в эквивалентную ей выходную программу на результирующем (выходном) языке.
Результатом работы транслятора будет результирующая программа, но только в том случае, если текст исходной программы является правильным — не содержит ошибок с точки зрения синтаксиса и семантики входного языка. Если исходная программа неправильная (содержит хотя бы одну ошибку), то результатом работы транслятора будет сообщение об ошибке (как правило, с дополнительными пояснениями и указанием места ошибки в исходной программе). В этом смысле транслятор сродни переводчику, например, с английского, которому подсунули неверный текст.
Компилятор – это транслятор, который осуществляет перевод исходной программы в эквивалентную ей объектную программу на языке машинных команд или на языке ассемблера.
Таким образом, компилятор отличается от транслятора лишь тем, что его результирующая программа всегда должна быть написана на языке машинных кодов или на языке ассемблера. Результирующая программа транслятора, в общем случае, может быть написана на любом языке — возможен, например, транслятор программ с языка Pascal на язык С. Соответственно, всякий компилятор является транслятором, но не наоборот — не всякий транслятор будет компилятором. Например, упомянутый выше транслятор с языка Pascal на С компилятором являться не будет.
Ассемблер – компилятор, который переводит каждую команду исходной программы в одну машинную команду.
Интерпретатор — это программа, которая воспринимает входную программу на исходном языке и выполняет ее.
В отличие от трансляторов интерпретаторы не порождают результирующую программу (и вообще какого-либо результирующего кода) — и в этом принципиальная разница между ними. Интерпретатор, так же как и транслятор, анализирует текст исходной программы. Однако он не порождает результирующей программы, а сразу же выполняет исходную в соответствии с ее смыслом, заданным семантикой входного языка. Таким образом, результатом работы интерпретатора будет результат, заданный смыслом исходной программы, в том случае, если эта программа правильная, или сообщение об ошибке, если исходная программа неверна.
4.3 Общая схема работы компилятора
Основные функции компилятора:
1) проверка исходной цепочки символов на принадлежность к входному языку;
2) генерация выходной цепочки символов на языке машинных команд или ассемблере.
Процесс компиляции состоит из двух основных этапов: синтеза и анализа. На этапе анализа выполняется распознавание текста исходной программы и заполнение таблиц идентификаторов. Результатом этапа служит некоторое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблице идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код.
Данные этапы состоят из более мелких стадий, называемых фазами. Состав фаз и их взаимодействие зависит от конкретной реализации компилятора. Но в том или ином виде в каждом компиляторе выделяются следующие фазы:
1) лексический анализ;
2) синтаксический анализ;
3) семантический анализ;
4) подготовка к генерации кода;
5) генерация кода.
Определение Процесс последовательного чтения компилятором данных из внешней памяти, их обработки и помещения результатов во внешнюю память, называется проходом компилятора.
По количеству проходов выделяют одно-, двух-, трех- и многопроходные компиляторы. В данном пособии предлагается схема разработки трехпроходного компилятора, в котором первый проход – лексический анализ, второй — синтаксический, семантический анализ и генерация внутреннего представления программы, третий – интерпретация программы.
Общая схема работы компилятора представлена на рисунке 4.3.
Рисунок 4.1– Общая схема работы компилятора
Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:
Источник: studopedia.ru