- •Часть 1
- •Лекция №1 Предисловие п.1. Место системного программного обеспечения в компьютерной системе
- •П.2. Структура спо
- •П.3. Хакеры как движущая сила развития спо
- •Лекция №2
- •1. Формальные языки и грамматики в системе программирования
- •1.1. Структура систем программирования
- •1.2. Языки и цепочки символов. Способы задания языков
- •1.2.1. Общие представления о языках
- •1.2.2. Цепочки символов. Операции над цепочками символов
- •1.2.3. Формальное определение языка
- •1.2.4. Способы задания языков
- •Лекция №3
- •1.3. Грамматики и распознаватели
- •1.3.1. Порождающая грамматика
- •1.3.2. Запись правил грамматики с использованием метасимволов
- •Лекция №4
- •1.3.3. Распознаватели
- •1.3.4. Классификация распознавателей
- •1.3.4.1. Классификация распознавателей по компонентам
- •1.3.4.2. Классификация распознавателей по типу языков
- •Лекция №4
- •Лекция №5
- •1.3.5. Примеры классификации языков и грамматик
- •Лекция № 6
- •1.4. Технология формирования предложений языка
- •1.4.1. Выводимость цепочек
- •1.4.2. Сентенциальная форма грамматики
- •1.4.3. Левосторонний и правосторонний выводы
- •1.4.4. Дерево вывода и методы его построения
- •1.4.5. Проблема однозначности грамматик
- •2.1.2. Формальное определение компилятора
- •2.1.3. Интерпретаторы
- •2.2. Общая схема работы компилятора
- •2.3. Варианты построения компиляторов
- •2.3.1. Общие подходы в построении компиляторов
- •2.3.2. Понятие прохода
- •2.3.3. Однопроходные и многопроходные компиляторы
- •2.4. Особенности построения интерпретаторов и их взаимодействие с компиляторами
- •3.1.2. Принципы построения сканеров
- •Лекция 9
- •3.1.3. Сканер как конечный автомат
- •Лекция 10
- •3.2. Взаимодействие сканера с таблицей идентификаторов
- •3.2.1.Назначение и особенности построения таблиц идентификаторов
- •3.2.2. Простейшие методы построения таблиц идентификаторов
- •3.2.3. Построение таблиц идентификаторов по методу бинарного дерева
- •Список литературы
2.1.2. Формальное определение компилятора
Компилятор (К) – это транслятор, который осуществляет перевод исходной программы на языке высокого уровня в эквивалентную ей результирующую программу на языке машинных команд.
Таким образом, компилятор от транслятора отличается тем, что его результирующая программа всегда должна быть написана на языке машинных команд. То есть всякий компилятор – это транслятор, но не наоборот.
Результирующая программа компилятора называется объектной программой или объектным кодом, или объектным модулем, а файл, содержащий объектный код – объектным файлом. При этом надо иметь в виду, что объектный код (объектный модуль) никакого отношения к «объекту» с точки зрения объектно-ориентированного программирования не имеет. Это совершенно различные по смыслу термины, хотя при компиляции программ, написанных на объектно-ориентированных языках, тоже получится объектный файл.
Само слово «компилятор» означает «составитель», «компоновщик». (Про некоторых ученых говорят «он представил скомпилированную работу». Хорошо это или плохо не нам судить).
Термин обязан своему происхождению возможностью составлять с помощью компилятора объектную программу из фрагментов машинных кодов, соответствующих синтаксическим конструкциям исходной программы. Поскольку компиляторы первоначально ничего другого делать не могли, то этот термин закрепился за ними и остался, несмотря на их развитие.
Однако, даже в том случае, когда результирующая программа порождается на языке машинных команд между объектным файлом и исполняемой программой (исполняемым файлом) есть существенная разница. Порожденная компьютером программа не может непосредственно выполняться на компьютере. Это связано с тем, что исходная программа в общем случае состоит из многих модулей. Поскольку компилятор обрабатывает только один конкретный модуль, он не может должным образом обработать те части этого модуля, в которых запрограммированы обращения к данным или процедурам, определенным в другом модуле. Такие обращения называются внешними ссылками. Те места в объектном модуле, где содержатся внешние ссылки, транслируются в некоторую промежуточную форму, подлежащую дальнейшей обработке. Говорят, что объектный модуль представляет собой программу на машинном языке с неразрешенными внешними ссылками. Разрешение внешних ссылок обеспечивается Редактором Связей. Результатом работы Редактора Связей является загрузочный (исполняемый) модуль – программный модуль, представленный в форме, пригодной для загрузки в оперативную память для выполнения.
Результирующая программа, созданная компьютером, строится на языках, которые обязательно ориентированы на определенную вычислительную систему, т. е. имеется машинная зависимость компиляторов.
Вычислительная система, на которой выполняется объектная программа, созданная компилятором, называется целевой вычислительной системой (ЦВС). В понятие ЦВС входит не только архитектура аппаратных средств компьютера, но и операционная система, а зачастую и набор динамически подключаемых библиотек, которые необходимы для выполнения объектной программы.
ЦВС не всегда является той же, на которой работает сам компилятор. Часто они совпадают, но бывает, что компилятор работает под управлением вычислительной системы одного типа, а формирует объектные программы для ЦВС другого типа.
Как создаются компиляторы? С помощью компиляторов предыдущих версий, т. е. новый компилятор является обычно результирующей программой для старого компилятора, которая ничем не отличается от всех прочих порождаемых результирующих программ.
Вопрос слушателям. Как можно назвать программу, с помощью которой исходную программу на одном ЯВУ можно преобразовать в результирующую программу на другом ЯВУ?