Cuando llevas bastante tiempo en un proyecto llega un momento en el que
se hace complicado describirlo. Allen es a grandes rasgos un lenguaje
de programación flexible, pequeño y potente que comparte características
de otros lenguajes y aporta algunas nuevas que lo hacen particularmente
interesante o apropiado para algunas tareas.
¿ Cómo es Allen ?
Allen es a grandes rasgos una mezcla de C, Lua, Perl y Lisp. Está programado
en estricto ISO C de modo que es absolutamente portable y se puede compilar
y usar sin cambios en Windows, Linux, BSD o cualquier sistema operativo donde
haya un compilador de C decente. Tampoco depende de ninguna arquitectura
de modo que funciona en x86, en x86-64, en alpha, risc, en sparcs... etc
La filosofía de Allen es la siguiente:
- Pequeño. El ejecutable no debe ocupar más de 64 kb, incluyendo todas sus
librerías y módulos. Debe poder embeberse en otros lenguajes como C o Python. - Simple. El código es simple, funcional y portable, fácil de leer y fácil
de modificar. Unas 10.000 lineas de ISO C en total. - Portable. Nada de cambios, nada de librerías raras, nada de warnings del
compilador. Compilar Allen es usar un Makefile, el mismo para todos los SO
con la última versión de Gcc. - Potente. Allen incluye una librería completa. Funciones matemáticas, de
tratamiento de cadenas, listas, macros, arrays, interpolaciones, ficheros... - Extensible. Allen puede extenderse implementando funciones en el propio
lenguaje Allen o en C y configurarse a voluntad. - Híbrido. Procedural, funcional y orientado a objetos, a la vez.
- Versatil. Puede usarse no solo como lenguaje de propósito general sino
también para programación web en CGI o embebido.
¿ Qué hay implementado ya ?
- Librerías aritméticas y matemáticas.
- Condiciones if/else/switch, múltiples etc...
- Bucles e iteraciones, incluyendo recursividad a nivel de función, de macro
de nombre de espacio, etc - Interpolaciones.
- Conversión de tipos.
- Meta-variables: Cada variable puede ser un objeto, una lista, una macro
un método, un diccionario, una cadena, un número, etc - Libreria completa para cadenas.
- Interacción con el SO, variables de entorno, exec...
- Arrays, de cualquier dimensión, indexados o libres, para cualquier tipo
de variables. (por ej: Arrays de objetos o de diccionarios) - Una librería simple de ficheros y de entrada/salida.
- Objetos, herencia, polimorfismo, métodos...
¿ Qué falta ?
- Una librería de listas decente.
- Operadores de nodos y rangos.
- Multithreading.
- Una librería para expresiones regulares.
- Sockets.
- Soportar uso de DLL externas.
- Bindings para GTK, OpenGL, SDL...
Un ejemplo de código
Si quisieramos hacer un programa que simplemente calculase la suma de todos
los nºs introducidos por teclado, podríamos hacer ésto:
loop.until () {
io.write [eval "+ [io.read]"];
}
Traducido a pseudocódigo:
en un bucle infinito {
escribe por pantalla ( la evaluacion de la suma de lo que leas por teclado )
}
Y el resultado:
bash $ Allen ejemplo.allen
1 2 3 4 5
15.000000
-10 +50
40.000000
0xFF 1e02
355.000000
Un benchmark
Los tiempos son para un algoritmo de Fibonacci altamente recursivo.
Concretamente, el código que he usado para cada lenguaje lo he cogido
en el benchmark de lenguajes de Alioth:
http://shootout.alioth.debian.org/
Java: 12.4 secs.
Perl: 7.8 secs.
Python: 7.2 secs.
Lua: 6.4 secs.
C#: 4.8 secs.
Allen: 2.7 secs.
C++: 1.7 secs.
C: 0.7 secs.
Me gustaría poder dar un enlace para descargarlo, pero aún no está terminado.
La razón de que lo postee ahora es tener sugerencias para añadir cosas nuevas,
antes de hacer la primera versión pública, la cual aún tardará un par de meses
ya que tengo bastante trabajo que hacer.
La web de momento es: http://allendevel.wordpress.com/
Disculpas por ladrillo de post.