Lenguaje Boo y Mono para videojuegos

Cada vez más, hay una tendencia clara de los fabricantes de engines a fabricar entornos en los que otros desarrolladores, diseñadores y animadores, puedan crear juegos tanto para PC, como videoconsolas, móviles, etc.

En este caso, me he llamado la atención que la empresa Unity, a través de su plataforma de creación de videojuegos para PC, Internet (a través del navegador) y smartphones, haya comenzado a incluir ejemplos de código para sus clientes en lenguajes como Python y Boo. Mejor aún, es ver que empresas, incluso en nuestro país, emplean estas tecnologías y fortalecen sus departamentos de programación requiriendo conocimientos en estas técnicas. Claro ejemplo de esto último, la empresa G4M3 Studios, que solicita programadores con experiencia en HTML, JavaScript, SQL y… Boo.

Vale, ¿y qué es Boo?

Según el manifiesto que puede encontrarse en la página oficial de Boo, escrito por su autor, Rodrigo B. de Oliveira (que trabaja en Unity) y cuyas motivaciones fueron las siguientes:

Boo nació de la frustración de Rodrigo con los lenguajes de programación de sistemas y su amor creciente por la Infraestructura de Lenguajes Común (CLI, en inglés Common Language Infraestructure), y la belleza arquitectónica del framework completo de .NET.

La frustración se debió, principalmente, a que no podía usar el lenguaje que él quería usar (Python en ese momento) para construir el tipo de sistemas que necesitaba dentro del framework tecnológico en el que desarrollaba su empresa, por lo que tenía dos opciones: usar un framework distinto (un entorno estándar de Python) o un lenguaje de programación distinto (C# era la elección lógica para un programador con gran experiencia en C++ como él).

Intentó ambas vías pero ninguna le complacía.

Recorto hasta el final del documento ya que los datos de los alcances que fueron mal tanto en una opción como en otra no me interesan más que la conclusión final:

Llegó a la conclusión de que tenía que construir un nuevo lenguaje de programación de sistemas para el CLI, uno que permitiese a los programadores tomar las ventajas de las maravillosas características del framework .NET sin obstruir su camino. Un lenguaje que pueda ser usado, ampliado y modificado por desarrolladores acorde a las necesidades específicas.

Tenía que construir boo.

Hay varias teorías de donde pudo venir el nombre de Boo, como que es para asustar a los programadores, el nombre de uno de los fantasmas del juego Pac-Man o una acortación del apodo de Rodrigo, Bamboo. No he podido corroborar ninguna, por lo que, dejamos el origen del nombre a imaginación de cada uno.

¿Y qué hace Boo?

El lenguaje, según la wikipedia tiene como características ser tener: inferencia de tipos, generadores, multimétodos, duck typing opcional, macros, clausuras, currificación y funciones de primera clase… sí, muchas de estas cosas he tenido que mirarlas yo también, por lo que he dejado los enlaces en las que he visto que se explican más o menos bien cada una (algunas en inglés).

En el manifiesto, los objetivos que marca el autor son, en relación a la sintaxis, que tiene una sintaxis tipo Python, por lo que requiere, al igual que Python, de la identación de forma adecuada para delimitar los bloques. La declaración automática de variables… que no es una gran característica para los lenguajes scripting… pero cuando se viene de C++, C# o Java, puede ser toda una novedad, al igual que la inferencia de tipos.

Algo que difiere de Python, es el casting automático de tipos. En mi opinión, hacer que el lenguaje adivine el tipo de dato a emplear puede ser causa de muchos errores encubiertos y, por eso me gusta más la forma de Python y Ruby de no dejar que esto suceda, por ejemplo en comparaciones, que deben de evaluar tipos de datos compatibles. No obstante, Rodrigo se basa en que ese tipo de cosas se pueden dejar a las pruebas unitarias.

Al igual que en cualquier lenguaje script, y a diferencia de C# y Java, las clases son opcionales. Se puede escribir código directamente para ser ejecutado o funciones, sin necesidad de crear una clase para ello.

Se pueden emplear clases como argumentos (lo que se conoce como funciones de primera clase). Esto quiere decir que podemos escribir código como:

def ignore(item):
    pass
 
def selectAction(item as int):
    return print if item % 2
    return ignore
 
for i in range(10):
    selectAction(i)(i)

El lenguaje es bastante potente también en lo que respecta a generadores. Tiene generadores de primera clase, que son los empleados como por ejemplo para la función range(). También hay generadores para expresiones, el cual se puede ver como las listas de expresión en Python:

oddNumbers = i for i in range(10) if i % 2

Y como generador, tenemos también el generador de métodos, que permite escribir código como:

def fibonacci():
     a, b = , 1
     while true:
          yield b
          a, b = b, a+b
 
for index as int, element int zip(range(5), fibonacci()):
     print("${index+1}: ${element}")

A diferencia de Ruby, yield no ejecuta un bloque de código definido junto con la función, sino que va retornando valores que se emplean a modo de generador, por tanto, el código ejecuta fibonacci pero solo las 5 veces que requiere zip, de modo que no entra nunca en un bucle continuo tal y como se ve en el código a simple vista.

Conclusiones

Hay muchas de las características del manifiesto que me dejo en el tintero, pero tampoco es mi objetivo el traducir y poner tal cual el manifiesto. He puesto las características iniciales y que considero principales del lenguaje, así como los trozos de código que dan un buen ejemplo de cómo se escribe en el lenguaje y, viendo en lo que va haciendo énfasis el autor, adivino que la potencia del lenguaje son los generadores en sí.

El autor hace énfasis también en su maravilla por la plataforma .NET, la cual no comparto, pero he de reconocer que el lenguaje presenta características muy atractivas y extiende en lo que Python quizás se quedaba un poco corto. Tengo que admitir que el lenguaje me ha gustado y el hecho de que esté disponible para la programación en entorno de videojuegos es bastante llamativo.