Слайд 2Поскольку текст, записанный на языке программирования, непонятен компьютеру, то требуется перевести
его на машинный код. Такой перевод программы с языка программирования на язык машинных кодов называется трансляцией, а выполняется она специальными программами – трансляторами.
Транслятор - обслуживающая программа, преобразующая исходную программу, предоставленную на входном языке программирования, в рабочую программу, представленную на объектном языке.
Понятие
Слайд 4ОСНОВНЫЕ ГРУППЫ
В настоящее время трансляторы разделяются на три основные группы: ассемблеры,
компиляторы и интерпретаторы.
Ассемблер - системная обслуживающая программа, которая преобразует символические конструкции в команды машинного языка. Специфической чертой ассемблеров является то, что они осуществляют дословную трансляцию одной символической команды в одну машинную. Таким образом, язык ассемблера (еще называется автокодом) предназначен для облегчения восприятия системы команд компьютера и ускорения программирования в этой системе команд. Программисту гораздо легче запомнить мнемоническое обозначение машинных команд, чем их двоичный код.
Вместе с тем, язык ассемблера, кроме аналогов машинных команд, содержит множество дополнительных директив, облегчающих, в частности, управление ресурсами компьютера, написание повторяющихся фрагментов, построение многомодульных программ. Поэтому выразительность языка намного богаче, чем просто языка символического кодирования, что значительно повышает эффективность программирования.
Компилятор - это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд (например, Пролог). Кроме того, в исходных языках достаточно часто используется строгая типизация данных, осуществляемая через их предварительное описание. Программирование может опираться не на кодирование алгоритма, а на тщательное обдумывание структур данных или классов. Процесс трансляции с таких языков обычно называется компиляцией, а исходные языки обычно относятся к языкам программирования высокого уровня (или высокоуровневым языкам). Абстрагирование языка программирования от системы команд компьютера привело к независимому созданию самых разнообразных языков, ориентированных на решение конкретных задач. Появились языки для научных расчетов, экономических расчетов, доступа к базам данных и другие.
Интерпретатор - программа или устройство, осуществляющее пооператорную трансляцию и выполнение исходной программы. В отличие от компилятора, интерпретатор не порождает на выходе программу на машинном языке. Распознав команду исходного языка, он тут же выполняет ее. Как в компиляторах, так и в интерпретаторах используются одинаковые методы анализа исходного текста программы. Но интерпретатор позволяет начать обработку данных после написания даже одной команды. Это делает процесс разработки и отладки программ более гибким. Кроме того, отсутствие выходного машинного кода позволяет не "захламлять" внешние устройства дополнительными файлами, а сам интерпретатор можно достаточно легко адаптировать к любым машинным архитектурам, разработав его только один раз на широко распространенном языке программирования. Поэтому, интерпретируемые языки, типа Java Script, VB Script, получили широкое распространение. Недостатком интерпретаторов является низкая скорость выполнения программ. Обычно интерпретируемые программы выполняются в 50-100 раз медленнее программ, написанных в машинных кодах.
Слайд 5Блоки транслятора
Лексический блок
На этом этапе выполняется лексический анализ, когда последовательность
входных символов на исходном языке преобразуется в последовательность лексем. Лексема – наименьшая цепочка исходного языка, имеющая заранее определенный смысл. Лексема состоит из двух частей:
• класс – указывает на характер информации в лексеме;
• значение – собственно значение лексемы.
Синтаксический блок
На данном этапе выполняется синтаксический анализ, когда цепочка лексем преобразуется в цепочку атомов. Атом – элементарная операция; последовательность атомов отражает порядок выполнения операций. Атом состоит из двух частей:
• класс – вид операции;
• значение – набор указателей на операнды операции.
Семантический блок
Например, происходит привязка идентификаторов к декларациям, типам, проверке совместимости, определению типов выражений и т. д.
Генератор кода
На данном этапе выполняется генерация кода, а именно преобразование цепочки атомов в цепочку команд машинного языка. Генератор кода является машинно-зависимым блоком транслятора.
Блок оптимизации
Блок оптимизации не является обязательным. На этом этапе выполняется применение различных методов преобразования кода. Ускорение работы программ, уменьшение количества операций ввода вывода. Оптимизация может быть на разных уровнях и этапах, например, над промежуточным кодом или над конечным машинным кодом.
Слайд 6Виды трансляторов
Трансляторы подразделяют:
· Адресный. Функциональное устройство, преобразующее виртуальный адрес (англ. Virtual
address) в реальный адрес (англ. Memory address).
· Диалоговый. Обеспечивает использование языка программирования в режиме разделения времени.
· Многопроходной. Формирует объектный модуль за несколько просмотров исходной программы.
· Обратный. То же, что детранслятор. См. также: декомпилятор, дизассемблер.
· Однопроходной. Формирует объектный модуль за один последовательный просмотр исходной программы.
· Оптимизирующий. Выполняет оптимизацию кода в создаваемом объектном модуле.
· Синтаксически-ориентированный (синтаксически-управляемый). Получает на вход описание синтаксиса и семантики языка и текст на описанном языке, который и транслируется в соответствии с заданным описанием.
· Тестовый. Набор макрокоманд языка ассемблера, позволяющих задавать различные отладочные процедуры в программах, составленных на языке ассемблера.