Говоря о генерации кода для генераторного компилятора, практически все равно независимо от языка, как только вы приступите к нему. Сложности разных языков включают в себя эффективное управление семантикой сред в языке (т. Е. Схема имеет такие вещи, как замыкания и продолжения, тогда как что-то вроде BASIC).
Но как только вы решили, что такие вещи представлены (а некоторые влияют на эффективность с точки зрения макета памяти, доступности и т. Д.), Генерация кода проста.
Различия между, скажем, компилятором Scheme, который компилируется на C, а затем передает его компилятору C (который может скомпилировать его для сборки и передать его ассемблеру) vs генерирует машинные инструкции непосредственно в ОЗУ вашим компилятором.
Различные этапы дают вам возможность добавлять оптимизацию и предлагают разделение проблем.Генерирование кода C может быть проще, чем сборка или, особенно, машинный код, поскольку компилятор C может сделать для вас тяжелый подъем (например, переносимость архитектуры).
Но несколько систем могут использовать C для компиляции кода, который сразу загружается через процесс динамической компоновки и выполняется.
Компиляция на промежуточном языке (ala JVM, CLR) также может упростить, а затем вы используете JIT. Компиляция байт-кодов JVM не особенно сложна, так как это простая машина стека. ОПТИМИЗАЦИЯ этого кода - это другая проблема, но преобразование в машинный код довольно просто. CLR отличается тем, что он захватывает больше семантики скомпилированного кода. CLR больше похожа на промежуточную фазу компиляции, в отличие от JVM, которая является фактическим кодом, предназначенным для выполнения как есть.
В конце концов, это все массивы данных в ОЗУ где-нибудь, независимо от того, являются ли эти данные машинным кодом или кодом виртуальной машины. Независимо от того, находится ли этот массив в ОЗУ надлежащим образом или отображен VM из файла, это еще одна деталь. С виртуальной памятью вам, вероятно, небезразлична система.
Так что это сводится к сосредоточению на генерации кода. После того, как вам это нравится, перенаправление его другим компиляторам, оперативной памяти или файлам является небольшим шагом.
Это правда? Я думал, что материал, сделанный backend, - настоящая работа, которую должен сделать компилятор. Разделение на промежуточный язык является менее трудной проблемой. Если нет, то я вполне доволен, потому что я знаю гораздо больше о последнем. – Cheery
Я не очень квалифицирован, чтобы ответить на это. Я прочитал книгу Норвига, и он делает все, что он выглядит легко. Но это только потому, что он гений. Поскольку вы напрямую решаете проблему, вам нужно искать самого себя. –