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

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

Редактировать: я использую Lua + Luabind (C ++)

1 Ответ

57 голосов
/ 20 января 2012

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

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

Вы можете использовать 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.Итак, прочитайте о том, как его использовать .

...