Трансляторы

Автор работы: Пользователь скрыл имя, 10 Ноября 2011 в 22:42, реферат

Описание

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

Содержание

ВВЕДЕНИЕ 3
ЯЗЫКИ ПРОГРАММИРОВАНИЯ 4
ТРАНСЛЯТОРЫ 5
ВИДЫ ТРАНСЛЯТОРОВ 5
РЕАЛИЗАЦИИ 6
КОМПИЛЯТОРЫ И ИНТЕРПРЕТАТОРЫ 8
ИНТЕРПРЕТАТОР 9
ЭТАПЫ ТРАНСЛЯЦИИ 9
ЛЕКСИЧЕСКИЙ АНАЛИЗ 11
ЗАДАЧИ ЛЕКСИЧЕСКОГО АНАЛИЗА 11
СКАНЕР 12
ЗАМЕЧАНИЕ: 14
СИНТАКСИЧЕСКИЙ И СЕМАНТИЧЕСКИЙ АНАЛИЗ 14
ЗАКЛЮЧЕНИЕ 15
СПИСОК ЛИТЕРАТУРЫ 16

Работа состоит из  1 файл

translyator.doc

— 199.00 Кб (Скачать документ)

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

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

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

Этот метод  хорошо подходит для веб-приложений. Соответственно, динамическая компиляция появилась и поддерживается в той или иной мере в реализациях Java, Microsoft .NET, Perl, Python.

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

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

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

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

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

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

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

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

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

Этапы трансляции

    Основой любого естественного или искусственного языка является алфавит, определяющий набор допустимых  элементарных знаков (букв, цифр и служебных знаков). Знаки могут объединяться в слова  – элементарные конструкции языка, рассматриваемые в данном тексте (программе) как неделимые символы, имеющие определенный смысл. Иногда символ обозначают одним знаком, который можно тоже считать словом. Например, в языке С++ словами (символами) являются основные символы, идентификаторы, числа и некоторые ограничители, в частности знаки операций и скобки. Словарный состав языка – набор допустимых слов (символов) – вместе с описанием способов их представления составляет лексику языка.

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

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

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

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

    

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

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

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

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

    Транслятор, предложенный в данной  работе, имеет  следующую структуру:

Лексический анализ

Задачи  лексического анализа

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

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

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

    1. перекодировать исходную программу, рассматриваемую как входная строка, и привести ее к стандартному входному языку;
    2. выделить и собрать из отдельных знаков в слова идентификаторы и служебные слова (основные символы языка);
    3. выделить и собрать из цифр, а также перевести в машинную форму числовые константы.

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

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

       Другой  вид контроля, иногда применяемый  при лексическом анализе, - проверка сочетаемости стоящих рядом символов. Например, пары символов begin x и else begin – сочетаемы (допустимы), но те, же символы, стоящие в обратном порядке: x begin и begin else – несочетаемы. В то же время пары +end, +/, *[ - несочетаемы ни в каком порядке. Основной (главной) частью лексического анализатора является сканер.

Сканер

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

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

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

    Пусть входная строка: s1, s2, s3,…, sn.

          s,i   СКАНЕР     L,t

    где L – лексема, t – ее тип.

    

              0, константа типа int

              1, константа типа long_int

    t= 2, константа типа float

            3, константа типа char

              4, идентификатор

             -1, ошибка, не распознаваемый тип лексемы

    Сканер  в процессе своей работы распознает тип символа, то есть использует подпрограмму:

    

     s  класс символа  k

     где

                1, если si буква

                2, если si цифра

                3, если si `

    k= 4, если si “ или ”

                5, если si верный знак

Информация о работе Трансляторы