Anuncios

Bienvenidos sean a este post, como mencionamos anteriormente uno de los mayores problemas que debemos enfrentar cuando intentamos intercambiar valores entre Lua y C es el desencuentro entre un sistema de tipo dinamico y un estatico y el desencuentro entre la administracion de memoria manual y automatica.

Anuncios

En Lua cuando escribimos la siguiente expresion:

a[k] = v 
Anuncios

Tanto k como v pueden ser diferentes tipos e inclusive a puede ser un tipo diferente debido a las metatablas pero si queremos ofrecer esta operacion en C cualquier funcion settable debe tener un tipo fijado, necesitariamos docenas de funciones diferentes para esta operacion unica (una funcion para cada combinacion de tipos para las tres argumentos), una forma practica con la que podriamos solucionar este problema declarando algun tipo de union de tipo en C, a esto lo llamamos lua_Value el cual podria representar todos los valores de Lua, luego podemos declarar a settable como:

void lua_settable(lua_Value a, lua_Value k, lua_Value v)
Anuncios

Esta solucion tiene dos inconvenientes, el primero puede ser la dificultad para mapear tal tipo complejo a otro lenguaje, Lua ha sido diseñado para interactuar facilmente no solo con C/C++ sino tambien con Java, Fortran, C# y otros, en el segundo Lua hace la recoleccion de basura: si mantenemos una tabla de Lua en una variable de C, el motor de Lua no tiene manera de saber sobre este uso, y puede asumir (erroneamente) que esta tabla es basura y la recoge, por lo tanto la API de Lua no define algo como un tipo lua_Value, en su lugar usa una pila abstracta para intercambiar valores entre C y Lua, cada ranura en la pila puede contener cualquier valor de Lua, cuando quieras preguntar por un valor de Lua (tal como un valor de variable global), llama a Lua, el cual empuja el valor requerido en la pila, cuando quieres pasar un valor a Lua, primero empujas el valor en la pila y luego llamas a Lua (el cual quitara el valor) pero aun necesitamos una funcion diferente para empujar cada tipo de C en la pila y una funcion diferente para conseguir cada valor de la pila pero evitemos la explosion combinatoria, como la pila esta siendo administrada por Lua, el colector de basura sabe cuales valores de C esta usando.

Anuncios

Casi todas las funciones en la API usan la pila como vimos en nuestro primer ejemplo, luaL_loadbuffer deja su resultado en la pila (ya sea el chunk compilado o un mensaje de error), lua_pcall consigue la funcion para ser llamada de la pila y deja cualquier mensaje de error ocasional tambien, Lua manipula esta pila en un estricta disciplina LIFO (Last In First Out), cuando llamas a Lua solo cambia la parte superior de la pila, tu codigo C tiene mas libertad especialmente porque puede inspeccionar cualquier elemento dentro de la pila e incluso inserta y borra elementos en cualquier posicion arbitraria.

Anuncios

En resumen, hoy hemos visto una introduccion a la pila, hemos hablado para que se usa, que solucion nos puede proveer, y su forma de trabajar en cada extremo, espero les haya sido util sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.

Tengo un Patreon donde podes acceder de manera exclusiva a material para este blog antes de ser publicado, sigue los pasos del link para saber como.

Tambien podes donar

Es para mantenimiento del sitio, gracias!

$1.00