Как создать умный генератор промежуточного кода
Допустим я создал собственный язык программирования который транслируется в мой самодельный асм с очень урезанным функционалом
Опишу максимально кратко мой ассемблер:
• Он в текстовом виде сразу и выполняется, и пока байт код не делал (и не нужно, мне удобнее сразу так делать, ну и с байтами не умею работать)
• Инструкции ничем не особенные как и по названию так и по функционалу: mov, add, sub, mul, div, inc, dec, jmp, call, ret, push, pop, nop, lda, hlt, cmp
На счёт lda она создаёт указатель на адрес памяти
Также создал директиву dw которая создаёт строку и кладет её в указанный адрес памяти, ещё dn (число (integer) и dd (double число) (также повторюсь, что бы не парится с этими байтами решил сделать максимально просто)
• вм у меня регистровая (eax, ebx, edx, ecx)
• Для каждой программы выделяется 1 стек
• Для выполнение команд типа вывод в консоль решил использовать системные вызовы
• Для вывода используется не стандартная консоль а кастомная, соответственно имеем класс, который реализует функции для работы с ним, поэтому для удобства создал эти системные вызовы и тд
Ну и программа которая бесконечно пишет hello world будет выглядеть вот так:
;метаинформация
.aarch cvm ; указываем архитектуру
.alloc 1-1 ; выделим адресу "1"
;сам код
lda text 1 ; создадим поинтер
dw *text "Hello world!"
mov ebx *text ; текст который нужно принтить
mov eax 1 ;номер вызова функции print
mov ecx 0 ; id консоли
loop: ; метка
int 0x80 ; номер прерывания
jmp loop
Описание языка:
Он может только создавать переменные (по факту это просто указатели на память), арифметические операции, и print
Вот эта же программа:
def string text = "Hello world!";
while (true) {
print(text);
}
Значит главный вопрос:
Как мне создать достаточно умный компилятор что бы он знал:
• Как пользоваться регистрами, что у них хранится, что является мусором...
• Что при вызове функции print он сделал системный вызов, и взял во внимание что в регистрах может оказаться полезная информация и её нужно сохранить... А где? на стеке? или в памяти? и сколько надо адрес памяти выделить ?
Если что пишу компилятор и вм на java, поэтому если есть возможность для ответа используйте его.