Pequeña Historia de Wren
Wren es un lenguaje de programación orientado a objetos creado por Bob Nystrom, un ex desarrollador de videojuegos y creador de otros lenguajes de programación como Vigil, Finch y Magpie. Ha escrito dos libros: Game Programming Patterns y Crafting Interpreters.
El primer commit de Wren fue escrito el 22 de Octubre del 2013 y su versión más reciente es la 0.3. Actualmente Bob Nystrom pasó a ser colaborador y la evolución del lenguaje fue asignada a _discovery (creador del game engine Luxe).
Wren fue creado como una alternativa a Lua y otros lenguajes de scripting para personas que estuvieran más familiarizadas con lenguajes orientados a objetos como Java, C#, o C++. Su principal foco es la simpleza.
La página oficial de Wren es Wren.io.
La principal característica de Wren es ser un lenguaje minimalista. Esto significa que no todas las ideas y utilidades serán implementadas en la API oficial. Muchas veces se tendrá la obligación de implementar funcionalidades adicionales que en otros lenguajes están disponibles de fábrica. Normalmente la recomendación es tener una serie de archivos con utilidades a mano y si algún día son implementadas en la API oficial, poder reemplazarlos adecuadamente.
Wren es un tipo de ave pequeña perteneciente a la familia de los troglodítidos (que habita en cavernas o cuevas). En Chile tenemos al Chercán o Chochin Criollo.
Fotografía por Juan Tassara B en https://www.avesdechile.cl.
Esta familia de aves se caracteriza por sus canciones elaboradas y complejas. Es uno de los más queridos compositores de las aves. Sus canciones tienen una rica variedad de cromatura musical.
También son aves muy hogareñas que prefieren quedarse en un mismo territorio a emigrar. Cuando vuelan sorprenden con la gran altura que pueden alcanzar y su rapidez. ¡Nunca sabes en que dirección van a salir!.
En las tradiciones celtas, el Wren es un símbolo de vivacidad y actividad.
Existen algunos lenguajes interpretados usados para ser incrustados dentro de aplicaciones. Lua es uno de los más populares. Actualmente también son populares JavaScript o Python.
Lua es genial, simple y rápido. Pero muchas veces su naturaleza es un poco incómoda para personas más acostumbaradas a lenguajes como C++ o Java. La sintaxis es diferente y la semántica del modelo de objetos es algo inusual.
Wren es una alternativa a Lua pensada para personas mas familiarizadas con lenguajes orientados a objetos.
Acá podemos comparar la implementación de una clase llamada Cuenta entre Lua y Wren.
-- cuenta.lua
Cuenta = {}
Cuenta.__index = Cuenta
function Cuenta.crear(balance)
local cuenta = {} -- nuevo objeto
setmetatable(cuenta,Cuenta) -- hacer el objeto cuenta tenga las propiedades de Cuenta
cuenta.balance = balance -- inicializar el objeto
return cuenta
end
function Cuenta:retirar(monto)
self.balance = self.balance - monto
end
-- crear y usar una Cuenta
cuenta = Cuenta.crear(1000)
cuenta:retirar(100)
// cuenta.wren class Cuenta { construct crear(balance) { _balance = balance } retirar(monto) { _balance = _balance - monto } } // crear y usar una Cuenta var cuenta = Cuenta.crear(1000) cuenta.retirar(100)
Los lenguajes orientados a objetos y clases tradicionalmente tienen una reputación de ser complejos. Esto es principalmente por que los lenguajes que implementan este paradigma son complejos: C++, Java, C#, Ruby y Python.
Uno de los objetivos de Wren es demostrar que son dichos lenguajes los complejos, no la orientación a objetos y clases en sí. Smalltalk fue uno de los precursores y la inspiración para muchos de aquellos lenguajes. Es tan simple que toda su sintaxis puede ser escrita en una tarjeta kardex. Wren desea ser igual de minimalista, pero al mismo contar con el poder expresivo de las clases y orientación a objetos.
Finalmente para responder la pregunta de "¿Por qué aprender Wren?". Principalmente por que aprender un nuevo lenguaje de programación siempre entregará experiencia que puede ser extrapolada a otros ámbitos y contextos. Tal vez sea más simple de aprender un concepto en Wren que en Python o Lua. Quizás un lenguaje de nicho como Wren no tenga muchas ofertas laborales que lo soliciten, pero todo lo aprendido siempre será nutritivo para el desarrollo profesional.
Wren es un lenguaje interpretado, lo que significa que no requiere de compilación. Basta simplemente tener un intérprete para ejecutar los algoritmos. Hay varias alternativas.
-
Compilar tu propio intérprete de Wren. Esta es la opción para valientes.
-
Utiliza Wren CLI para ejecutar archivos *.wren.
-
Utiliza un engine de juegos como Dome, TIC 80 o Luxe que traen Wren listo para llegar y utilizar.
-
Utiliza Wren Try para probar el lenguaje en tu navegador.
Una vez que tengas tu intérprete instalado puedes ejecutar por ejemplo`./wren main.wren` para ver el resultado de tu script.
La terminal de Wren llamada Wren CLI (Interfaz de línea de comandos) permite dos modos de operación. El primero es el modo REPL (Bucle Lectura-Evaluación-Impresión) el cual nos permite evaluar las instrucciones una a una. El segundo modo es el intérprete que permite ejecutar scripts Wren.
Si ejecutamos simplemente el comando ./wren
entraremos al modo REPL. Donde se nos mostrará un simpático pajarito y la versión de Wren instalada.
O También mostrar un mensaje utilizando System.print()
.
¿Por qué aparece la palabra Plop!
dos veces?. Simplemente por que la primera vez es el resultado de la operación System.print()
(mostrar un valor), mientras que la segunda vez está mostrando el valor retornado por System.print()
, el cual es el mismo texto.
Cuando necesitamos algo mucho más avanzado podemos utilizar archivos que finalicen con la extensión *.wren. El nombre más común es main.wren, aunque puedes llamarlo con cualquier nombre. Para ejecutar un archivo específico simplemente se debe utilizar ./wren <archivo.wren>
.
-
Creamos un nuevo archivo llamado
main.wren
. -
Escribimos nuestro código (En este caso
System.print("Plop!")
) y guardamos. -
Finalmente Ejecutamos
./wren main.wren
.
Deberíamos ver un resultado similar a este:
Notar como solamente aparece una vez "Plop!", ya que no estamos en modalidad REPL.
Cada vez que un programa termina su ejecución devuelve un código numérico para indicar si terminó exitosamente o tuvo un algún tipo de error mientras se ejecutaba.
La convención tradicional es considerar el código cero (0) como éxito y cualquier otro número como error. No hay un estándar definido para la asignación de números de error. Wren se basa levemente en los códigos utilizados por el sistema operativo BSD.
Actualmente no puedes elegir el código de error. Wren automáticamente asignará el código que mejor se ajuste a la situación. Por ejemplo si utilizar la instrucción para terminar la ejecución del programa Fiber.abort("Mensaje de Error")
el código asignado sera de 70 (error interno del software).
La siguiente es una tabla con los códigos de BSD más algunos otros adicionales.
0 - Fin del programa exitoso
1 - Error desconocido
2 - (grep) Uso incorrecto del comando | (bash) Error de entrada/salida
64 - Uso incorrecto del comando
65 - Error de formato de datos
66 - Sin acceso a la entrada
67 - Dirección desconocida
68 - Nombre de dominio (host name) desconocido
69 - Servicio no disponible
70 - Error interno del software
71 - Error de sistema
72 - Archivo crítico del sistema no encontrado
73 - Imposible de crear archivo de salida
74 - Error de entrada/salida
75 - Falla temporal
76 - Error remoto en protocolo
77 - Permiso denegado
78 - Error de configuración
126 - Comando encontrado, pero no es ejecutable
127 - Comando no encontrado
128 - Código de salida no válido
128 Error fatal terminado por kill -9
140 - Comando terminado por Ctrl-C
141 - Comando terminado por Ctrl-D
255 - Código de salida fuera de rango
Esta es la lista de los errores usados en Wren:
// Exit codes used by the wren binaries, following the BSD standard
//
// The interpreter was used with an incorrect number of arguments
#define WREN_EX_USAGE 64
// Compilation error
#define WREN_EX_DATAERR 65
// Runtime error
#define WREN_EX_SOFTWARE 70
// Cannot open input file
#define WREN_EX_NOINPUT 66
// I/O Error
#define WREN_EX_IOERR 74
Puedes verificar el código numérico de salida utilizando el siguiente comando (bash)
./wren main.wren | echo "Exit code ${PIPESTATUS[0]}"