Если вы придумали свою вм со своими регистрами и прочим, то вам предстоит придумать соглашения о вызове функций
Нет регистров пока что)) stack based virtual machine Хочу иметь возможность из кода виртуальной машины вызвать нативную функцию. Необязательно у меня виртуальная машина вызывает такие же виртуализированные функции)
А в чём у вас проблема. Есть список функций. Вы считывание опкод. Интерпретатор смотрит опкод, понимает, какую функцию вызывать
Ну ты просто тогда кодируешь конвенцию вызова нужную и пишешь переходник
Не так. Вот я запушил на стэк виртуальной машины адрес функции. Что это за функция виртуальной машине неизвестно. Это просто адрес. Нет никакого списка функций и прочего. Попадается опкод вызова, берется со стэка верхнее значение и его вызываем.
А можно глупый вопрос. Откуда адрес взялся?
Хорошо. Описанное очень напоминает классическую стековую машину. Смотрите реализацию языка Lua. В книжке Роберта Иерусалимски довольно подробно описано, как она работает
Ну пока что он берется просто из массива. То есть в мэйне формируется массив кода для виртуальной машины. Пока что адреса пишутся ручками на известные функции (тесты), но нужно универсально. Формально может быть потом сделаю что-то типа компилятора. Что туда пихнут никому неизвестно
Не очень понятен юзкейс такого. Задать список таких функций это же задача спецификации вм, и потом интерпретатора байткода? Или тот кто пишет байткод будет это задавать? Я просто рассуждал что есть список интринзик функций вм и всё :) но видимо тут речь про ffi из вм в цпп.
да, это из опкодов в с++. Функции задает, тот кто пишет байт код.
Все равно адреса функций надо где-то собрать. В этом же месте вполне можно собрать сигнатуры, тем более, что байткоду придётся данные паковать надлежащим способом. Следовательно, вводная о том, что никакой информации о функции нет... непонятна
Ну да обычно цпп модуль с расширением декларирует какой то глобальный обьект с метаинформацией о функциях
обычно ты в каком-то виде предоставляешь описание, что вот такая то функция, такие то параметры, и такая то конвенция вызова, и этого достаточно чтобы сгенерить асм код вызова
Обсуждают сегодня