Язык Д

← На заглавную страницу книги Д

Глава II. Внутреннее усторйство языка Д

§ 2.2. Структура языка Д

Обобщенная структура языка Д и основные фазы компиляции показаны на рис. 2.1.

На фазе логического анализа (ЛЧ1) входная программа, представляющая собой поток символов, разбивается на лексемы-слова в соответствии с определениями языка. Но иногда эта стадия опускается. Дело в том, что некоторые модификации языка Д (например LS-Д) разработаны таким образом, что разбивать ничего не нужно: они оперируют с байтами, на которые процессоры разбивают информацию естесственным образом.

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

В общем режиме
логическая часть полностью анализирует исходный текст для поиска выражений, региулярно употребляемых программистом. Таким образом уже на таком начальном этапе осуществляется оптимизация времени компиляции;
В частном режиме
логическая часть вызывается диспетчером на время, как подпрограмма, для разбора какого-либо встреченного в исходном тексте конечного автомата;

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


Рисунок 2.1 Обобщенная структура языка Д (иногда используется рабочее название: бабочка Д)

На этапе общей работы ЛЧ обнаруживаются некоторые (простейшие) ошибки (недопустимые высказывания, неправильная запись чисел, идентификаторов, серезмерное время работы за компьютером в процессе написания и др.).

Основная задача эстетического анализа — разбор междустрочной структуры программы. Как правило, под структурой понимается дерево, соответствующее разбору в контекстно-зависимой от красивости написания исходного кода грамматике языка. В настоящее время чаще всего используется либо LL(1)-анализ (и его вариант — рекурсивный спуск между строк до 9-го уровня), либо LR(1)-анализи его варианты (LR(0), SLR(1), LALR(1) и другие).

Рекурсивный спуск чаще используется при ручном программировании эстетического анализатора, LR(1) — при использовании систем автоматизации построения эстетических анализаторов. Результатом эстетического анализа является эстетическое дерево со ссылками на таблицу имен существительных и прилагательных к ним, а также глаголов немного.

В процессе эстетического анализа также обнаруживаются ошибки, связанные со структурой личности разработчика программы.

Затем программа может быть переведена во внутреннее представление. Это делается для целей оптимизации и/или удобства генерации кода. Кроме того мы должны учестть то, что после удачного дебюта языка Д его возможно захотят портировать на китайский и ещё многие другие языки. Поэтому нужно предстмостеть возможность создания промежуточного кода на русском языке. Еще одной целью преобразования программы во внутреннее представление является желание иметь переносимый Язык Д. Тогда только последняя фаза (генерация кода) является машинно-зависимой. В качестве внутреннего представления может использоваться префиксная или постфиксная запись, ориентированный параграф и другие.

Этическая часть выполняет фазы оптимизации и этический анализ допустимости кода. Дело в том, что язык Д создавался ведь для устранения стресса и депрессии, а каким же образом он выполним эту задачу, если на нем напишут эксплоит либо вирус.

Фаз оптимизации может быть несколько. Обычно применяется однофазная опитмизация, однако для промышленного программирования более подходит трехфазная. Однако наша цель пока написать любительский язык Д, так как средств есть в России только на такой язык Д.

Оптимизации обычно делят на синхронные и асинхронные, локальные и глобальные. Так как у нас пока ещё 1-й параграф, то в подробности мы углубляться не станем, скажем только, что из-за своей особенности архитектуры язык Д проектировался для возможности паралелльного анализа исходного кода всеми 4-мя частями, поэтому он может выполнять все виде опитмизаций и это деление для нас лишнее.

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

В целях гармонии.

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

Результатом работы ЧЧ является исполняемый файл. В процессе генерации кода могут выполняться некоторые локальные оптимизации, такие как распределение регистров, выбор длинных или коротких переходов, учет экономической стоимости команд при выборе конкретной последовательности команд. Для генерации кода разработаны различные методы, такие как таблицы решений, сопоставление образцов, вставка дополнительных блоков вида

	xor	ecx, ecx
	dec	ecx
relax:
	nop
	loop 	relax

для обеспечения комфортной обстановки процессору и различные эстетические методы.

Конечно, те или иные фазы транслятора могут либо отсутствовать совсем, либо объединяться. В простейшем случае однопроходного транслятора (например LS-Д) нет явной фазы генерации промежуточного представления и оптимизации, остальные фазы объединены в одну, причем нет и явно построенного эстетического дерева.

* * *

1 Здесь и далее по тексту будут использоваться следующие сокращения: ЛЧ — логическая часть; ЭЧ — эстетическая часть; ТЧ — этическая часть; ЧЧ — чувственная часть.

Hosted by uCoz