Как создать компилятор C для собственного процессора? - PullRequest
44 голосов
/ 02 января 2012

Какой самый простой способ создать компилятор C для пользовательского процессора, если, конечно, у меня уже есть ассемблер для него?

Поскольку компилятор C генерирует сборку, есть ли способ просто определить стандартные биты и куски кода сборки для различных идиом C, перестроить компилятор и, таким образом, получить кросс-компилятор для целевого оборудования?

Предпочтительно, чтобы сам компилятор был написан на C и собирался как собственный исполняемый файл для Linux или Windows.

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

Ответы [ 6 ]

32 голосов
/ 02 января 2012

Краткий обзор / учебник по написанию бэкэнда LLVM.

В этом документе описываются методы написания бэкэндов для LLVM, которые преобразуют представление LLVM в код машинной сборки или другие языки.

[. , , ]

Чтобы создать статический компилятор (тот, который генерирует текстовую сборку), вам необходимо реализовать следующее:

  • Опишите набор регистров.
  • Опишите набор инструкций.
  • Опишите целевой компьютер.
  • Реализация сборки принтера для архитектуры.
  • Реализация селектора команд для архитектуры.
9 голосов
/ 02 января 2012

Существует концепция кросс-компилятора, т. Е. Та, которая работает на одной архитектуре, но нацелена на другую.Вы можете увидеть, как GCC делает это (например) и добавить новую архитектуру в набор, если это тот компилятор, который вы хотите расширить.

Редактировать: я только что заметил вопрос несколько лет назад о рассылке GCCсписок того, как добавить новую цель, и кто-то указал на this

3 голосов
/ 03 января 2012

Короткий ответ - это не работает таким образом.

Более длинный ответ заключается в том, что для написания компилятора для нового типа процессора требуется некоторое усилие.Однако вам не нужно создавать компилятор с нуля.Большинство компиляторов структурированы в несколько проходов;Вот типичная архитектура (возможны многие варианты):

  1. Синтаксический анализ (лексер и синтаксический анализатор), а также для предварительной обработки C, что приводит к абстрактному синтаксическому дереву.
  2. Проверка типов, приводя к аннотированному абстрактному синтаксическому дереву.
  3. Промежуточная генерация кода, ведущая к независимому от архитектуры промежуточному коду.На этом этапе выполняется некоторая оптимизация.
  4. Генерация машинного кода, ведущая к сборке или непосредственно к машинному коду.На этом этапе выполняется дополнительная оптимизация.

В этом описании только шаг 4 зависит от машины.Таким образом, вы можете взять компилятор, в котором шаг 4 четко отделен, и подключить свой собственный шаг 4. Выполнение этого требует глубокого понимания процессора и некоторого понимания внутренних возможностей компилятора, но вам не нужно беспокоиться о том, что происходит раньше.

Почти все процессоры, которые не очень маленькие, очень редкие или очень старые, имеют бэкэнд (шаг 4) для GCC .Основной документацией для написания бэкэнда GCC является руководство по внутренним компонентам GCC , в частности главы по описаниям машины и описаниям цели .GCC является свободным программным обеспечением, поэтому его использование не требует лицензирования.

2 голосов
/ 18 сентября 2015

vbcc (на www.compilers.de) - хороший и простой перенастраиваемый C-компилятор, написанный на C. Он намного проще, чем GCC / LLVM. Это так просто, что я смог перенастроить компилятор на свой собственный процессор за несколько недель работы без предварительного знания компиляторов.

2 голосов
/ 02 января 2012

1) Краткий ответ:

"Нет. Нет такой вещи, как" среда компилятора ", где вы можете просто добавить воду (подключить свой собственный набор сборок), перемешать, и все готово."

2) Более длинный ответ: это, безусловно, возможно. Но сложно. И, вероятно, дорого.

Если бы вы захотели сделать это сами, я бы начал с изучения Gnu CC. Он уже доступен для большого количества процессоров и платформ.

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

http://www.instructables.com/answers/Custom-C-Compiler-for-homemade-instruction-set/

1 голос
/ 03 января 2012

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

Но если вы хотите, чтобы компилятор был относительно легко перенастроить, вам нужен тот, в котором вы можете явно указать архитектуру машины, а какой-то инструмент генерирует остальную часть компилятора (GCC делает это немного; я не думаю, что Clang / LLVM делает много, но я могу ошибаться здесь).

В литературе много такого, гугл "компилятор-компилятор".

Но для конкретного решения для C вы должны проверить ACE , поставщика компиляторов, который генерирует компиляторы по требованию клиентов. Не бесплатно, но я слышал, что они очень быстро создают очень хорошие компиляторы. Я думаю, что он производит стандартные двоичные файлы (ELF?), Поэтому пропускает этап ассемблера. (У меня нет опыта или отношений с ACE.)

Если вас не волнует качество кода, вы можете написать синтаксически-ориентированный перевод C на ассемблер, используя C AST. Вы можете получить C AST от GCC, Clang, возможно, ANTLR, и от нашего инструментария реинжиниринга программного обеспечения DMS .

...