Как создать компилятор C для пользовательского ЦП?

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

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

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

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

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

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

[. , , ]

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

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

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

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

Короткий ответ заключается в том, что это не работает.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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