Allen

A

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.

LOc0

Macho, eres un puto crack y . ¿Nos estás contando que te has currado tú solo desde cero esto? Flipante... Sólo por curiosidad, ¿qué edad tienes y a qué te dedicas? ME guardo la web y en cuanto tenga un respiro le echaré un vistazo, aunque Teoría de Compiladores y Lenguajes no sea mi fuerte... EN serio, me quito el sombrero :O

Una cuestioncilla rápida. ¿Generas los binarios directamente con tu compilador o hay uno de C intermedio?

Salu2 ;)

A

Buenas. Te agradezco el interés. : -)

En realidad, llevo bastantes meses trabajando en ésto. TPL fue por decirlo de algún modo mi iniciación a crear un lenguaje de programación. Allen es ya algo serio, usable y real.

Sobre tu pregunta...

Pese a lo que pueda parecer por el benchmark, Allen no es un lenguaje compilado sino interpretado, no crea binarios, el código se ejecuta directamente. Lo decidí así porque quiero la máxima portabilidad posible, es decir, que un programa escrito por mi en código Allen en linux te funcione a ti en windows o bsd, sin cambios.

No sería difícil realmente crear un compilador a bytecode x86 o para una máquina virtual de stack para hacer ejecutables, pero realmente no ganarías apenas rendimiento. La razón es que en si mismo el código Allen es una lista de funciones que puede representarse en forma de lista enlazada o árbol de nodos, en estructuras del propio Allen. Por eso pese a ser interpretado es más rápido incluso que algunos lenguajes compilados.

Sobre esta propiedad:
http://en.wikipedia.org/wiki/Homoiconicity

Tengo 25 años y trabajo programando en .NET con SQL haciendo aplicaciones de contabilidad en una empresa de por aquí.

erdanblo

Aunque reconozco que no tengo ni idea de como hacerlo funcionar, yo también me quito el sombrero solo por el trabajo de programarse uno mismo su propio lenguaje :P

_

archville directamente es dios

A

Gracias por los comentarios.
Quisiera poner otro ejemplo acerca de lo versatil que puede resultar el trabajo con listas en algunos casos.

En C los operadores de comparación son:

, <, <=, =>, == y !=

En Allen existen, pero como Allen permite el uso de listas
su significado es algo distinto.

Ejemplo:

2 10 12

Significado:
¿ Es 2 mayor que 10 y que 12 ?

Ejemplo:
<- 1 2 3 4 5 6

Significado:
¿ Están ordenados de menor a mayor ?

De modo que para hacer un programa que determinase
si una lista de nºs está ordenada, y si no lo está que la
ordene podríamos hacer:

var.def x [io.read];
cond.ifnot ( <- $x ) { list.sort <- $x };

Que significa:
Define la variable X como lo que se lea por teclado.
Si no está ordenado de menor a mayor, ordenar X.

Podríamos optimizar el asunto, ordenando siempre:
var.def x [list.sort <- [io.read]];

Que significa:
Define la variable X como la lista ordenada de menor a mayor
de lo que se lea por teclado.

friskies

pues solo decirte que no lo dejes y que sigas adelante con esto porque tiene muy buena pinta, sobre todo si la portabilidad de un sistema operativo a otro es tan real como tu dices...

imaginate todas las empresas de software programando en "visual allen"

saludos y suerte

Usuarios habituales

  • friskies
  • Archville
  • _Wii_
  • erdanblo
  • LOc0