Есть ли способ, как я могу сказать компилятору / компоновщику C ++ скомпилировать исходный код в мой собственный домашний список кодов операций? Мне это нужно для моей виртуальной машины, которая будет выполняться на микроконтроллере.
Я не хочу создавать компилятор C ++ с нуля, но меняю только коды операций, адреса регистров состояния процессора, указатель стека и регистры GPIO, программную память и память данных из существующего компилятора с открытым исходным кодом, чтобы люди, создающие программы для ему не нужно переписывать весь код, а просто перенести его с использованием библиотек, совместимых с библиотеками моего собственного компилятора.
Примером является компилятор avr-gcc.
Компилятор и его библиотеки не должны быть проприетарными в том смысле, что я или любой программист должны платить за него, и я не хочу, чтобы это был либо GPL, чтобы программист должен был раскрыть источник своих собственных проектов. Я хочу, чтобы все мои программисты свободно использовали мой компилятор, могли свободно лицензировать свою работу любым удобным для них способом, а также сделать ее открытой или частной.
Давайте рассмотрим шаги:
Ретаргетинг существующего компилятора C ++: Несколько производительных, перенастраиваемых компиляторов C ++ сегодня доступны бесплатно. Например, платформа LLVM (clang ++) обеспечивает некоторые указатели при написании бэкэнда для новой аппаратной архитектуры (это естественно относится и к виртуальным машинам!). К сожалению, современную документацию по переносу компиляторов GNU найти сложнее. Вполне возможно, что многие из старшая документы остаются актуальными сегодня, но я слишком мало знаю о GCC, чтобы сказать.
Обратите внимание, что усилия, необходимые для перенастройки любого компилятора, вероятно, будут зависеть от того, насколько хорошо набор команд вашей виртуальной машины соответствует низкоуровневому компилятору. промежуточное представление. Так как они часто (по крайней мере, семантически) в форме трехадресного кода — то есть инструкции с двумя исходными операндами и одним адресатом — написание генератора кода, скажем, для стековой машины (в которой все операнды неявно адресуются) может оказаться немного сложнее ,
С этого момента у вас действительно есть два варианта. Вы можете придерживаться общепринятого способа компиляции программ на C ++, то есть из исходного кода, в сборку, в объектные файлы, в связанный исполняемый файл или библиотеку. Это включает в себя выполнение шагов, которые я изложил ниже. Но поскольку вы ориентируетесь на виртуальную машину, у нее могут быть требования, которые радикально отличаются от требований современных аппаратных архитектур. В этом случае вы можете избежать существующих программ, таких как binutils, и запустить собственный ассемблер и компоновщик.
Написание или портирование ассемблера: Если выбранный вами компилятор не способен напрямую генерировать машинный код, вам, скорее всего, также потребуется написать ассемблер для вашей виртуальной машины или перенести существующую. Если набор команд вашей виртуальной машины выглядит примерно так же, как и на современной машине, и если вы хотите использовать стандартный конвейер компиляции / компоновки C ++, вы можете посмотреть на портирование binutils, конкретно газ, GNU ассемблер.
Написание или портирование компоновщика: Объектные файлы, созданные вашим ассемблером, сами по себе не являются исполняемыми программами. Адреса должны быть назначены символам и сегментам, а ссылки между объектными файлами должны быть разрешены. Это означает, что компоновщик нуждается в некотором понимании вашего набора команд. В частности, он должен иметь возможность находить и исправлять местоположения в коде и данных, которые обращаются к памяти. Руководство по портированию binutils, которое я связал выше, также уместно; Вы также можете наслаждаться чтением Линкеры и загрузчики.
Как заметил @Mat в разделе комментариев выше, GPL обычно не «заражает» выход программы, лицензированной под ним. Увидеть эта секция. В частности:
Выходные данные выполнения закрытой работы подпадают под действие настоящей Лицензии, только если выходные данные, учитывая их содержание, составляют защищенную работу.
Я не юрист, но я понимаю, что это означает, что будет сделано исключение, скажем, для компиляции компилятора с самим собой — выходные данные будут по-прежнему подчиняться условиям GPL.