Вы сильно ошибаетесь, что двумя основными задачами компилятора являются «запись парсера» и «запись вывода на ассемблер».Самое интересное происходит в середине: этапы проверки (проверка типов), этапы анализа (сбор различной информации для дальнейшей оптимизации) и этапы преобразования (с языка высокого уровня на язык менее высокого уровня), пока после некоторого этапа вы не закончите с чем-товыглядит как сборка).
Даже если вы разрабатываете простой компилятор (вам не нужно конкурировать с GCC в первый раз), парсеры не должны быть «главной задачей».Фактически, парсеры в настоящее время считаются довольно обычной проблемой, по крайней мере, если ваш синтаксис довольно условен (я не говорю о сумасшедших вещах, связанных с расширением синтаксиса);Есть генераторы парсеров, которые работают относительно хорошо, и вы также можете использовать парсеры ручной работы для большей гибкости, но в целом это определенно не должно быть проблемой.
Совершенно разумно написать вывод компилятораС или любой другой язык.Многие различные компиляторы (например, Haskell и различные Scheme) использовали C в качестве целевого языка.Но обычно (для интересных языков в любом случае) впереди много работы, чтобы скомпилировать абстракции языка программирования в нечто более низкоуровневое, которое можно перевести на C.
В наши дниЕсть и другие способы абстрагироваться от низкоуровневой сборки: вы можете использовать виртуальную машину (JVM, CLR, виртуальную машину Эрланга, Parrot ...) или создать байт-код LLVM и т. д.
Выупомянул ML в вашем вопросе.Статически типизированные функциональные языки, использующие алгебраические типы данных (то есть SML, OCaml, Haskell и т. Д.), Являются очень хорошими языками для написания компилятора;я бы сказал, что самые подходящиеВозможно, вас заинтересует книга Реализация современного компилятора в ML (есть варианты для C и Java, но книга ML - лучшая).В некоторых местах он немного специализирован, но, вероятно, это хороший выбор, чтобы иметь хорошее общее представление о методах компиляции.Конечно, если вы хотите стать гуру компиляции, вы должны также использовать другие ссылки, такие как Книга Дракона, и, возможно, ссылки для компиляции языков, похожих на ваш (я имею в виду, что компиляция чисто функционального языка может сильно отличаться от компиляции императивного процедурного языка).