Подтвердить что ты не робот

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

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

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

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

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

4b9b3361

Ответ 1

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

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

[., ]

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

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

Ответ 2

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

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

Ответ 3

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

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

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

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

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

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

Ответ 4

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

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

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

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

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

Ответ 5

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

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

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

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

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

Ответ 6

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