Я бы не рекомендовал начинать с C в качестве языка для реализации или с любого из инструментов компилятора-генератора или парсера-генератора. C - очень сложный язык, и, вероятно, лучше всего создать собственный язык. Это может быть немного похоже на C (например, использовать фигурные бэкбэты, если вы хотите указать тело функции, использовать те же имена типов, чтобы вам не приходилось запоминать то, что вы называли все).
Инструменты для создания компиляторов и синтаксических анализаторов великолепны, но проблема заключается в том, чтобы действительно быть сокращенной записью. Если вы не знаете, как создать компилятор от руки, сокращение будет казаться загадочным, излишне ограничительным и т. Д. Итак, сначала напишите свой собственный простой компилятор, а затем продолжайте. Я также рекомендую вам не начинать генерировать фактический машинный код, если вы не будете есть и дышать ассемблером. Создайте свой собственный интерпретатор байт-кода с виртуальной машиной.
Относительно того, какой язык вы должны использовать для создания своего первого компилятора: это не имеет большого значения, если язык достаточно полный. Вы будете читать входной текст, строить из них структуры данных и записывать двоичные данные. Так что, если язык облегчает эти вещи каким-либо образом, это точка в пользу этого. Выберите язык, который вы хорошо знаете, чтобы вы могли сосредоточиться на создании компилятора, а не на изучении языка. Я обычно использую ОО-язык, который облегчает написание синтаксического дерева, функциональный язык, вероятно, также будет работать, если вы знакомы с этим.
Я много писал о языках программирования, поэтому вы можете найти здесь несколько полезных сообщений: http://orangejuiceliberationfront.com/category/language-design/
В частности, http://orangejuiceliberationfront.com/how-to-write-a-compiler/ является отправной точкой для анализа парсинга общих конструкций и генерации чего-то полезного из этого, а также http://orangejuiceliberationfront.com/generating-machine-code-at-runtime/, в котором говорится о том, чтобы фактически выплевывать инструкции Intel, которые что-то делают.
О, что касается начальной загрузки компилятора: вы, вероятно, не сможете сделать это с самого начала. Существует немало работы, связанной с созданием компилятора. Таким образом, для написания загрузочного компилятора нужно не только написать компилятор (на каком-либо другом языке), но, как только он у вас появится, вам придется написать вторую версию компилятора, использующего сам себя. Это вдвое больше работы, плюс отладка, необходимая в существующем и загруженном новом компиляторе, пока все не заработает. Тем не менее, если у вас есть работающий компилятор, это хороший способ проверить его полноту. Хорошо, может быть, не вдвое больше работы, но больше работы. Сначала я бы пошел к легким успехам, а затем пошел дальше.
В любом случае, получайте удовольствие!