Vamos a programar #47 - Co-Rutinas en LUA.
Hola de nuevo a todos, el día de hoy vamos a ver un poco sobre el lenguaje de programación LUA.
Antes que nada, debo de aclarar que este no es un tutorial para aprender a programar en Lua, en este post solo explicaré cómo hacer uso de las co-rutinas. Probablemente en el futuro, habrá un ecuatorial completo en las series "Learning machine", pero por ahora y por petición de un amigo mio, veremos cómo es que se hace uso de ellas. Eso no nos impedirá ver lo básico, ¿Que es Lua?; bueno, lua es un lenguaje de programación interpretado; es decir, a diferencia de lenguajes cómo C o C#, este, no es necesario compilarlo para usarlo, una vez escrito el código fuente, se puede pasar al interprete (que será el ejecutable) y este interpretará el código y producirá un resultado, si es necesario cambiar alguna parte del programa, en lugar de volver a compilar el ejecutable, bastará con modificar el código fuente.
En lua, la manera sencilla de crear una co-rutina, es haciendo uso de "coroutine.create()" y en su forma más sencilla, debemos de pasar una función cómo parámetro. para poder interactuar con la función, dentro de esta, debe de haber algo que diga "oye, tengo que decir algo", la función "coroutine.yield()" se encarga de hacer eso, finalmente, debemos de tener una parte que escuche y para eso existe "coroutine.resume()". Si tomamos cómo ejemplo el código anterior, vemos que hay que crear la funcion y esta debe de contener la "interrupción", en este caso "coroutine.yield()" la manera en que lua trabaja con las co-rutinas, es interrumpiendo, es decir si estamos ejecutando un trozo de código, este normalmente se ejecutará de forma lineal hasta el final, pero si usamos las co-rutinas, cuando observamos en el segundo bucle, y en general cuando se encuentre con la instrucción "coroutine.resume()", la ejecución pasará a la co-rutina y esta se ejecutará hasta que se encuentre con "coroutine.yield()", cuando se encuentra con esta instrucción, la ejecución continuará con la linea inmediata después de "coroutine.resume()".
Para poder apreciar mejor el resultado, puedes ir a la página de lua, y probar el código anterior.
Cómo lua es un lenguaje de "scripting" es usado en varias plataformas y las funciones disponibles pueden variar, pero todas las que se usan aquí, deben de estar disponibles en la mayoría, ahora por ejemplo, si queremos cargar archivos sin bloquear la pantalla principal, podemos hacerlo usando co-rutinas. Esa seria la introducción, pero esto se puede ampliar un poco mas, en otro post.
Los leo luego.
Antes que nada, debo de aclarar que este no es un tutorial para aprender a programar en Lua, en este post solo explicaré cómo hacer uso de las co-rutinas. Probablemente en el futuro, habrá un ecuatorial completo en las series "Learning machine", pero por ahora y por petición de un amigo mio, veremos cómo es que se hace uso de ellas. Eso no nos impedirá ver lo básico, ¿Que es Lua?; bueno, lua es un lenguaje de programación interpretado; es decir, a diferencia de lenguajes cómo C o C#, este, no es necesario compilarlo para usarlo, una vez escrito el código fuente, se puede pasar al interprete (que será el ejecutable) y este interpretará el código y producirá un resultado, si es necesario cambiar alguna parte del programa, en lugar de volver a compilar el ejecutable, bastará con modificar el código fuente.
Co-rutinas.
Ahora veamos lo que nos trajo a este post, hace un tiempo, mientras un escribía código para "Play List M" (una aplicación para PSVita), un amigo vio lo que hacía y pregunto que si sabía usar lua, le dije que si, toda la aplicación esta hecha en ese lenguaje, entonces me pregunto si sabia usar las co-rutinas y si podía explicarserlas.
Las co-rutinas en lua, sirven para ejecutar código en una sección aparte, es muy similar un "thread" en c#, pero de una forma un tanto distinta. Veamos cómo es que se ejecuta un programa con un "thread" (hilo desde ahora) separado. Ahora observemos las siguientes imágenes.
Esta es la representación más simple de un programa |
Esta es la representación más simple de un programa con un hilo adicional. |
La ventaja de tener un hilo secundario, es que la aplicación no se bloqueara mientras haga un trabajo difícil (o haga un ciclo o un bucle), si los resultados no son necesarios para continuar con la ejecución del programa, podemos hacer otra tarea mientras el código del otro hilo termina.
En el caso de lua, cuando hablamos de co-rutinas, no significa que creemos otro hilo, para observar a detalle lo que ocurre, tomemos el siguiente código:
local counter = 1; local function OneToHoundred() while counter < 50 do io.write("Contador:"..counter.."\n"); coroutine.yield(); counter = counter + 1; end end CoProc = coroutine.create(OneToHoundred); local counter2 = 0; while counter2 < 101 do coroutine.resume(CoProc); io.write("Contador2:"..counter2.."\n"); counter2= counter2 + 1; end
En lua, la manera sencilla de crear una co-rutina, es haciendo uso de "coroutine.create()" y en su forma más sencilla, debemos de pasar una función cómo parámetro. para poder interactuar con la función, dentro de esta, debe de haber algo que diga "oye, tengo que decir algo", la función "coroutine.yield()" se encarga de hacer eso, finalmente, debemos de tener una parte que escuche y para eso existe "coroutine.resume()". Si tomamos cómo ejemplo el código anterior, vemos que hay que crear la funcion y esta debe de contener la "interrupción", en este caso "coroutine.yield()" la manera en que lua trabaja con las co-rutinas, es interrumpiendo, es decir si estamos ejecutando un trozo de código, este normalmente se ejecutará de forma lineal hasta el final, pero si usamos las co-rutinas, cuando observamos en el segundo bucle, y en general cuando se encuentre con la instrucción "coroutine.resume()", la ejecución pasará a la co-rutina y esta se ejecutará hasta que se encuentre con "coroutine.yield()", cuando se encuentra con esta instrucción, la ejecución continuará con la linea inmediata después de "coroutine.resume()".
Para poder apreciar mejor el resultado, puedes ir a la página de lua, y probar el código anterior.
Cómo lua es un lenguaje de "scripting" es usado en varias plataformas y las funciones disponibles pueden variar, pero todas las que se usan aquí, deben de estar disponibles en la mayoría, ahora por ejemplo, si queremos cargar archivos sin bloquear la pantalla principal, podemos hacerlo usando co-rutinas. Esa seria la introducción, pero esto se puede ampliar un poco mas, en otro post.
Los leo luego.
No hay comentarios.