2012-05-16 4 views
28

Я создал свой собственный (очень простой) язык байтового кода и виртуальную машину для его выполнения. Он отлично работает, но теперь я хотел бы использовать gcc (или любой другой свободно доступный компилятор) для генерации байтового кода для этого аппарата из обычной программы c. Итак, вопрос в том, как мне изменить или расширить gcc, чтобы он мог выводить мой собственный байтовый код? Обратите внимание, что я НЕ хочу компилировать мой байтовый код в машинный код, я хочу «скомпилировать» c-код для (моего собственного) байтового кода.Как написать собственный код генератора для gcc?

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

+19

Посмотрите на LLVM. GCC, как известно, трудно продлить. – Mat

+1

это руководство может помочь вам: http://www.drdobbs.com/retargeting-the-gnu-c-compiler/184401529 «Внутренний взгляд на то, как развернуть компилятор GNU C на вашу платформу по выбору». хорошо читал, хотя я еще не пытался следовать за ним. –

ответ

9

Это тяжелый труд.

Например, я также создаю свою собственную «архитектуру» с моим собственным байтовым кодом и хотел сгенерировать код C/C++ с GCC для него. Это так, как я это делаю:

  1. Сначала вы должны прочитать все о портировании в manual GCC.
  2. Также не забудьте также прочитать GCC Internals.
  3. Читайте много о компиляторах.
  4. Также посмотрите на это question и ответы здесь.
  5. Google для получения дополнительной информации.
  6. Спросите себя, действительно ли вы готовы.
  7. Убедитесь, что у вас очень хорошая машина для кафе ... вам понадобится.
  8. Начать добавлять файлы зависимостей машины в gcc.
  9. Компиляция gcc в режиме перекрестного вызова цели.
  10. Проверьте результаты кода в Hex-Editor.
  11. Сделайте больше тестов.
  12. Теперь весело провести время с вашей собственной архитектуры: D

Когда вы закончите вы можете использовать C или C++ только без библиотек ОС-dependet (у вас в настоящее время не работает ОС на вашей архитектуре), и вы должны сейчас (если вам это нужно) скомпилируйте многие другие библиотеки с вашим кросс-компилятором, чтобы иметь хорошую структуру.

PS: LLVM (Clang) проще переносить ... возможно, вы хотите начать там?

+0

Очень практичный совет здесь :) Спасибо! Gcc кажется страшным зверем. Я обязательно посмотрю на LLVM. Этот проект кажется больше, чем я изначально думал, но я дам ему выстрел ... –

+1

Сделай это :) Нет неправильного способа сделать что-то вроде этого ... – pearcoding

+0

@pearcoding На каком основании вы утверждаете, что LLVM проще для порта, чем gcc? Вы пытались скрыть оба и пришли к такому выводу, или вы использовали чужое заключение? Если последний, обратитесь пожалуйста. Благодарю. – Bregalad

2

Это не так сложно, как и все, что. Если ваша целевая машина достаточно похожа на другую, возьмите ее RTL (?) Определения как отправную точку и измените их, затем make compile test через стадии начальной загрузки; промыть и повторить до тех пор, пока он не будет работать. Вам, вероятно, не нужно писать какой-либо фактический код, просто шаблоны определения машины.

15

Я занят переносом gcc на 8-битный процессор, который мы разрабатываем ранее. Я считаю себя сложной задачей для нашей машины, потому что она 8-битная, и у нас есть только один накопитель, но если у вас есть больше ресурсов, это может стать легко. Вот как мы пытаемся управлять им с помощью gcc 4.9 и с использованием Cygwin:

  1. Скачать GCC 4.9 Источник
  2. Добавить имя архитектуры в config.sub вокруг линии 250 посмотреть на # Decode aliases for certain CPU-COMPANY combinations. В этом списке добавить | my_processor \
  3. В этом же внешний вид файла для # Recognize the basic CPU types with company name. добавить себя в список : | my_processor-* \
  4. Поиск файла gcc/config.gcc, в файле ищет случая $ {целевой} оно вокруг линии 880, добавить себя следующим образом:

    ;; 
    my_processor*-*-*) 
        c_target_objs="my_processor-c.o" 
        cxx_target_objs="my_processor-c.o" 
        target_has_targetm_common=no 
        tmake_file="${tmake_file} my_processor/t-my_processor" 
        ;; 
    
  5. Создайте папку gcc-4.9.0\gcc\config\my_processor
  6. Копирование файлов из существующего проекта и просто изменить его, или создать свой собственный с нуля. В нашем проекте мы скопировали все файлы из проекта MSP430 и редактировать его все
  7. Вы должны иметь следующие файлы (не все файлы являются обязательными):
    • my_processor.c
    • my_processor.h
    • my_processor.md
    • my_processor.opt
    • my_processor-c.c
    • my_processor.def
    • my_processor-protos.h
    • constraints.md
    • predicates.md
    • README.txt
    • t-my_processor
  8. создать путь gcc-4.9.0/build/object
  9. запустить ../../configure --target=my_processor --prefix=path for my compiler --enable-languages="c"
  10. сделать
  11. make install
  12. Проведите много исследований и отладки.
  13. Удачи.
+2

Этот ответ заслуживает большего внимания. Просто из любопытства, по какой архитектуре вы пытались порт gcc? Насколько хорошо вы добились успеха? Вы также порт binutils, или вместо этого вы использовали внешний ассемблер?Как вы можете проверить полное правильное поведение испускаемого кода? Благодарю. – Bregalad

+0

@Bregalad мы перекрещиваемся от Linux к нашей собственной архитектуре, очень простой набор инструкций, который мы разработали. Таким образом, компилятор жил на каком-то Linux-сервере. Мы изобилуем проектом, но многому научились. Если я это сделаю, я потрачу больше времени на изучение внутренних компонентов gcc. Мы не переносили binutils вообще, а строили собственный ассемблер. Наше направление было достаточно простым, чтобы пройти этот маршрут. Я уверен, что существуют лучшие методы тестирования испускаемого кода, но мы только оценили сгенерированный код сборки вручную. – Tanyong

Смежные вопросы