Трансля́тор — программа или техническое средство, выполняющее трансляцию программы.
Трансля́ция програ́ммы — преобразование программы, представленной на одном из языков программирования, в программу на другом языке. Транслятор обычно выполняет также диагностику ошибок, формирует словари идентификаторов, выдаёт для печати текст программы и т. д.
Преобразующая pascal-код в C-код
Реализации
Цель трансляции — преобразование текста с одного языка на язык, понятный адресату. При трансляции компьютерной программы адресатом может быть:
· устройство — процессор (трансляция называется компиляцией);
· программа — интерпретатор (трансляция называется интерпретацией).
Язык процессора (устройства, машины) называется машинным языком, машинным кодом. Код на машинном языке исполняется процессором. Обычно, машинный язык — язык низкого уровня, но существуют процессоры, использующие языки
Компилятор — транслятор, преобразующий исходный код с какого-либо языка программирования на машинный язык.
Языки программирования и методы трансляции. Лекция 10. Ассемблер. Компилятор компиляторов. Раскрутка
Процесс компиляции, как правило, состоит из нескольких этапов:
· создание на основе результатов анализов промежуточного кода;
· оптимизация промежуточного кода;
· создание объектного кода, в данном случае машинного.
Программа может использовать сервисы, предоставляемые операционной системой, и сторонние библиотеки (например, библиотеки для работы с файлами и библиотеки для создания графического интерфейса). Для добавления в объектный файлмашинного кода из других объектных файлов (кода статических библиотек) и информации о динамических библиотеках выполняется связывание или компоновка. Связывание или компоновка выполняется редактором связей или компоновщиком. Компоновщик может быть отдельной программой или частью компилятора.
Ассемблер — компилятор, преобразующий текст с языка ассемблера на машинный язык. Язык ассемблера — язык, близкий к машинному языку, язык низкого уровня.
Интерпретация — процесс чтения и выполнения исходного кода. Реализуется программой — интерпретатором.
Интерпретатор может работать двумя способами:
1. читать код и исполнять его сразу (чистая интерпретация [6] );
2. читать код, создавать в памяти промежуточное представление кода (байт-код или p-код), выполнять промежуточное представление кода (смешанная реализация).
В первом случае трансляция не используется, а во втором — используется трансляция исходного кода в промежуточный код.
Этапы работы интерпретатора:
· создание промежуточного представления кода (при чистой интерпретации не выполняется);
Интерпретатор моделирует машину (виртуальную машину), реализует цикл выборки-исполнения команд машины. Команды машины записываются не на машинном языке, а на языке высокого уровня. Интерпретатор можно назвать исполнителем языка виртуальной машины.
Чистая интерпретация применяется, обычно, для языков с простой структурой, например, языков сценариев, языков АПЛ и Лисп.
Этапы компиляции на Си: предобработка, трансляция, компоновка
Примеры интерпретаторов, создающих байт-код: Perl, PHP, Python, Erlang.джава скрипт
Архитектура компьютера
Основным элементом материнская плата. На ней разведены линии связи (шины) между всеми (и друг с другом) посредством разъемов и портов. Не существует универсальных материнских плат, так как каждая из них предназначена для работы с совершенно определенным классом процессоров.
Центральный процессор – вычислительное ядро всего компьютера. Представлен крупной микросхемой с миллиардами транзисторов внутри, формирующими функциональные блоки. Любая запущенная на выполнение программа незаметно для пользователя преобразуется (интерпретируется) в машинный код и исполняется именно на центральном процессоре. Архитектура компьютера во многом определяется типом CPU.
Оперативная память(озу кратковременная память)является необходимой частью любого вычислительного устройства, даже простейшего калькулятора. В компьютерах транзисторы памяти реализованы в микросхемах, припаянных к планке текстолита с рядом медных скользящих контактов. Каждая планка вставляется в соответствующий разъем материнской платы. Кроме оперативной, существует принципиально иной вид памяти. Он представлен, прежде всего, устройствами на магнитных дисках (винчестеры)
кэш быстродействующая память помогает озу для кратковременного хранение
внешняя память.
Кроме внутренних комплектующих, существует огромное количество внешних устройств. Лишь благодаря им удается обеспечивать взаимодействие человека и машины. Например, монитор, мышка, клавиатура, тачскрин, а также сканер, принтер и т.д. – все это внешние устройства, без которых компьютер оставался бы простым металлическим ящиком, вещью в себе.
Источник: cyberpedia.su
Трансляция, компиляция и интерпретация программ
3 ТРАНСЛЯЦИЯ, КОМПИЛЯЦИЯ И ИНТЕРПРЕТАЦИЯ ПРОГРАММ. Основные понятия Транслятором называется программа, которая переводит программу с некоторого входного языка в программу на выходном языке. Кроме понятия «транслятор» имеется термин «компилятор». Компилятором называется транслятор, который переводит программу на входном языке в программу на ассемблере или в машинных кодах.
Полученная компилятором программа не может быть непосредственно выполнена, так как для этого необходима работа программы-загрузчика, загружающего программу в память. Процесс компиляции состоит из двух этапов – анализа и синтеза. Рис.
4.1 — Схема работы компилятора На этапе анализа осуществляется распознавание языка исходной программы и проверка правильности конструкций и смысловых особенностей языка. Выделяют этапы лексического, синтаксического и семантического анализа. На этапе лексического анализа осуществляется чтение символов входного языка и построение элементарных слов (лексем) входного языка.
Примерами лексем ЯП являются константы, идентификаторы, ключевые слова. Выделенные на этапе лексического анализа идентификаторы заносятся в специальные служебные таблицы компилятора. Модуль компилятора, выполняющий лексический анализ, называется сканером.
При синтаксическом анализе выполняется проверка правильности конструкций исходной программы в соответствии с правилами грамматики, описывающей входной язык компилятора. Терминалами в такой грамматике являются лексемы. В качестве примера рассмотрим построение КС-грамматики для выражений.
Для этого применим следующий алгоритм: 1) все допустимые операции в выражении упорядочим в порядке возрастания приоритета. 2) Каждому уровню приоритета i поставим соответствие нетерминал Аi, причем нетерминалу А0 («выражение») соответствует самый низкий уровень приоритета 0. Тогда получим нетерминалы А0…Аn.
3) Добавим нетерминал Аn+1, соответствующий понятию «элементарное выражение». 4) Для каждого нетерминала Аi (0 Ai+Ai+1 — для бинарной операции, выполняющейся справа налево Аi->Ai+1+Ai — для унарной префиксной операции, используем. однократно Ai->+Ai+1 — для унарной префикс.операции, используем. многократно Ai->+ Ai — для унарной постфиксной операции, использ. однократно Ai->Ai+1+ — для унарной постфикс.операции, используем. многократно Ai->Ai+ 5) Для каждого нетерминала Аi (0 Ai+1 6) Для Аn+1 записываются правила двух типов: Аn+1-> … Аn+1-> (А0) Унарные операции «+» и «-« поднимают в таблице приоритетов до верхнего уровня, соответствующего А0.
Например, пусть выражение состоит из идентификаторов, целых констант, связанных знаками «+», «-«, «*», «/». КС-грамматика, описывающая синтаксис выражения, имеет вид: А0 -> +A1 –A1 A0+A1 A0-A1 A1 А1 -> A1*A2 A1/A2 A2 А2 -> (A0) Существуют различные подходы при построении блока синтаксического анализа, зависящие от метода грамматического разбора исходной программы и от особенностей входного языка.
Семантический анализ отвечает за проверку соответствия текста программы смысловым особенностям языка, например, правильности использования идентификаторов с точки зрения обязательности их описания и области видимости, проверку корректности обращений к функциям, элементам массивов. Результатом работы блока анализа является внутренняя форма представления исходной программы, являющаяся промежуточной для этапа синтеза объектного кода.
На этапе генерации кода осуществляется формирование конструкций программы на выходном языке. Генерация включает в себя оптимизацию кода, необходимую для улучшения его эффективности. Процесс компиляции состоит из нескольких этапов, причем для различных компиляторов некоторые из них могут быть объединены.
Процесс обработки исходной программы может быть выполнен за один ее просмотр или проход, тогда говорят об однопроходном компиляторе. На практике же современные компиляторы выполняют несколько проходов, на каждом из которых формируются промежуточные данные, необходимые для последующих проходов.
При выполнении каждого последующего прохода компилятору доступны результаты более ранних проходов, и текст исходной программы. Результаты проходов являются данными, недоступными пользователю, как правило, они хранятся в оперативной памяти или во временных файлах на диске.
Идеал – это однопроходные компиляторы, однако они реальны только для очень простых языков с жестким синтаксисом и семантикой. Обычно компиляторы имеют от 2 до 5 проходов. Интерпретатор – это программа. которая осуществляет проверку правильности синтаксических конструкций входного языка и организует их выполнение. Результирующую программу интерпретатор не порождает.
Это означает, что оптимизация исходной программы для интерпретатора, в отличие от компилятора, отсутствует. Преимуществом интерпретатора перед компилятором является относительная простота его реализации и независимость от архитектуры вычислительной системы, где будет выполняться программа. Примером интерпретируемого языка является HTML.
Примером простейшего компилятора является компилятор с языка Ассемблер, где один оператор исходного языка транслируется в одну машинную команду. Синтаксис языка описывается простой КС-грамматикой, а семантический анализ необходим для проверки правильности типов операндов для команд, проверки описания идентификаторов и меток и правильного употребления ключевых слов ассемблера.
Рассмотрим алгоритмы построения блоков компилятора более подробно. Сначала рассмотрим пример описания с помощью КС-грамматики модельного языка. Программа: главная программа языка VMKS. Допускается описание функций с параметрами, тип void.
Типы данных: integer, symbol Операции: арифметические (+-*/), сравнения (==,<>) Операторы: присваивания, if Операнды: простые переменные, константы Константы: целые, символьные Грамматика имеет вид: S -> S | S | -> general -> void ( ) -> integer ; | symbol ; -> , | -> -> integer | symbol -> , | -> | = -> | -> -> | | -> begin end -> | -> | | | | -> = ; -> == | <> | + | — | -> + | — | -> * | / | -> if then -> otherwise | -> ( ); -> , | -> | |( )| -> 0| -> ‘ ’ -> | -> | |… -> a|b|c|…|z|A|B|C|…|Z -> 0|1|2|…|9 -> 1|2|…|9 4 Лексический анализ Лексема – это структурная единица языка, которая состоит из символов языка и не содержит в себе других лексем. Лексемами языков программирования являются идентификаторы, константы, ключевые слова, знаки операций.
Лексический анализатор (сканер) – это часть компилятора, выполняющая чтение исходной программы и выделение в ее тексте лексем. Теоретически лексический анализ можно совмещать с синтаксическим, однако это совмещение практически отсутствует в современных компиляторах из-за следующих причин: — сканер упрощает анализ исходного текста, позволяя отбросить комментарии и незначащие элементы входного текста, например, пробелы; — сканер работает по простым алгоритмам, а синтаксический анализатор – по достаточно сложным, поэтому их целесообразно не смешивать вместе; — изменение синтаксиса языка не повлечет изменения сканера, так как лексический уровень языка при этом останется без изменений.
Возможны два метода связи лексического и синтаксического анализаторов. При первом методе сканер анализирует всю исходную программу и формирует последовательность лексем, которая затем поступает на вход синтаксическому анализатору. При втором методе синтаксический анализатор вызывает сканер по мере необходимости получения очередной лексемы из текста программы.
Так как сканер выделяет такие лексемы, как идентификаторы и константы, описываемые регулярными выражениями, то распознавать эти выражения возможно с помощью конечных недетерминированных автоматов-распознавателей. Конечный автомат-распознаватель для цепочки входного языка определяет ее принадлежность языку, поэтому в основе алгоритма работы сканера лежит алгоритм работы конечного автомата.
Сканер должен определять границы лексем, формировать лексему и выдавать сообщение об ошибке в лексеме, если текущий входной символ не соответствует ожидаемому для конечного автомата. Как правило, границами лексем являются такие терминальные символы, как пробелы, специальные символы.
Перед программированием сканера строится таблица лексем языка, в которой для каждой лексемы указывается ее изображение, тип и символ-ограничитель. Тип каждой лексемы должен быть уникален и кодироваться целым числом. В таблицу лексем вводятся специальный символ конца исходного модуля и тип, соответствующий ошибочному символу. ПРИМЕР.
Для выделения лексем языка строится конечный автомат, детерминируется, в его заключительных состояниях отмечается тип лексемы, распознанной в этом состоянии. Так как ключевые слова языка представляют собой идентификаторы, то для простоты конечный автомат выделяет идентификатор, а в программе сканера осуществляется его сравнение со множеством ключевых слов, после чего устанавливается тип выделенной лексемы.
Рассмотрим практическую реализацию сканера. Сканер – это функция, которая при одном обращении к ней выделяет одну лексему и возвращает изображение лексемы и ее тип.
В своей работе сканер использует следующие глобальные данные: #define MaxText 100000 // макс. длина текста #define MaxLex 25 // макс. длина одной лексемы char t[MaxText]; //текст исходной программы int uk; // указатель на текущий символ в тексте int str, stolb; // строка и столбец в тексте Изображение и тип лексемы определяются как typedef char LEX[MaxLex]; LEX l; // изображение лексемы int typ; // тип лексемы Перед программированием сканера определяется, какие комментарии предусмотрены в тексте исходного модуля. Это необходимо для организации пропуска комментариев в тексте.
Также пропускаются пробелы, символы перевода строки, комментарии. Программа сканера имеет вид: int skaner(LEX l) < int typ; // тип лексемы int i; // текущая длина лексемы for(i=0;i ;>else < реализация модели КА и возврат типа лексемы>> Конечный автомат распознает лексемы и возвращает их тип. Различают явный и неявный способы программирования сканера.
При явном способе сканер является универсальной программой, работающей с последовательностью правил автомата в соответствии со значением текущего состояния и символа на входе автомата. При неявном способе программирования сканера понятие текущего состояния отсутствует, и код сканера для каждого состояния осуществляет проверки, необходимые в этом состоянии.
Каждому состоянию ставится в соответствие метка и сканер имеет вид: Met1: обработка состояния 1 … Metn: обработка состояния N Метка Met1 при этом должна соответствовать начальному состоянию. Обработка состояния зависит от типа состояния (начальное, заключительное, обычное): 1. Если состояние ни начальное, ни заключительное: Metk: if (t[uk]==’a’) else if (t[uk]==’b’) else Программа выдачи текста ошибки работает с передаваемым в функцию номером ошибки, сообщая номер строки и столбца текста, где она находится.
Ошибка выдается сканером, если обнаружен недопустимый символ, или найдена ошибка в структуре лексемы. Для лексем, фактическая длина которых превышает зарезервированную возможную длину, можно выдавать предупреждение и «урезать» лексему, либо сообщать об ошибке.
Для проверки символа на букву или цифру осуществляется его сравнение с границами их возможных диапазонов: (t[uk]>=’0’)(t[uk] , Если распознан идентификатор, то для корректного возврата типа надо проверить, не ключевое ли это слово. 4. Если состояние k – заключительное, то Metk: if (t[uk]==’a’) else if (t[uk]==’b’) else Например, пусть сканер распознает целые константы, знаки «+», «=», «==». Конечный автомат: q0 Тогда фрагмент сканера для конечного автомата имеет вид: q0: if ((t[uk] =’0’) else if (t[uk]==’+’) else if (t[uk]==’=’) else q1: while((t[uk] =’0’) l[i++]=t[uk++]; return t_const; q3: if (t[uk]==’=’) else return t_oneequal; При программировании сканера целесообразно запрограммировать модули defs.h, scaner.hpp, scaner.cpp. Кроме функции выдачи ошибки предусмотреть функции int GetUk(void) и void SetUk(int uk1).
В закладки
Разместил пособие
Эксперт по предмету «Информационные технологии»
Поделись лекцией и получи скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту
Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас
Загрузить еще лекции
Поделись лекцией и получи промокод на скидку 30% на платформе Автор24
Заполни поля и прикрепи лекцию. Мы вышлем промокод со скидкой тебе на почту
Твоя лекция отправлена! Жди скидку на почте. Есть еще материалы? Загрузи прямо сейчас
Источник: spravochnick.ru
Правильны ли понятия трансляции, компиляции и интерпретации в книгах Таненбаума?
Изучаю 6-е издание «Архитектура компьютера» Таненбаума. В книге даются следующие определения.
Трансляция — это перевод программы с одного языка на другой, когда каждая команда исходной программы заменяется на команду или набор команд целевого. При этом весь исходный текст переводится на новый язык и затем используется.
Интерпретация — тоже самое, но каждая исходная команда заменяется на набор команд целевого языка и тут же исполняется интерпретатором.
Компиляция у него означает тоже самое, что и трансляция.
В других источниках дается несколько другое определение:
Трансляция — процесс перевода программы с одного языка на другой. Делится он на компиляцию и интерпретацию. Когда целевой язык — машинный или ассемблер, то это компиляция. Когда другая программа, то это интерпретация.
Подскажите все же правильное определение этих терминов.
- Вопрос задан более трёх лет назад
- 2687 просмотров
Комментировать
Решения вопроса 1
В том смысле, как эти термины подразумеваются Танненбаумом, различие между трансляцией и компиляцией в том, что в первом случае происходит взаимно-однозначное (и потенциально обратимое) преобразование операторов входного языка (исходника) в команды исполнителя, а компиляция — более «творческий» процесс, когда одному оператору входного языка будет соответствовать произвольное (обычно довольно существенное) число команд исполнителя, однозначность возможна лишь на уровне блоков кода, а обратимость практически утеряна (однозначная декомпиляция невозможна).
На практике трансляторами являются различные ассемблеры, а компиляторами — генераторы машкода языков высокого уровня (ЯВУ). Это отражено в литературе: ассемблирование программ ассемблером называют трансляцией, а трансляцию (каламбур!) в машкод языков высокого уровня — компиляцией. Иногда говорят «трансляция с ЯВУ», подразумевая неоднозначность процесса явно.
Другое использование термина «трансляция» — в качестве объединяющего для компиляции и интерпретации. В этом случае речь идет только о языках высокого уровня, ассемблеры остаются за скобками.
У себя на форуме я неправильно использовал эти термины
После углубленного изучения темы выяснилось, что процесс генерации обратимого кода для дальнейшего добавления в базу правильней называть трансляцией и установкой, а не компиляцией. В окончательном документе это будет учтено.
Источник: qna.habr.com