logo search
Shpory gosy

115. Компиляторы. Назначение компиляторов, их виды. Последовательность процедуры компиляции

Компилятор – программа, которая преобразует в текстовый файл с написанной символикой программы .asm в управляющие коды, которые должны располагаться в сегменте команд памяти. В любой версии языка должен быть поставлен компилятор.

Любой компилятор как программа должен выполнять три обязательные процедуры:

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

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

  3. Генерация машинных кодов.

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

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

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

Вторая часть – синтаксический анализ – проверка на правильность компоновки лексем: какой код лексем следует за каким, все ли записи, лексемы, строки имеются и правильно ли они поставлены.

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

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

Результат соответствия новая таблица с кодами операций – код + данные или адрес. Т.о. в компиляторе нужны заготовки двух таблиц, т.е. лексемами и с кодами команд и программа следования – какие лексемы после которых может быть результат работы компилятора – использует файл, который имеет расширение .obj.

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

Особенность компиляции в том, что 2 процедуры преобразования в машинные коды и счет выполняется с остановом последовательно. При этом время на компиляцию и на использование, конечно, возрастает, но в случае отладки программы вынуждены многократно повторять первую часть до .obj и только после его получения запустить на счет. Второй вариант: преобразовать в коды небольшой фрагмент исходного текста и его выполнить. Применен в интерпретаторах. Здесь коды переводятся не в весь текст, а часть исполняется программой последовательно перевод использование. Такой подход позволяет работать с малой памятью для кодов. Всякий раз, загружая ее новым фрагментом. Время на решение задачи по такому подходу больше, поскольку идет переключение с одного режима по фрагменту. Интерпретаторы были популярны тогда, когда памяти не хватало.

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

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