- •Сегменты стека
- •Динамическая память (куча)
- •Объектно ориентированный подход к проектированию системных модулей на основе концепций интерфейсов и реализаций.
- •Родовые данные или данные класса, значение которых относится не к экземпляру, а к типу в целом.
- •Активные объекты
- •Активные объекты с множественными рабочими потоками
- •Посылка синхронных сообщений
- •Выборка сообщений
- •Сообщения, определяемые приложением
- •Локальная память потока
- •Пример полной и упрощенной выборки
- •Трансляторы, компиляторы и интерпретаторы.
- •Общая схема работы транслятора
- •Понятие прохода
- •Генерация кода
- •Многоадресный код с явно именуемым результатом
- •Алгоритм вычисления выражений в полной записи
- •Современные системы программирования
Генерация кода
Каждой лексеме ставится в соответствие ее тип (идентификатор, ключевое слово и т.д.). Однако высокоуровневое представление связей лексемы с иерархическими конструкциями несоответствие структурам машинного кода, который является последовательностью безадресных, одноадресных или двухадресных команд.
A : = B * C + D – B * 10
Хотя синтаксическая запись типовых алгоритмов сильно различается, можно выделить следующие устойчивые блоки.
Модель синтаксически управляемого перевода управляемого перевода внутренне представленная в машинный код, использует типовые шаблоны трансляции каждого из вышеперечисленных структур блоков, а вычисляет выражения транслирования путем обхода дерева операции.
Согласование с одноадресными и двухадресными инструкциями требует дополнительной модели машинно-независимой трансляции деревьев и цепочки инструкций.
Многоадресный код с явно именуемым результатом
Каждая операция представляется в виде четырех составляющих:
операция (операнд 1; операнд 2; результат)
1 2 3 4
1 – код операции;
2, 3 – операнды;
4 – результат.
Такая запись внутреннего представления оптимальна для трех адресной архитектуры. Могут быть записаны команды, требующие меньшего количества информационных единиц. Последовательность тетрад линейна, поэтому от дерева переходят к списку или массиву команд. Для результатов могут использоваться временные переменные.
Последовательность тетрад:
-
*(B, C, T1)
-
+(T1, D, T2)
-
*(B, 10, T3)
-
–(T2, T3, T4)
-
:=(T4, 0, A)
Здесь Т1 – Т4 временные переменные
0 – пропуск операнда
Последовательность тетрад может подвергаться порядка операций для оптимизации машинного кода.
Достоинства:
-
Простота построения.
Недостатки:
-
На современных архитектурах практически нет трехадресных команд;
-
Формальный метод перебора обязан использовать временные переменные и не позволяет задействовать свободные операнды, использованные при вычислении.
Современные машинные команды, как правило, помещают результат на место одного из операндов.
Более близок к машинной архитектуре многоадресный код с неявно выраженным результатом.
операция (операнд 1, операнд 2)
1 2 3
Отличи состоит в том, что один или оба операнда могут быть не значениями, а ссылками или адресами. Поэтому в последовательности триад все они должны быть пронумерованы.
-
*(B, C)
-
+(^1, D)
-
*(B, 10)
-
–(^2, ^3)
-
:=(A, ^4)
^N – ссылка на результат триады с соответствующим номером.
Триады могут быть полезны при ручном кодировании ассемблерных команд.
mov eax, c
mov ecx, d
add eax, -10
imul eax, b
add eax, ecx
mov a, ecx
b * c + d – b * 10 ≡ (c – 10) * b + d
Еще одним с последовательностью записи операций при генерации кода является так называемая польская запись. В отличие от ранее рассмотренных префиксных форм, где операции предшествуют операндам, в постфиксной польской форме операции записываются после операндов. Такая форма ориентирована на стековые архитектуры, где активно используется вершина стека и как аргумент, и как место сохранения результата. Отсюда следует недостаток, т.к. операции со стеком практически не поддаются переупорядочиванию.
