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.
Comentarios
Publicar un comentario