Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Уменьшение количества проходов

Читайте также:
  1. E. ШТРАФЫ (вычитаются из количества очков в процентах).
  2. А) Сужение (уменьшение) личности
  3. В.6. Оценка количества воды, оставшейся в трубопроводе после достижения ТТР минус 20°C, и времени доосушки.
  4. И количества исполнителей
  5. Интерпретация по октатам в зависимости от количества баллов.
  6. ЛЕЙКОПЕНИЯ – снижение количества лейкоцитов в единице объема крови.
  7. ЛЕЙКОПЕНИЯ – снижение количества лейкоцитов в единице объема крови.

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

Группировка некоторых фаз в одном проходе не представляет проблем. Как упоми­налось выше, с одной стороны, интерфейс между лексическим и синтаксическим анали­зами зачастую ограничивается единственным токеном. С другой стороны, часто очень сложно выполнить генерацию кода до завершения создания промежуточного представ­ления. Например, языки типа PL/I и Algol 68 позволяют использование переменных до их объявления. Невозможно сгенерировать целевой код для языковой конструкции, если не известны типы используемых в ней переменных. Подобная же ситуация возникает и в языках, которые позволяют использовать оператор безусловного перехода вперед по ко­ду (таких языков программирования подавляющее большинство). Определить целевой адрес такого оператора безусловного перехода невозможно без генерации кода для инст­рукций между оператором безусловного перехода и его местом назначения.

Иногда удается оставить необходимое для отсутствующей информации пустое место и заполнить его позже, когда информация станет доступной. В частности, генерация промежуточного и целевого кодов часто может быть объединена в один проход с ис­пользованием технологии "обратных поправок" (backpatching). До тех пор, пока в главе 8, "Генерация промежуточного кода", не будут рассмотрены вопросы, связанные с ге­нерацией промежуточного кода, невозможно пояснить все детали этой технологии. Од­нако мы попытаемся проиллюстрировать технологию обратных поправок на примере ас­семблера. В предыдущем разделе рассматривался двухпроходный ассемблер, когда в первом проходе производился поиск всех идентификаторов, представляющих ячейки памяти, и происходило назначение им адресов, а во втором — идентификаторы заменя­лись адресами.

Можно скомбинировать эти действия следующим образом. При использовании ас­семблерной инструкции со ссылкой вперед

GOTO target

мы генерируем инструкцию с машинным кодом операции GOTOи пустым местом вместо адреса. Все инструкции с пустыми местами вместо адреса target хранятся в списке, связанном с записью для идентификатора target в таблице символов. Эти пустые мес­та заполняются, как только появляется инструкция типа

target: MOV foobar, R1

и определяется значение идентификатора target, которое является адресом текущей инструкции. Затем производим "обратную поправку", проходя по списку, связанному с идентификатором target, и внося реальное значение адреса в пустые поля адресов. Та­кой подход прост в реализации, если инструкции хранятся в памяти до определения всех целевых адресов.

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


Дата добавления: 2015-11-30; просмотров: 32 | Нарушение авторских прав



mybiblioteka.su - 2015-2024 год. (0.007 сек.)