Пишу, компилятор и виртуальную машину. Попробовал написать интерпретатор AST, всё работает, красиво, но медленно.
С преобразованием AST в байт код тоже всё понятно .
Теперь вопрос организации виртуальной машины. Смотрел много разных исходников vm, у всех свой подход.
Выделил 2 варианта.
Как в java:
Есть Frame, внутри отдельно храниться стек, область для локальных переменных (очень удобно)
Этот вариант я описал для себя как простой.
Как в других:
Один стек, с указателями, calling convention.
Этот вариант я описал для себя как сложный.
Для начала думаю сделать самый сложный вариант.
В сложном варианте локальные переменные я кладу в начале стека.
Тут вопрос как мне получать доступ к другой области
int foo = 5;
int bar = 10;
{
int bar = 20;
foo += bar
}
// foo == 25
И какой calling convention лучше всего выбрать чтоб в дальнейшем можно было vm байт-код транслировать в машинный код ?
Тебе на самом деле для этого кода стек не нужен. Если операция области видимости
объявляет новые переменные - то просто создавай новые переменные и все будет работать.
syxme, могу предложить развить вашу задачу в более интересный таск, так сказать "задача со звездочкой" -
обфускация на основе виртуальной машины, или в простонародье "виртуализация".
Базовое представление о том, что это такое (первая попавшаяся статья) - https://xakep.ru/2019/02/20/virtual-obfuscation/
Сфера невероятно узкоспециализированная, но интересная, а людей с хорошей квалификацией в ней во всем мире, наверное, можно пересчитать по пальцам одной руки.
syxme, инструменты защиты при каждом создании билда защищенного приложения генерируют уникальную виртуальную машину. То есть можно несколько раз подряд защитить одно и то же приложение и каждый из билдов будет иметь разные коды для одних и тех же инструкций и т.д.
И это лишь одна из фич, которых очень много в таких инструментах
Inviz Custos, Пробовал задавать вопросы по генерации Forth (Форт) кода на решение каких то алгоритмических задач (подобных представленных на rosettacode.org) на сайте https://phind.com
и получал не очень приемлемые результаты сгенерированного кода (чаще не рабочие и при проверке на Online Forth исполнении их), но в плане разнообразия их очень даже интересные. :)
Интересно, а у chatGPT лучше с этим?
P.S. Кстати Форт (виртуальные машины) реализуют на разных языках программирования.
И стековые языки, зачастую, относятся к языкам конкатенативной группе языков. Concatenative language wiki!