106
ЗДЕСЬ НЕТ НИЧЕГО СЛОЖНОГО!
Затем я думал, что причина в том, что мы не генерировали очень хороший объектный
код. Те из вас, кто следовали этой серии и пытались компилировать примеры, знают, что
хотя код работает и достаточно отказоустойчив, его эффективность довольно ужасна. Я
подчеркивал, что если бы мы сконцентрировались на получении компактного кода, то
быстро бы получили всю недостающую сложность.
В какой то степени это так. В частности, мои первые небольшие усилия при попытке
повысить эффективность подняли сложность до опасного уровня. Но с той поры когда я
возился с некоторыми простыми методами оптимизацией и обнаружил некоторые,
которые приводят к очень приличному качеству кода без добавления больших
сложностей.
Наконец я подумал, что возможно причина была в "игрушечной" природе компилятора
Я не претендовал на то, что мы когда-нибудь будем способны построить компилятор,
конкурирующий с Borland и Microsoft. И однако снова, когда я забираюсь глубже в эти
дела различия начинают стираться.
Просто чтобы удостовериться что до вас дошла эта мысль, позвольте мне ее
высказать напрямую:
Используя методы, которые мы здесь применяли, возможно создать работающий,
промышленного качества компилятор не добавляя много сложности к тому, что мы уже
сделали.
С тех пор, как началась эта серия, я получил от вас некоторые комментарии.
Большинство из них повторяют мои собственные мысли: "Это просто! Почему учебники
представляют это настолько сложным?" Хороший вопрос.
Недавно я возвратился и взглянул на некоторые из этих текстов снова и даже купил и
читаю некоторые новые. Каждый раз я возвращался с тем же чувс твом: эти ребята
представляют это слишком сложным.
Что происходит? Почему все это кажется сложным в этих книгах, но легким для нас?
Действительно ли мы умней чем Ахо, Ульман, Бринч Хансен и все остальные?
Едва ли. Но мы делаем некоторые вещи по-другому и все более и более я начинаю
ценить значение нашего подхода и способ, которым он упрощает дело. Кроме очевидных
сокращений, которые я выделил в первой части, типа односимвольных токенов и
консольного ввода/вывода, мы сделали некоторые неявные предположения и сделали
некоторые вещи отличными от того, как разрабатывали компиляторы в прошлом. Как
оказалось, наш метод делает жизнь намного проще.
Но почемы все другие ребята не используют его?
Вы должны вспомнить контекст некоторых ранних разработок компиляторов. Эти
люди работали на очень небольших компьютерах с ограниченными возможностями.
Объемы памяти были очень ограничены, набор команд центрального процессора был
минимален и программы чаще выполнялись в пакетном режиме, чем в интерактивном.
Как оказалось, это повлияло на некоторые ключевые решения проекта, которые
действительно усложнили проект. До недавнего времени я не понимал, насколько
классический дизайн компилятора был обусловлен доступным оборудованием.
Даже в тех случаях, где эти ограничения больше не накладывались, люди
предпочитали структурировать их программы тем же самым образом, так как это способ,
которому они обучались.
В нашем случае мы начали с чистого листа бумаги. Имеется опасность, конечно, что
вы попадетесь в ловушки, которые другие люди давно научились избегать. Но это также
позволило нам использовать различные подходы, которые, частично из-за проекта,
частично из-за чистой удачи, позволили нам добиться простоты.
Имеются области, которые, я думаю, в прошлом приводили к сложности: