281
•
Философия KISS - никогда не делай сложные вещи без причины.
•
Ленивое кодирование - Никогда не откладывай на завтра то, что можешь
отложить навсегда. (П. Дж. Плоджер).
•
Скептицизм - упрамо отказывайтесь делать что-либо только потому, что это
всегда делалось таким способом.
•
Принятие неэффективного кода.
•
Отклонение произвольных ограничений.
Когда я сделал обзор истории конструирования компиляторов, я узнал, что практически
каждый промышленный компилятор в истории страдал из-за предналоженных условий,
которые сильно влияли на его дизайн. Первоначальный компилятор Fortran Джона Бэкуса
должен был конкурировать с ассемблером и следовательно был вынужден производить
чрезвычайно эффективный код. Компиляторы IBM для мини ЭВМ 70-х должны были
выполняться в очень небольших объемах ОЗУ тогда доступных - таких небольших как 4k.
Ранние компиляторы Ada должны были компилировать себя. Бринч Хансен решил, что
его компилятор Паскаля, разработанный для IBM PC должен выполняться на 64k
машинах. Компиляторы, разработанные на курсах Computer Science должны были
компилировать широкий диапазон языков и следовательно требовали LALR
синтаксических анализаторов.
В каждом из этих случаев эти предвзятые ограничения буквально доминировали над
проектом компилятора.
Хороший пример - компилятор Бринч Хансена, описанный в его превосходной книге
"Brinch Hansen on Pascal Compilers" (строго рекомендую). Хотя его компилятор один из
самых ясных и незатемненных реализаций компилятора, что я видел , одно решение,
компилировать большие файлы в небольшом ОЗУ, полностью управляло дизайном и он
закончил не на одном а многих промежуточных файлах, как и управляющими ими
программах для их записи и считывания.
Временами, архитектуры, возникающие из таких решений, находили свое место в
учениях компьютерной науки и принимались на веру. По мнению одного человека,
пришло время чтобы они были критически пересмотрены. Условия, требования, среды,
которые вели к классическим архитектурам не такие же, какие мы имеем сейчас. Нет
никакой причины полагать, что решения тоже должны быть те же самыми.
В этой обучающей серии мы следовали по шагам таких пионеров в мире маленьких
компиляторов для PC как Леор Золман, Рон Каин и Джеймс Хендрих, тех кто не знал
достаточно теорию компиляции чтобы знать, что они "не могли делать это таким
способом". Мы решительно отказались принимать произвольные ограничения, а скорее
делали так, как было проще В результате мы развили архитектуру, которая, хотя и
совершенно отлична от классической, делает работу простым и прямым способом.
Я закончу эти философствования обзором понятия промежуточного языка. Хотя я
отметил перед этим, что мы не имеем его в нашем компиляторе, это не совсем точно; у
нас он есть, или по крайней мере мы развиваем его, в том смысле, что мы определяем
функции генерации кода для вызова из парсера. В сущности, каждый вызов процедуры
генерации кода можно рассматривать как инструкцию на промежуточном языке. Если мы
когда либо найдем необходимым формализировать промежуточный язык, вот способ,
которым бы мы сделали это: выдать кода из синтаксического анализатора,
представляющие собой вызовы процедур генератора кода, а затем обработать каждый
код вызывая эти процедуры в отдельном проходе, реализованном в "back end".