2012-07-03 11 views
30

¿Cómo puedo compilar mi Lua secuencias de comandos en un único archivo ejecutable, y al mismo tiempo obtener los beneficios de rendimiento súper rápidas de LuaJIT?¿Cómo compilar los guiones de Lua en un solo ejecutable, mientras se gana el rápido compilador de LuaJIT?

Antecedentes:

  • Mi Lua guiones son para una aplicación web que he creado (por ejemplo, para acoger http://example.com)
  • Mi pila de tecnología actual se Nginx (servidor web), Lua/LuaJIT (lenguaje para recuperar dinámico contenido)
  • tengo alrededor de 50 años .lua archivos que componen mi aplicación web (de Modelos/Vistas/Controllers)
  • FreeBSD 9 del sistema operativo

Para simplificar la implementación, me gustaría compilar todas mis secuencias de comandos .lua que ejecuten mi aplicación web en un único ejecutable.

  1. ¿Es esto posible y cómo?

    Parece que Lua oficial viene con una biblioteca llamada SRLua

  2. ¿Cuáles son los aspectos negativos de la compilación por mi .lua a un único ejecutable (por ejemplo, podría ser peor rendimiento, etc.)?
+0

Es una aplicación web, ¿verdad? ¿Eso no significa que lo ejecutas ... desde tu navegador web? Entonces no es un ejecutable que descargas, ¿verdad? –

+0

Sí, una aplicación web. Sin descarga. Esto es todo del lado del servidor. – nickb

+0

Es para simplificar mi implementación en el servidor para el parcheo, etc. de mi código. Se necesitan más de 50 archivos .lua para ejecutar mi aplicación web hoy. Lo que significa que tengo que alojar más de 50 archivos .lua en mi servidor y asegurarme de tener todos los archivos correctos. Si pudiera (1) consolidarlo en un único archivo compilado, hace que el mantenimiento y las versiones de mi servidor sean MUCHO más fáciles, y (2) si hay beneficios de rendimiento (?) Que también serían excelentes. – nickb

Respuesta

69

Traducir todos los archivos de código fuente de Lua a los ficheros objeto y ponerlos en una biblioteca estática:

for f in *.lua; do 
    luajit -b $f `basename $f .lua`.o 
done 
ar rcus libmyluafiles.a *.o 

A continuación, enlazar la librería libmyluafiles.a en su programa principal usando -Wl,--whole-archive -lmyluafiles -Wl,--no-whole-archive -Wl,-E.

Esta línea fuerza al enlazador a incluir todos los archivos de objeto del archivo y exportar todos los símbolos.

Por ejemplo, un archivo llamado foo.lua ahora se puede cargar con local foo = require("foo") desde dentro de su aplicación.

Los detalles sobre la opción -b se pueden encontrar en Running LuaJIT.

+15

¡Wahoo! Mike Pall de LuaJit respondió esta pregunta :) – nickb

+10

¡muchas gracias por todo su trabajo en LuaJIT! Es realmente increíble lo que has hecho. – nickb

+0

Ese comando basename no funciona en Ubuntu 13.04. Termina sobrescribiendo el archivo lua original con la versión bytecoded – Matt

2

Para una aplicación web que está implementando actualmente como un nido de archivos relacionados .lua, su respuesta más fácil será para condensar en un solo archivo. Esto a menudo se puede hacer para casos simples con luac. Sin embargo, para aplicaciones complejas con una combinación de módulos, quieres algo más inteligente.

Yo personalmente uso la utilidad squish de Mathew Wild para hacer algo similar.

Después de ejecutar squish, tendrá un solo archivo .lua que contiene todo el código fuente de Lua incluido convenientemente. Podrías simplemente implementar ese único archivo.

Si también necesita agrupar cualquier módulo binario, o el intérprete Lua o LuaJIT, entonces puede usar SRLua fácilmente para agruparlo con el intérprete Lua, o técnicas similares para agruparlo con LuaJIT.

+0

Por lo tanto, esto no se está compilando realmente en un solo ejecutable como en mi pregunta original, sino que combina todos mis archivos .lua en un solo archivo .lua. – nickb

+0

Aunque puede recorrer todo el camino hasta un ejecutable, y también puede usar squish para simplificar la colección de dependencias para enlazar con ese ejecutable, también puede detenerse con el único archivo '.lua'. [Mike Pall] (http://stackoverflow.com/a/11318414/68204) ha proporcionado una buena receta para agrupar LuaJIT con archivos '.lua'. – RBerteig

Cuestiones relacionadas