Hoy vamos a presentar un lenguaje de programación que, si bien no es nuevo, ha conseguido tener cierta repercusión y podría ser un buen punto de partida para empezar a programar, Lua.
En la actualidad hay muchos lenguajes de programación, siendo posiblemente Java y C++ los más conocidos. Sin embargo, dichos lenguajes de programación pueden ser demasiado difíciles para empezar, debido a la gran cantidad de elementos a tener en cuenta para que un programa pueda ejecutarse, haciéndolos posiblemente puntos de partida un tanto difíciles. Lua, en cambio, es un lenguaje mucho más sencillo de aprender y que puede ser un mejor punto de partida, debido a que necesita menos líneas de código para poder funcionar. Para ello vamos a mostrar el código de una frase terminada con una variable numérica en tres lenguajes diferentes.
Hoy es día 5 en C++:
#include <iostream> using namespace std; int main() { int diahoy=5; cout << "Hoy es día " << diahoy << endl; return 0; }
Hoy es día 5 en Java:
public class main { public static void main(String[] args) { int diahoy=5; System.out.println("Hoy es día "+diahoy); } }
Hoy es día 5 en Lua:
diahoy=5 print("Hoy es día " .. diahoy)
Como se puede comprobar, el código en Lua es mucho más sencillo, gracias a que es un lenguaje cuyas variables son tipadas de forma automática, algo que se puede apreciar debido que i=5 no tiene la definición int delante. Segundo, no necesita que los programas tengan una función (caso de C++) o método (caso de Java) de cuerpo para que el programa funcione.
Por otro lado, las sentencias pueden recordar a algunos a la programación en scripts de shell, y no es para menos, ya que Lua se inspira directamente en este lenguaje (además de otros).
Los orígenes de Lua
Lua (que es luna en portugués) es un lenguaje de programación interpretado de origen brasileño que nació en 1993. Fue creado para ofrecer una tecnología extensible (al principio fue creado con el foco puesto en integrarse con C), simple (ya que su semántica es sencilla, por lo que no tiene muchos elementos que memorizar, además su sintaxis es permisiva), eficiente (ofrece un buen rendimiento) y portable. Esto quiere decir que se puede ejecutado sobre cualquier sistema operativo que lo tenga instalado. En un principio fue concebido con el foco puesto en los sistemas embebidos.
Por otro lado, es Open Source debido a que se distribuye bajo licencia MIT y está construido con ANSI C, facilitando estas dos características su portabilidad a una gran cantidad de sistemas operativos, entre ellos GNU/Linux, Windows y Mac OS X.
Partes básicas del lenguaje
No vamos a dar aquí un curso completo programación en Lua, pero no viene mal mostrar las partes básicas de este lenguaje de programación.
La sintaxis es bastante sencilla, permitiendo muchas posibilidades diferentes, como el poder usar el punto y coma a voluntad del usuario al final de las sentencias, o poder omitir los paréntesis a la hora de utilizar la función print para imprimir en pantalla (en caso de no usar variables) y en las condicionantes. Por otro lado, las condicionantes, bucles y funciones no utilizan llaves ({}) para delimitar el código que abarca cada uno, sino que se cierran siempre con la palabra end. Ahora vamos a poner un ejemplo de cada uno de los elementos básicos de Lua.
Condicionantes
No hay switch-case, por lo que todas las condiciones se tienen que realizar mediante if, elseif y else. Aquí tenemos un ejemplo básico del uso de la condición if.
cantidad = 5 if cantidad == 5 then print "La cantidad es 5" else print "La cantidad no es 5" end cantidad = 6 if (cantidad == 5) then print("La cantidad es " .. cantidad) else print("La cantidad no es " .. cantidad) end
El if comprueba si se cumple la condición (que puede estar entre paréntesis) e imprime en la pantalla (a través de una consola) lo que hay debajo del if, en caso contrario imprime lo que hay debajo de else, que viene a decir «si no». Como veis, los valores se asignan a las variables a través de un solo igual (=), mientras que para comprobar en las condicionantes hay que usar forzosamente doble igual (==). Además del doble igual, también se puede comparar utilizando mayor (>), menor (<), mayor o igual (>=), menor o igual (<=) y distinto (~=).
Se puede establecer varias condiciones a la vez, pudiendo utilizar and, or y not.
PrimeraCantidad = 5 SegundaCantidad = 6 if (PrimeraCantidad == 5) and (SegundaCantidad == 6) then print("La primera cantidad es " .. PrimeraCantidad .. " y la segunda es " .. SegundaCantidad) else print("Las cantidades no corresponden.") end
Bucles
Los bucles son para realizar de forma iterativa un trozo de código. Hay que tener cuidado con ellos, porque en caso de no definirlos correctamente se puede provocar un bucle infinito, que se ejecuta de manera infina al menos que el usuario mate el proceso. En Lua hay tres tipos de bucles, while, repeat-until y for, los cuales veremos de forma muy básica.
Aquí tenemos un ejemplo de bucle while. Mientras que el valor sea superior a 0, el bucle seguirá ejecutándose (en Lua no hay operadores de autoincremento y autodecremento, y los dos puntos (..) sirven para unir cadenas de caracteres con variables):
cantidad = 10 while cantidad > 0 do print("La cantidad es " .. cantidad) cantidad = cantidad -1 end print("Fin del bucle")
Aquí tenemos un ejemplo del bucle repeat-until (repetir hasta). Hay que tener cuidado con él, porque aquí la condición funciona al revés que con el mientras. Si pusiésemos la condición del bucle mientras que en bucle hasta, este imprimiría el primer valor y luego saltaría (esto es lo más parecido al do-while que hay en Lua):
cantidad = 10 repeat print("La cantidad es " .. cantidad) cantidad = cantidad -1 until cantidad < 1 print("Fin del bucle")
Luego tenemos el bucle for, que permite establecer dentro del mismo bucle todos los parámetros de delimitación. Este tipo de for, que es el más común entre los lenguajes de programación, se llama numérico en Lua:
for i = 1, 10 do print("Valor de i en esta iteración: " .. i) end
También se puede establecer el incremento o decremento en un bucle for de la siguiente manera:
for i = 10, 0, -1 do print("Valor de i en esta iteración: " .. i) end
Funciones
Las funciones son uno de los elementos más importantes de Lua, siendo esta su sintaxis:
function pequenafuncion (parampasado) parampasado = parampasado + 1 return parampasado end cantidad = 99 print("Parámetro que se va a pasar por valor a la función: " .. cantidad) resultadofuncion = pequenafuncion(cantidad) print("Resultado que ha devuelvo la función: " .. resultadofuncion)
Las funciones no tienen por qué devolver nada:
cantidad = 99 function pequenafuncion () cantidad = cantidad + 1 end print("Valor de cantidad antes de ejecutarse la función: " .. cantidad) pequenafuncion() print("Valor de cantidad después de ejecutarse la función: " .. cantidad)
Tablas
Las tablas son la única estructura de datos en Lua, por lo que los arrays, las matrices, las listas y las colas están compuestos por estas. Las tablas siempre empiezan con el índice a 1, al contrario de otros lenguajes de programación como Java y C, en los cuales los arrays empiezan por 0.
tabla = {"un", "dos", "tres", "cuatro", "cinco"} for i=1, #tabla do print("Índice: " .. i .. ". Cantidad: " .. tabla[i]) end
Como se puede apreciar en el código, las llaves sirven para delimitar los valores que tendrá la tabla y #tabla (el fundamento es usar almohadilla delante del nombre de la tabla) sirve para obtener el cantidad de elementos que contiene. En otros lenguajes de programación se usaría la función count.
FILAS, COLUMNAS, CUENTA = 5, 6, 1 -- Introducir valores mt = {} for i = 1, FILAS do mt[i] = {} -- Crear la fila for j = 1, COLUMNAS do mt[i][j] = CUENTA CUENTA = CUENTA + 1 end end -- Mostrar valores for i = 1, FILAS do for j = 1, COLUMNAS do io.write(mt[i][j] .. "\t") end io.write("\n") print("") end
Las tablas también pueden ser asociativas en Lua, siendo su manejo muy similar al de un array asociativo de PHP.
tabla = {primervalor = "uno", segundovalor = "dos", tercervalor = "tres", cuartovalor = "cuatro"} print(tabla["primervalor"]) print(tabla["segundovalor"]) print(tabla["tercervalor"]) print(tabla["cuartovalor"]) for i,v in pairs(tabla) do print("Índice: " .. i .. ". Valor: " .. v) end
Programación orientada a objetos
Sí, Lua también soporta programación orientada a objetos. Cuando se crea una clase, es importante colocar el código module(…, package.seeall) en la parte superior para que pueda ser utilizada desde otros ficheros. Luego se tiene que “requerir” el fichero que la contiene almacenándolo en una variable para poder utilizar la clase y así crear los objetos:
Fichero de la clase, oopclase.lua:
module(..., package.seeall) function new (n, e) local objeto = {} objeto.nombre = n objeto.edad = e function objeto:decirNombre() print(objeto.nombre) end function objeto:decirEdad() print(objeto.edad) end return objeto end
Fichero de utilización de los objetos, oopobjeto.lua:
local empleado = require "oopclase" -- Requerir el fichero oopclase.lua, que contiene la clase local juan = empleado.new("Juan", 35) -- Crear el objeto juan con la clase oopclase local andres = empleado.new("Andrés", 20) -- Crear el objeto andres con la clase oopclase juan:decirNombre() -- Imprime en pantalla el nombre de juan juan:decirEdad() -- Imprime en pantalla la edad de juan andres:decirNombre() -- Imprime en pantalla el nombre de andres andres:decirEdad() -- Imprime en pantalla la edad de andres
Cómo ejecutar un fichero en Lua
Para ejecutar un fichero se tiene utilizar el comando lua desde la consola en GNU/Linux. En el caso de utilizar Windows, después de realizar el proceso de instalación, posiblemente se tenga que añadir la ruta de Lua (de igual forma que con Java) al sistema para poder ejecutarlo sin tener que estar escribiendo constantemente la ruta de instalación. Conociendo que la última versión es la 5.3, el comando puede cambiar a lua53.
Comando para ejecutar un fichero de Lua:
lua fichero.lua
O también en según qué sistema:
lua53 fichero.lua
El 53 varía según la versión de Lua, en caso de usar la 5.2 este pasa a ser lua52, lua51 para la versión 5.1 y así sucesivamente.
En el caso de la clase y el fichero que sirve para la creación de los objetos, hay que ejecutar el fichero que contiene los objetos, siguiendo el ejemplo anterior, oopobjeto.lua.
Si el estar con un editor de texto y una consola os resulta poco práctico, existe un IDE totalmente enfocado en la programación en Lua y al uso de algunos frameworks relacionados como Love2D, ZeroBrane Studio. Este IDE está construido con Lua, es Open Source y tiene versiones para Windows, Mac OS X y GNU/Linux.
Contextos en los que se utiliza
El hecho de que Lua pueda ser un lenguaje apropiado para aprender a programar puede llevar a algunos a pensar de que es una tecnología de juguete, pero nada más lejos de la realidad.
Lua es utilizado por World of Warcraft para la personalización de la interfaz y Garry’s Mod, un mod de Half-Life 2, está construido en buena parte con esta tecnología. Adobe Photoshop Lightroom, el programa de rastreo de puertos de red Nmap y la interfaz gráfica de Damn Small Linux también hacen uso de Lua para diferentes contextos.
Evidentemente, tampoco podemos olvidarnos del framework para videojuegos LÖVE (también conocido como Love2D), del cual comentamos el pasado mes de febrero.
Inconvenientes del lenguaje de programación Lua
El principal problema que le encuentro a Lua es posiblemente que no existe tanta documentación en torno a él como por ejemplo en Python, otro lenguaje de programación que puede venir bien para aquellos que quieran iniciarse en este campo.
Por último, es importante mencionar que programar no es memorizar los lenguajes de programación, sino más bien saber cómo se programa, para luego ser capaz de adaptar esos conocimientos a otros lenguajes. A esto se le llama fundamentos de la programación.