Подтвердить что ты не робот

Скомпилируйте код lua, сохраните байт-код, затем загрузите и выполните его

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

Изменить: Я использую Lua + Luabind (С++)

4b9b3361

Ответ 1

Это очень просто.

Сначала вы загружаете Lua script без его выполнения. Не имеет значения, подключили ли вы состояние Lua к экспортированным функциям; все, что вы делаете, это компиляция файла script.

Вы можете использовать luaL_loadfile, который использует функции библиотеки C-стандарта для чтения файла с диска и загрузки его в lua_State. Кроме того, вы можете загрузить файл самостоятельно в строку и использовать luaL_loadstring, чтобы загрузить его в lua_State.

Обе эти функции будут выдавать возвращаемые значения и ошибки компилятора в соответствии с документацией для lua_load.

Если компиляция прошла успешно, lua_State теперь имеет скомпилированный фрагмент Lua как функцию Lua в верхней части стека. Чтобы получить скомпилированный двоичный файл, вы должны использовать функцию lua_dump. Это довольно сложно, поскольку он использует интерфейс обратного вызова для передачи вам данных. Подробнее см. .

После этого процесса у вас есть скомпилированный код байта Lua. Перетащите это в файл по вашему выбору. Просто запомните: напишите его как двоичный, а не с переводом текста.

Когда наступает время для загрузки байтового кода, все, что вам нужно сделать, это... точно, что вы делали до. Ну, почти. У Lua есть эвристика, чтобы обнаружить, что "строка", которую она задает, является исходной строкой Lua или байтовым кодом. Итак, да, вы можете загрузить байт-код с помощью luaL_loadfile, как и раньше.

Разница в том, что вы не можете использовать luaL_loadstring с байтовым кодом. Эта функция ожидает строку с нулевым завершением, что плохо. Байт-код может содержать встроенные NULL-символы, что бы повредить все. Поэтому, если вы хотите сделать файл IO самостоятельно (потому что вы используете специальную файловую систему или что-то еще), вам нужно напрямую использовать lua_load. Который также использует интерфейс обратного вызова, например lua_dump. Итак, прочитайте, как его использовать.