Bienvenidos sean a este post, hoy hablaremos sobre el codigo C en LUA que a diferencia del codigo escrito para este lenguaje el codigo C debe ser enlazado con una aplicacion antes de ser usado, en los sistemas mas populares se utiliza una facilidad de enlace dinamico, sin embargo esta facilidad no es parte de las especificaciones de ANSI C lo cual significa que no existe una solucion portable para implementarla.

Anuncios

Usualmente, Lua no incluye ninguna facilidad que no pueda ser implementada en ANSI C, pero el enlace dinamico es diferente porque podemos verlo como la madre de todas las otras facilidades, una vez logrado podemos cargar dinamicamente cualquier facilidad que no este en Lua, y para este caso en particular Lua rompe sus reglas de portabildiad e implementa una facilidad de enlace dinamico para varias plataformas,

La implementacion estandar ofrece este soporte para Linux, Windows, MAC OS, Free BSD, Solaris y algunas otras implementaciones de UNIX, esto no deberia ser dificil extender esta facilidad a otras plataformas, verifica tu distribucion ejecutando el siguiente comando desde el interprete del lenguaje:

print(package.loadlib("a","b"))

Al ejecutarlo nos devolvera un mensaje, si es parecido al siguiente:

nil     a: cannot open shared object file: No such file or directory    open
Anuncios

Eso significa que poseemos una facilidad de enlace dinamico, en cambio si no tuvieramos la facilidad nos hubiera devuelto un mensaje indicando que la facilidad no es soportado o no esta instalado.

Esto es gracias a que Lua provee todas las funcionalidades del enlace dinamico en la funcion package.loadlib, cuando vimos el comando pasamos dos argumentos, el primero sera el path donde esta la libreria y el segundo sera la funcion que usaremos, a continucacion veremos una tipica llamada de esta funcion:

local path = "/usr/local/lib/lua/5.1/socket.so"
local f = package.loadlib(path, "luaopen_socket")

Esta funcion, loadlib, se encarga de cargar la libreria y enlazar la funcion informada con Lua pero esto no significa que llama a la funcion, en su lugar devuelve a la funcion de C como una funcion de Lua, y en caso de existir un error o no encontrar la libreria la funcion loadlib nos devuelve un nil con un mensaje de error, tal como vimos antes, esta funcion es de baja nivel, se debe proveer el path completo de la libreria y el nombre correcto de la funcion (incluyendo ocasionalmente guiones bajos principales incluidos por el compilador), pero usualmente cargaremos librerias de C por medio de require, la funcion busca por la libreria y luego gracias a loadlib carga una funcion de inicializacion para la libreria, una vez llamado esta funcion de inicializacion registra en Lua las funciones de esta libreria, de la misma forma que los chunks de Lua define a otras funciones.

Anuncios

En resumen, hoy hemos visto como trabaja Lua para cargar un codigo externo del lenguaje, cual es la funcion base encargada, y cual es la que realmente utilizaremos, espero les haya sido util, sigueme en Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00