Какова роль C (или ML) в создании компилятора? - PullRequest
0 голосов
/ 22 апреля 2011

Я считаю, что основная задача - проанализировать данные и создать соответствующий ему набор инструкций на языке ассемблера (обе логики). Используют ли эти компиляторы какие-либо другие присущие функции C, кроме этой? Я имею в виду, что я могу написать программу, которая может взять мою программу на языке X и сделать из нее программу, подобную C, а затем скомпилировать ее с помощью gcc - все также происходит в бэкэнде - но разумен ли такой подход? Графическое представление моего вопроса:

Язык X - Компилятор, созданный на C с использованием функций обработки и анализа строк в C для создания ASM - RUn на компьютере Особенности: Использование базового механизма C для генерации ассемблерного кода не более того - в конце концов использует собственную логику сборки.

Язык X - Компилятор, созданный в C, снова перекодирует его в C, как синтаксис - Предоставляет его в GCC, как компилятор - ASM - Машинный код
Особенности : Тупая система, поскольку она использует возможности C в конце

Ответы [ 2 ]

3 голосов
/ 24 апреля 2011

Вы сильно ошибаетесь, что двумя основными задачами компилятора являются «запись парсера» и «запись вывода на ассемблер».Самое интересное происходит в середине: этапы проверки (проверка типов), этапы анализа (сбор различной информации для дальнейшей оптимизации) и этапы преобразования (с языка высокого уровня на язык менее высокого уровня), пока после некоторого этапа вы не закончите с чем-товыглядит как сборка).

Даже если вы разрабатываете простой компилятор (вам не нужно конкурировать с GCC в первый раз), парсеры не должны быть «главной задачей».Фактически, парсеры в настоящее время считаются довольно обычной проблемой, по крайней мере, если ваш синтаксис довольно условен (я не говорю о сумасшедших вещах, связанных с расширением синтаксиса);Есть генераторы парсеров, которые работают относительно хорошо, и вы также можете использовать парсеры ручной работы для большей гибкости, но в целом это определенно не должно быть проблемой.

Совершенно разумно написать вывод компилятораС или любой другой язык.Многие различные компиляторы (например, Haskell и различные Scheme) использовали C в качестве целевого языка.Но обычно (для интересных языков в любом случае) впереди много работы, чтобы скомпилировать абстракции языка программирования в нечто более низкоуровневое, которое можно перевести на C.

В наши дниЕсть и другие способы абстрагироваться от низкоуровневой сборки: вы можете использовать виртуальную машину (JVM, CLR, виртуальную машину Эрланга, Parrot ...) или создать байт-код LLVM и т. д.

Выупомянул ML в вашем вопросе.Статически типизированные функциональные языки, использующие алгебраические типы данных (то есть SML, OCaml, Haskell и т. Д.), Являются очень хорошими языками для написания компилятора;я бы сказал, что самые подходящиеВозможно, вас заинтересует книга Реализация современного компилятора в ML (есть варианты для C и Java, но книга ML - лучшая).В некоторых местах он немного специализирован, но, вероятно, это хороший выбор, чтобы иметь хорошее общее представление о методах компиляции.Конечно, если вы хотите стать гуру компиляции, вы должны также использовать другие ссылки, такие как Книга Дракона, и, возможно, ссылки для компиляции языков, похожих на ваш (я имею в виду, что компиляция чисто функционального языка может сильно отличаться от компиляции императивного процедурного языка).

2 голосов
/ 23 апреля 2011

Каждый компилятор отличается

Авторы компилятора могут (и сделали!) Делать практически все, о чем вы только можете подумать.Старый «переводчик» f2c на самом деле был компилятором на Фортране, который предназначался (т.е. производил вывод в) c.

В этом нет ничего плохого, хотя он может замедлить процесс компиляции (есть лишнийстадия синтаксического анализа, в конце концов).

Еще один момент, для серьезных компиляторов это манипулирование абстрактным синтаксическим деревом для оптимизации вывода, который занимает большую часть кода и большую часть времени.Существует огромная разница между немедленной генерацией кода, выполненной в учебнике Crenshaw , и полнофункциональным компилятором.

...