Инструментарий для компиляции на пользовательский машинный язык - PullRequest
0 голосов
/ 05 января 2019

Допустим, я создал интерпретатор (больше похожий на виртуальную машину), способный выполнять набор основных команд. Естественно, я не хочу использовать Hex-Editor для сборки машинного кода (который полностью составлен и не похож на какую-либо другую архитектуру) вручную.

Существуют ли уже существующие инструменты для таких ситуаций? Я думал как использовать какой-то инструмент для компиляции некоторого языка высокого уровня, такого как C, в базовый синтаксис ассемблера, но в то же время ограничиваю компилятор использованием только выбора команд asm (таких как только основные команды mov, alu, push / pop , звонки и прыжок).

Конечно, одним из вариантов является создание совершенно нового компилятора для этого с нуля, но это, очевидно, отстой и похоже на изобретение колеса. Другой вариант - написать скрипт, работающий с сгенерированным asm-кодом, заменив неподдерживаемые команды другими (например, разбивая lea на mov и арифметику), но это будет довольно сложная работа с более сложными командами. Я хотел бы сократить свою собственную работу до написания ассемблера с максимальным значением, предпочтительнее, который получает только выбранный набор команд (поэтому ни одна из этих причудливых сложных команд x86, таких как ascii / bcd арифметика, xchng, строковые команды или даже lea) упростить вещи. Будет ли это даже осуществимым подходом, или есть более простой способ достичь того, чего я хочу? Я уверен, что я не первый, кто делает что-то подобное. В идеале мне нужен компилятор, в котором я могу подробно описать целевую архитектуру и ее возможности.

Кто-нибудь делал что-то подобное раньше? Я даже не знаю, с чего начать, но наверняка должны быть доступны некоторые инструменты, помогающие с этим.

Edit: Чтобы было понятно, я действительно ищу инструменты для создания байт-кода для самоопределяемого ISA. Я упомянул C как язык высокого уровня, но это был только пример. Я просто ищу способ программирования простых фрагментов для пользовательской архитектуры без написания байт-кодов вручную в шестнадцатеричном редакторе, предпочтительно на языке более высокого уровня. Моя идея состояла в том, что если бы я мог минимизировать набор команд, предполагаемый каким-то стандартным компилятором, я мог бы написать какой-нибудь простой скрипт, чтобы просто перевести его в мой машинный код.

Ответы [ 2 ]

0 голосов
/ 06 января 2019

Существует несколько перекомпилируемых (с открытым исходным кодом) компиляторов. Gcc, llvm и многие другие. Вы обнаружите, что GCC едва удерживается вместе с клейкой лентой и проволокой, массивной PITA. llvm рекламирует простоту добавления бэкэнда и документации, но документация настолько устарела, что она вводит в заблуждение и ошибочна и полезна. И бэкэнд msp430, который они использовали, чтобы продемонстрировать, как легко. этот бэкэнд сломан и всегда был и нет желания это исправить ...

Несмотря на то, что это, безусловно, возможно, бэкэнды добавляются время от времени. pdp-11 для gnu и risc-v для gnu и llvm в последние годы. aarch64 и другие. Некоторые люди отключают определенную версию gcc или llvm и работают с ней, так как это одна задача - добавить один бэкэнд в одну версию этих инструментов, если вы хотите использовать его в апстриме, вам нужно будет поддерживать его каждую версию навсегда (или убедить кого-то другого).

vbcc - это еще один, о котором я знаю, есть ряд других, оптимизирующих и нет. Конечно, вы можете пойти своим путем. Вы хотите / нуждаетесь в полноценном совместимом языке, таком как C, или создаете свое собственное подмножество.

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

lcc - учебник, не оптимизирующий ...

К сожалению, ни один из основных компиляторов не предназначен для упрощения работы с инструментом. Вы - инструмент, и вам нужно выполнить всю работу, чтобы запихнуть его туда, покататься на этом медведе и надеяться, что он работает ...

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

0 голосов
/ 05 января 2019

Вы хотите использовать библиотеку 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» в качестве промежуточного представления (в вашем компиляторе) не очень хорошая идея.

...