Транслятор это программа преобразующая

Вопрос № 9. Трансляторы. Этапы трансляции. Генерация кода.

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

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

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

Компилятор — это обслуживающая программа, выполняющая трансляцию на машинный язык программы, записанной на исходном языке программирования. Также как и ассемблер, компилятор обеспечивает преобразование программы с одного языка на другой (чаще всего, в язык конкретного компьютера). Вместе с тем, команды исходного языка значительно отличаются по организации и мощности от команд машинного языка. Существуют языки, в которых одна команда исходного языка транслируется в 7-10 машинных команд. Однако есть и такие языки, в которых каждой команде может соответствовать 100 и более машинных команд (например, Пролог).

Урок 1. Краткая история языков программирования. Трансляторы

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

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

^ Общие особенности языков программирования и трансляторов.

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

  1. Языки программирования предназначены для облегчения программирования. Поэтому их операторы и структуры данных более мощные, чем в машинных языках.
  2. Для повышения наглядности программ вместо числовых кодов используются символические или графические представления конструкций языка, более удобные для их восприятия человеком.
  3. Для любого языка определяется:
  • Множество символов, которые можно использовать для записи правильных программ (алфавит), основные элементы.
  • Множество правильных программ (синтаксис).
  • «Смысл» каждой правильной программы (семантика).

11 Введение в разработку трансляторов

  1. Этап лексического анализа.
  2. Этап синтаксического анализа, состоящий из:
    • распознавания синтаксической структуры;
    • семантического разбора, в процессе которого осуществляется работа с таблицами, порождение промежуточного семантического представления или объектной модели языка.
    • Этап генерации кода, осуществляющий:
      • семантический анализ компонент промежуточного представления или объектной модели языка;
      • перевод промежуточного представления или объектной модели в объектный код.

      2а. Этап исследования и оптимизации промежуточного представления, состоящий из:

      2а.1. анализа корректности промежуточного представления;

      2а.2. оптимизации промежуточного представления.

      3а. Этап оптимизации объектного кода.

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

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

      Обобщенная структура компилятора, учитывающая существующие в нем этапы, представлена на рис. 1.4.

      Он состоит из лексического анализатора, синтаксического анализатора, генератора кода, анализатора ошибок.

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

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

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

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

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

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

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

      Транслитератор.

      • буква — класс, с которым сопоставляется множество букв, причем необязательно только одного алфавита;
      • цифра — множество символов, относящихся к цифрам, чаще всего от 0 до 9;
      • разделитель — пробел, перевод строки, возврат каретки перевод формата;
      • игнорируемый — может встречаться во входном потоке, но игнорируется и поэтому просто отфильтровывается из него (например, невидимый код звукового сигнала и другие аналогичные коды);
      • запрещенный — символы, который не относятся к алфавиту языка, но встречается во входной цепочке;
      • прочие — символы, не вошедшие ни в одну из определенных категорий.
      • многопроходную организацию, при которой каждая из фаз является независимым процессом, передающим управление следующей фазе только после окончания полной обработки своих данных;
      • однопроходную организацию, при которой все фазы представляют единый процесс и передают друг другу данные небольшими фрагментами.
      Читайте также:
      Какие программы нужны директору

      Источник: geum.ru

      Создание транслятора

      Джаноян Елена Владимировна

      В работе рассмотрены вопросы построения трансляторов и приведен пример созданного интерпретатора.

      В работе рассмотрены: метод создания транслятора с помощью записи, называемый РБНФ-грамматикой, схемы работы частей транслятора — лексического анализатора, синтаксического анализатора и генератора кода.

      В практической части работы приведен пример простого интерпретатора. Язык программирования MatLang разработан для автоматизации простых вычислений. Он представляет собой набор математических операторов и функций. В нём также можно использовать переменные. Интерпретатор языка MatLang написан на C++ в среде VisualStudio 2008.

      Его размер – 27 Кб, что отражает простоту языка и работы его интерпретатора. Для его работы требуется ОС WindowsXP/Vista/7/8 и пакет VisualC++ 2008 Redistributable. Устройство работы интерпретатора простое. Он состоит из лексического и синтаксического анализатора. Синтаксический анализатор работает по методу рекурсивного спуска.

      Если ему требуется лексема из входной цепочки, то он вызывает процедуру Get() и считывает её из переменной token.Синтаксический анализатор не строит синтаксическое дерево, а сразу исполняет выделенные из входной цепочки команды. Это сделано для того, чтобы ускорить процесс интерпретации, так как команды языка исполняются без ветвления, линейно. Интерпретатор работает в диалоговом режиме. Команды вводятся построчно, и он сразу же их исполняет. Есть возможность автоматизации путём перенаправления потоков ввода/вывода.

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

      Скачать:

      ВложениеРазмер
      Файлработа 60.76 КБ

      Предварительный просмотр:

      Тема: «Создание трансляторов»

      Выполнил: Джиджоев Владислав ,

      ученик 8 класса

      МБОУ-лицей г. Владикавказ

      Научный руководитель: Джаноян Елена Владимировна,

      Язык программирования MatLang ……………………………….……………………. 11

      Интерпретатор языка MatLang ………………………………………………………… 12

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

      Трансляторы делятся на 2 вида: компиляторы и интерпретаторы. Компилятор – это транслятор, целевым языком которого является машинный код, исполняемый процессором. Например, компилятор С++ переводит код на С++ в команды исполняемые процессором. Компилятор Pascal переводит код на языке Pascal в команды процессора.

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

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

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

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

      Затем появился первый «высокоуровневый» язык программирования. Это был FORTRAN. Высокоуровневые языки отличаются наличием абстракций от реального процессора. FORTRAN был разработан специально для выполнения математических вычислений. Затем стало появляться много других ЯП и концепций программирования: структурное программирование, процедурное программирование, логическое программирование, объектно-ориентированное программирование и т.д.

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

      Как уже было сказано, язык программирования (ЯП) – это формальная знаковая система, предназначенная для записи компьютерных программ. Первые языки программирования начали разрабатываться в начале второй половины ХХ века. Сейчас их число приближается к 1500.

      Языки делятся по концепциям, моделям памяти, возможностью интерпретации, типу синтаксиса. Но, для того чтобы создать транслятор языка программирования, его синтаксис нужно описать. Это можно сделать словесно, однако это не очень удобно и не всегда лаконично. А можно использовать метод записи, называемый РБНФ-грамматикой.

      Расширенная Бекус-Наурова Форма (РБНФ) – формальная система записи синтаксиса, в которой одни синтаксические категории определяются через другие. Была разработана Никлаусом Виртом. Является расширением метода записи «БНФ» (Бекус-Наурова форма), использовавшейся до создания РБНФ.

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

      Терминалы – это минимальные элементы грамматики, не имеющие собственной структуры, и используемые «как есть». Например, буквы в русском языке, или ключевые слова в языке Си.

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

      Правила (продукции) в РБНФ имеют такой вид:

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

      Семантика правила РБНФ – нетерминал, заданный именем слева от знака равенства, представляет собой определяемую выражением комбинацию терминалов и нетерминалов (слева от знака «равно»).

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

      Определение выражения в РБНФ состоит всего из 4-х конструкций: конкатенация, выбор, вхождение и повторение.

      • Конкатенация не имеет специального обозначения. Она определяется последовательной записью символов в выражении. Правило типа A = BC. обозначает, что нетерминал А состоит из последовательно идущих терминалов Bи C. Элементы конкатенации обычно называют синтаксическими факторами, или просто «факторами».
      • Выбор обозначается вертикальной чертой («|»). Правило A = B | C | D. обозначает, что А может состоять либо из B, либо из C, либо из D. Элементы выбора называют синтаксическими термами, или просто «термами».
      • Вхождение обозначается парой квадратных скобок. Оно выделяет необязательные элементы выражения. Например, правило A = [B]. означает, что нетерминал А либо пуст, либо состоит из нетерминала В.
      • Повторение обозначается парой фигурных скобок. Обозначают конкатенацию любого числа всех элементов в них. Например, выражение A = . подразумевает, что нетерминал А либо пуст, либо представляет собой конкатенацию любого кол-ва B (т.е. A либо пуст, либо состоит из B, или BB, или из BBB и т.д.).
      • Дополнительно в РБНФ могут использоваться круглые скобки. Он требуются при группировке операций. Например, правило A = (B|C)(D|E). означает, что Aсостоит из 2-х символов, первым из которых является В или С, вторым – D или Е.
      Читайте также:
      Лучшая бесплатная программа для сжатия видео

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

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

      Обычный транслятор чаще всего состоит из 3-х частей: лексического анализатора, синтаксического анализатора и генератора кода. Но чаще всего в компилятор входит также семантический анализатор и оптимизатор. Рассмотрим работу каждого из них.

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

      Схема работы лексического анализатора:

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

      Пример разбора выражения в синтаксическое дерево:

      Существует 2 типа алгоритмов синтаксического анализа:

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

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

      Рекурсивный спуск – это эффективный и простой алгоритм распознавания. Он состоит в следующем.

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

      GetSym(); // считывание начального символа цепочки

      S(); // вызов распознающей процедуры начального нетерминала

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

      Каждая анализирующая процедура строится по соответствующему нетерминалу, описанному в РБНФ. Для каждой РБНФ-конструкции K существует правило перевода, которое порождает фрагмент анализатора Pr(K). Правила перевода из РБНФ в текст программы показаны в таблице ниже. В них token – глобальная переменная, указывающая на последнюю прочитанную процедурой GetSym() лексему.

      Функция first(token, exp) возвращает true, если лексема token является начальной для нетерминала exp. Процедура error() завершает работу программы, сигнализируя пользователю о том, что последовательность символов не принадлежит к языку.

      Источник: nsportal.ru

      Транслятор – это… Виды трансляторов. Преобразование и трансляция программы

      Транслятор

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

      Транслятор: основные понятия

      Такая программа как транслятор представляет собой лингвистическое представление вычислений I ->P ->P (i). Интерпретатор представляет собой программу, на вход которой подается программа P с некоторыми входными данными X.Выполняет он P на X: I(P, x)=P(x).Существует единственный транслятор, который способен выполнять все возможные программы (которые можно представить в формальной системе).

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

      Программа транслирует программы на ассемблере в машинный язык. Компилятор позволяет транслировать с языка высокого уровня на язык более низкого уровня. Транслятор представляет собой программу, которая в качестве входных данных принимает программу на некотором языке S и после обработки выдает программу на языке T.Таким образом, они обе имеют ту же семантику: P->X->Q.

      Таким образом, для любого xP(x)=Q(x). Если транслировать всю программу в нечто интерпретируемое, то это называется компиляцией перед исполнением или компиляцией AOT. Компиляторы AOT могут использоваться последовательно. Последний из них очень часто является ассемблером.

      Так, рассмотрим пример: Исходный код ->Компилятор (транслятор) -> Ассемблерный код -> Ассемблер (транслятор) -> Машинный код -> ЦПУ (интерпретатор). Динамическая или оперативная компиляция осуществляется в том случае, если часть программы транслируется, когда исполняются другие скомпилированные ранее части. Трансляторы JIT запоминают то, что они уже выполнили ранее, чтобы снова и снова не повторять исходный код. Они даже способны выполнять адаптивную компиляцию и перекомпиляцию, которая основана на поведении среды выполнения программы. Многие языки дают возможность выполнять код во время трансляции, а также компилировать новый код во время выполнения программы.

      Трансляция: этапы

      Процесс трансляции состоит из этапов синтеза и анализа. Схематично этот процесс выглядит примерно следующим образом: Исходный код -> Анализатор -> Концептуальное представление -> Синтезатор (генератор) -> Целевой код. Обусловлено это следующими причинами:

      — любой другой способ просто не подходит;

      — перевод по словам просто не работает.

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

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

      Запись транслятора

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

      1. Транслятор – это самокомпилятор, если исходный язык у него соответствует базисному.
      2. Саморезидентным называется компилятор, у которого целевой язык равняется базисному.
      3. Если целевой и базисный языки различные, то транслятор – это кросс-компилятор.
      Читайте также:
      Как изменить фон в программе киностудия

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

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

      Масштабная технология

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

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

      Какие проблемы могут возникать с исходным языком? Легко ли его скомпилировать? Имеется ли для этого препроцессор? Каким образом обрабатываются типы? Какая группировка проходов компилятора используется – одно- или многоходовая?

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

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

      Необходимый набор инструментов

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

      Что касается вида целевого кода для генерации, тут необходимо выбирать из чистого, дополненного или виртуального машинного кода. Можно также написать входную часть, которая создает популярные промежуточные представления, такие как LLVM, JVM, RTL. Можно также сделать трансляцию из исходного в исходный код на Java Script или C. Если говорить о формате целевого кода, тут здесь можно выбрать переносимый машинный код, машинный код образа памяти, язык ассемблера.

      Перенацеливание

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

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

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

      — входная программа поступает в лексический анализатор, или по-другому сканер, который преобразует ее в поток токенов;

      — синтаксический анализатор (парсер) строит из них абстрактное синтаксическое дерево;

      — семантический анализатор раскладывает семантическую информацию и проверяет на предмет наличия ошибок узлы дерева;

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

      — генератор промежуточного кода строит граф потока (кортежи группируются в основные блоки);

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

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

      — для распределения памяти между виртуальными регистрами и выполнения планирования команд используется машинозависимый оптимизатор-компоновщик. Он также осуществляет преобразование программы, написанной на ассемблере, в настоящий ассемблер с применением конвейерной обработки.

      — используются подсистемы обнаружения ошибок и менеджер таблиц символов;

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

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

      — отсутствующие в алфавите символы;

      — превышение количества знаков в строке или слове;

      — не закрытый строковый литерал или знак;

      — конец файла в комментарии.

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

      При создании парсера нужно в первую очередь обращать внимание на уровень сложности грамматики (LRили LL) и выяснить, имеются ли какие-то правила снятия неоднозначности. Действительно некоторые языки требуют проведения семантического анализа. Ошибки, которые встречаются на данном этапе, называются синтаксическими.

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

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

      — множественные объявления переменной в пределах области ее действия;

      — ссылки не переменную до объявления;

      — нарушение правил доступности;

      — наличие ссылок на необъявленное имя;

      — чересчур большое или, наоборот, недостаточное число аргументов при вызове метода;

      Генерация

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

      Похожие статьи:

      1. Photon Flash Player for iPad — браузер для iOS
      2. Что такое ReadyBoost?
      3. TuneIn Radio Pro — программа для прослушивания радио
      4. Программа TestDisk: инструкция по восстановлению данных
      5. City Maps 2Go — пеший навигатор для iPhone

      Источник: computerologia.ru

      Рейтинг
      ( Пока оценок нет )
      Загрузка ...
      EFT-Soft.ru