tabla quién que maquina interprete extension ejemplos eficiente cursos codigo caracteristicas c++ compilation lua store bytecode

c++ - quién - Compila el código lua, almacena el bytecode y luego cárgalo y ejecútalo



tabla de codigo bytecode (1)

Estoy intentando compilar un script lua que llame a algunas funciones exportadas, guarde el bytecode resultante en un archivo y luego cargue este bytecode y ejecútelo, pero no he encontrado ningún ejemplo sobre cómo hacerlo. ¿Hay algún ejemplo disponible sobre cómo hacer esto? ¿Cómo puedo hacer esto?

Editar: estoy usando Lua + Luabind (C ++)


Esto es todo muy simple.

Primero, carga el script Lua sin ejecutarlo. No importa si ha conectado el estado Lua con sus funciones exportadas; todo lo que estás haciendo es compilar el archivo de script.

Puede usar luaL_loadfile , que usa funciones de biblioteca estándar C para leer un archivo del disco y cargarlo en lua_State . Alternativamente, puede cargar el archivo usted mismo en una cadena y usar luaL_loadstring para cargarlo en lua_State .

Ambas funciones emitirán valores de retorno y errores del compilador según la documentación de lua_load .

Si la compilación fue exitosa, lua_State ahora tiene el fragmento Lua compilado como una función Lua en la parte superior de la pila. Para obtener el binario compilado, debe usar la función lua_dump . Es bastante complicado ya que utiliza una interfaz de devolución de llamada para pasar sus datos. Ver la documentación para más detalles .

Después de ese proceso, tiene el código compilado de bytes de Lua. Ponlo en un archivo de tu elección. Solo recuerda: escríbelo como binario , no como traducción de texto.

Cuando llega el momento de cargar el código de bytes, todo lo que tiene que hacer es ... exactamente lo que hizo antes . Bueno, casi. Lua tiene heurística para detectar que una "cadena" que se le da es una cadena fuente Lua o un código de bytes. Entonces, sí, puedes cargar el código de bytes con luaL_loadfile como antes.

La diferencia es que no puede usar luaL_loadstring con código de bytes. Esa función espera una cadena terminada en NULL, que es mala. El código de bytes puede tener incrustados caracteres NULL en él, lo que arruinaría todo. Entonces, si quiere hacer el archivo IO usted mismo (porque está usando un sistema de archivos especial o algo así), debe usar lua_load directamente. Que también usa una interfaz de devolución de llamada como lua_dump . Así que lee sobre cómo usarlo .