В данном репозитории представлен исходный код бинарного транслятора программ под архитектуру CPU-emulator в код на LLVM IR.
В данном проекте используется пакет llvm (ver 10.0.0). Стандарт языка - c++14.
После сборки проекта, например, в файл translator вам доступны следующие команды:
- -i <имя файла>
Указывает входной файл, содержащий скомпилированную программу. Данный флаг является обязательным при запуске. - -o <имя файла>
Указывает выходной файл для транслятора. Если данный флаг не указывается, то результат трансляции выподится на экран. - -l <имя файла>
Задает имя файла лога. По умолчанию файл лога "log.log". - -n
Отключает логирование. При возникновении ошибок отладочная информация печатается на экран. - -r
Запуск программы на исполнение после трансляции. - --memorySize=<число байт>
Указывает размер памяти виртуального процессора в байтах. Минимальный размер памяти равен 128 байтам, а максимальный 512 кБ. - --makeItBetter
При выставлении данного флага транслятор производит оптимизацию сгенерированного LLVM IR.
В директории examples располагаются примеры программ и их оттранслированный вариант. Рассмотрим примеры команд, запускающих транслятор в различных режимах:
>translator -i sqr.bin -r --memorySize=1024 --makeItBetter
Транслятор будет работать с файлом sqr.bin, а после трансляции запустит на исполнение с ограничением по памяти процессора в 1024 байта. Оттранслированный код отобразится на экране, но перед этим пройдет этап оптимизации.
>translator -i factorial.bin -o factorial.ll -l my_log.txt
Транслируем программу factorial.bin, результат записывается в factorial.ll. В случае ошибок, логирование происходит в файл my_log.txt.
Для получения скомпилированных программ можно поступить двумя способами:
- Собрать компилятор ассемблера из проекта CPU-emulator
- Собрать компилятор простого языка программирования высокого уровня из проекта Programming language
После того, как вы соберете компилятор ассемблера или ЯП, то сгенерированные бинарники можно будет передавать транслятору.