Вы хотите использовать библиотеку JIT-компиляции . Их много, по крайней мере в Linux: libgccjit , LLVM , libJIT , GNU lightning , asmjit и т. д. И libgccjit , и LLVM способны на причудливую оптимизацию.
(я впервые понял, что вы хотите создать новый компилятор или интерпретатор JIT bytecode для вашего существующего ПК под x86-64)
В идеале мне нужен компилятор, в котором я могу подробно описать целевую архитектуру и ее возможности.
Вас может заинтересовать iburg (а также некоторые внутренние устройства в GCC и / или Clang / LLVM).
Если вы действительно изобрели новый ISA (возможно, как какой-то низкоуровневый байт-код ), вы можете адаптировать и перенести на него GCC (напишите новый файл описания машины файл и т. д.) Это может занять несколько месяцев работы. Обратитесь за помощью по gcc@gcc.gnu.org
. Прочитайте документацию GCC для внутреннего использования . Помните о ПОДАРОК .
Если вы хотите наивный, не оптимизирующий C-компилятор (или для подмножества C) для вашего нового байт-кода, вы можете черпать вдохновение из tinycc это показывает, что написание наивного C-подобного компилятора с нуля выполнимо довольно легко (и может занять меньше времени, чем погружение во GCC ). Но этот компилятор не будет оптимизировать вообще! См. это .
Вам также следует подумать о компиляции вашего языка в C (и оставить низкоуровневую оптимизацию и генерацию кода для компилятора системы C). Это довольно популярный подход .
Обратите также внимание, что как только вы полностью указали ISA, написание ассемблера для него - простое упражнение (и как только вы получили ассемблер, вам не нужно возиться с битами в шестнадцатеричном формате написать код для вашего ISA).
Вас могут заинтересовать homoiconic или многоступенчатое программирование языки. Посмотрите на Lisp, а именно Common Lisp и его реализацию SBCL , и на MetaOcaml.
ваш вопрос неясен
(даже с новым редактированием)
Вы изобретаете новый байт-код, новый язык программирования, новый ISA?
Вам нужно прочитать SICP и Книга Дракона , чтобы хотя бы получить хорошую терминологию и понятия (поскольку в своем первоначальном виде ваш вопрос неясен и запутан). Вас также должно заинтересовать прагматика Скотта на языке программирования и, вероятно, Квиннека Lisp In Small Pieces .
Моя идея состояла в том, что, если бы я мог минимизировать набор команд, предполагаемый каким-то стандартным компилятором, я мог бы написать какой-нибудь простой скрипт, чтобы просто перевести его в мой машинный код.
Это, вероятно, неверно. Было изобретено несколько компьютеров с одним набором команд, но на практике этот набор из 1 инструкции неэффективен для реализации, поэтому минимизация набора команд до 1 не является хорошей идеей. И использование такого «набора команд ISA» в качестве промежуточного представления (в вашем компиляторе) не очень хорошая идея.