- •Программная инженерия
- •1.1Объектно-ориентированная технология разработки программ
- •1.2 Понятие класса
- •1.3 Понятие объекта
- •1.4 Составляющие класса и объекта
- •1.7 Понятие наследования
- •1.8 Структура классов в Delphi
- •1.9 Виды наследования
- •1.4.1 Классификация грамматик по Хомскому
- •1.4.2 Классификация языков
- •2.3 Цепочки вывода (левосторонний, правосторонний)
- •2.4 Проблемы однозначности и эквивалентности грамматик
- •2.7 Построение ка для языка, заданного регулярным выражением.
- •2.9 Определение ll(k)- грамматики и принципы построения распознавателей для этой грамматики.
- •2.12 Понятие прохода
- •2.13 Общие принципы генерации кода
- •2.14 Синтаксически управляемый перевод (су-схемы).
- •Технология разработки программного обеспечения
- •Начало проекта
- •1. Конструкция иерархии данных
- •2. Конструкция последовательности данных
- •3. Конструкция выбора данных
- •4. Конструкция повторения данных
- •Проектирование для потока данных типа «преобразование»
- •Проектирование для потока данных типа «запрос»
- •Базы данных
- •13. Физическая организация баз данных
- •14. Хешированные, индексированные файлы
- •15. Защита баз данных.
- •16.Целостность и сохранность баз данных.
- •Организация эвм и систем
- •Операционные системы
- •2.5.2. Программа типа exe
- •4.3.1. Непосредственная адресация
- •4.3.2. Регистровая адресация
- •4.3.3. Косвенная адресация
- •4.3.4. Прямая адресация (адресация по смещению)
- •4.3.5. Базовая адресация
- •4.3.6. Индексная адресация
- •4.3.7. Базовая-индекснаяадресация
- •5.2.3.1. Сложение и вычитание
- •5.2.3.2. Инкремент и декремент
- •5.2.3.3. Умножение и деление
- •5.2.3.4. Изменение знака числа
- •6.5.3. Запрет определенного маскируемого прерывания
2.12 Понятие прохода
Как уже было сказано, процесс компиляции программ состоит из нескольких фаз. В одном
случае компилятор просматривает текст исходной программы, сразу выполняет все фазы компиляции и получает результат – объектный код. В другом варианте он выполняет над исходным текстом только некоторые из фаз компиляции и получает не конечный результат, а набор некоторых промежуточных данных. Эти данные затем снова подвергаются обработке, причем этот процесс может повторяться несколько раз.
Проход – это процесс последовательного чтения компилятором данных из внешней памяти, их обработки и помещения результата работы во внешнюю память. Чаще всего один проход включает в себя выполнение одной или нескольких фаз компиляции. Результатом промежуточных проходов является внутреннее представление исходной программы, результатом последнего прохода – результирующая объектная программа.
При выполнении каждого прохода компилятору доступна информация, полученная в результате всех предыдущих проходов. Как правило, он стремится использовать в первую очередь только информацию, полученную на проходе, непосредственно предшествовавшем текущему, но в принципе может обращаться и к данным от более ранних проходов вплоть до исходного текста про-
граммы. Информация, получаемая компилятором при выполнении проходов, недоступна пользователю. Она либо хранится в оперативной памяти, которая освобождается компилятором после завершения процесса трансляции, либо оформляется в виде временных файлов на диске, которые также уничтожаются после завершения работы компилятора. Поэтому человек, работающий с компилятором, может даже не знать, сколько проходов выполняет компилятор – он всегда видит только текст исходной программы и результирующую объектную программу. Но количество выполняемых проходов – это важная техническая характеристика компилятора, и фирмы разработчики компиляторов обычно указывают ее в описании своего продукта.
Однако сократить число проходов не всегда удается. Количество необходимых проходов определяется, прежде всего, грамматикой и семантическими правилами исходного языка. Чем сложнее грамматика языка и чем больше вариантов предполагают семантические правила – тем больше проходов будет выполнять компилятор. Например, именно поэтому обычно компиляторы с
языка Pascal работают быстрее, чем компиляторы с языка С – грамматика языка Pascal более проста, а семантические правила более жесткие.
Однопроходные компиляторы – редкость, они возможны только для очень простых языков. Реальные компиляторы выполняют, как правило, от двух до пяти проходов. Таким образом, реальные компиляторы являются многопроходными. Наиболее распространены двух- и трехпроходные компиляторы, например: первый проход – лексический анализ, второй – синтаксический разбор и семантический анализ, третий – генерация и оптимизация кода (варианты
исполнения, конечно, зависят от разработчика). Нередко первый проход компилятора (лексический анализ кода) выполняется параллельно с редактированием кода исходной программы.