Это мое мнение (и гипотеза), что будет сложно написать компилятор, не понимая структуры данных, обычно покрываемые в бакалавриате (послесреднем) по информатике. Это не значит, что вы не можете, но вам нужно знать основные структуры данных, такие как связанные списки и деревья.
Вместо того, чтобы писать полный или совместимый со стандартами компилятор языка C (по крайней мере, в начале), я бы предложил ограничиться базовым подмножеством языка, таким как общие операторы, поддержка только целых чисел, а также базовые функции и указатели. Одним из классических примеров этого была книга Рона Каина Small-C , ставшая популярной благодаря серии статей, написанных в Dr. Журнал Доббса в, я полагаю, 1980-х годов. Они публикуют CD с книгой Джеймса Хендрикса, вышедшей из печати, Компилятор Small-C .
Что я хотел бы предложить, так это следовать учебному пособию Crenshaw, но написать его для компилятора языка, подобного C, и для любого целевого процессора (Crenshaw предназначается для процессора Motorola 68000), на который вы хотите ориентироваться. Чтобы сделать это, вам нужно знать базовую сборку, для которой вы хотите запускать скомпилированные программы. Это может включать в себя эмулятор для 68000 или MIPS, которые, вероятно, являются более хорошими наборами инструкций по сборке, чем почтенный набор инструкций CISC Intel x86 (16/32-битный).
Существует множество потенциальных книг, которые можно использовать в качестве отправных точек для изучения теории компилятора / переводчика (и практики). Прочтите часто задаваемые вопросы comp.compilers и обзоры у различных онлайн-продавцов книг. Большинство вводных книг написаны как учебники для студентов старших курсов старших классов по информатике, поэтому они могут быть медленными при чтении без знания CS. Одна старая книга, которая может быть более вводной, но легче читаемой, чем " Книга Дракона " - Введение в конструкцию компилятора Томаса Парсонс. Он старше, поэтому вы сможете найти подержанную копию у выбранного вами интернет-продавца книг по разумной цене.
Итак, я бы сказал, попробуйте начать с учебника Джека Креншоу Давайте создадим компилятор , напишите свой собственный, следуя его примерам в качестве руководства, и постройте основы простого компилятор. Как только у вас это сработает, вы можете лучше решить, где вы хотите взять его с этого момента.
Добавлено:
В отношении процесса начальной загрузки. Поскольку существуют свободно доступные компиляторы C, вам не нужно беспокоиться о начальной загрузке. Напишите свой компилятор с отдельными существующими инструментами (GCC, Visual C ++ Express, Mingw / djgpp, tcc), и вы можете беспокоиться о самостоятельной компиляции вашего проекта на более поздней стадии. Я был удивлен этой частью вопроса, пока не понял, что вы пришли к идее написания своего собственного компилятора, прочитав награду Кена Томаса ACM Turing, Reflections on Trusting Trust , которая действительно входит в компилятор процесс начальной загрузки. Это модерируемая продвинутая тема, а также просто много хлопот. Я нахожу даже самозагрузку компилятора C GCC в старых системах Unix (Digital OSF / 1 на 64-битной Alpha), в которых компилятор C был медленным и трудоемким, подверженным ошибкам процессом.
Другой вопрос был о том, что на самом деле делает инструмент компилятора, такой как Yacc. Yacc (еще один компилятор компилятора или Bison от GNU) - это инструмент, предназначенный для облегчения написания парсера компилятора (или переводчика). Основываясь на формальной грамматике для целевого языка, который вы вводите в yacc, он генерирует синтаксический анализатор , который является одной из частей общего дизайна компилятора. Далее идет Lex (или flex из GNU), который используется для генерации лексического анализатора или сканера, который часто используется в сочетании с синтаксическим анализатором, сгенерированным yacc, для формирования каркаса внешнего интерфейса компилятора. Эти инструменты делают писателя фронтэндом, возможно, проще, чем написание лексического анализатора и анализатора самостоятельно. В учебнике Crenshaw эти инструменты не используются, и вам это не нужно, многие авторы компиляторов не всегда их используют. Конечно, Креншоу признает, что парсер учебника довольно прост.
В учебнике Crenshaw также пропускается генерация AST (абстрактного синтаксического дерева), что упрощает, но также ограничивает компилятор учебника. В нем отсутствует большинство, если не вся оптимизация, и он очень привязан к конкретному языку программирования и конкретному языку ассемблера, испускаемому «бэкэндом» компилятора. Обычно AST - это промежуточный элемент, где можно выполнить некоторую оптимизацию, и он служит для разъединения внешнего интерфейса и внутреннего интерфейса компилятора. Для начинающих без знания компьютерных наук я бы посоветовал не беспокоиться об отсутствии AST для вашего первого компилятора (или, по крайней мере, его первой версии). Я думаю, что его компактность и простота помогут вам закончить написание компилятора в его первой версии, и тогда вы сможете решить, как поступить.