El problema que pretendía resolver era la baja tasa de aprovechamiento de código. La herramienta que uso habitualmente es Delphi y su versión para Linux, Kylix, ambas productos comerciales de la empresa californiana, Borland. Normalmente quienes usamos Delphi lo comparamos con C++ y eso nos beneficia poco. No lo digo porque C++ sea más potente. Lo digo precisamente porque son prácticamente iguales. De hecho, aunque C++ tenga un par de construcciones potentes adicionales, Delphi es más productivo, no por el lenguaje, sino por el excelente sistema de componentes.
Y es que no te mosqueas es cuando comparas tu lenguajes con otros del mismo estilo. Sino cuando empiezas a echar de menos cosas nuevas que se te ocurren sobre la marcha. Te preguntas "¿cuántas veces he escrito esto?, ¿no habría manera de escribirlo de una vez por todas?". Nos dicen que la solución es la programación orientada a objetos. Francamente, después de varios años conviviendo con objetos por todas partes, creo que esta técnica está sobrevalorada. Es una característica del lenguaje útil para capturar determinadas abstracciones. Pero no es una panacea. Si la usamos tanto es... ¡porque no tenemos otra cosa!.
Un síntoma de la insuficiencia de la OOP es la proliferación de los patrones de diseño. Si tuviésemos lenguajes adecuados, no necesitaríamos patrones. ¡Los escribiríamos en el mismo código!.
La característica que no encontraba en los lenguajes que conocía era la creación de sintaxis particulares para determinados problemas sobre la marcha. Tenía pensado para implementarla permitir añadir plug-in's al compilador con acceso al árbol de sintaxis.
Al profundizar algo más en los lenguajes existentes, me enteré de que Lisp ya tenía esa característica. Flipo cuando me entero de que Lisp data de finales de los años 50. Es considerablemente más antiguo que C o Pascal. Buscando causas para que no sea popular, encuentro varios artículos interesantes en la web de Paul Graham, que se puede resumir en que Lisp tiene una sintaxis poco amigable y exige una implementación que quizás no era tan eficiente en un ordenador de hace décadas.
Pero cuando las máquinas han llegado a ser más potentes, ¿por qué se han creado máquinas virtuales para lenguajes como Java, que son más de lo mismo?. ¿Por qué no han intentado aprovechar la nueva potencia de las máquinas para implementar lenguajes potentes?.
Parece que Graham tiene razón y es la vieja historia de que las empresas buscan programadores mediocres, que puedan reemplazar fácilmente.
Por fin, buscando una implementación libre de Lisp, me he encontrado con una nueva sorpresa. En los años 60, poco después de Lisp se creó POP, un lenguaje incluso más flexible que Lisp y con una sintaxis algo más clara. POP-2 (primera versión estable del lenguaje) fue bastante usado en Inteligencia Artificial en ámbitos universitarios británicos. En él se escribió por primera vez el Boyer-Moore. Para situarnos más: POP es una transición entre Lisp y los lenguajes funcionales (en POP se inspiró ML).
Pero POP no sólo es un lenguaje muy potente debido a las construcciones sintácticas que permite. También su implementación, la máquina virtual llamada Poplog, tiene características peculiares que siguen por delante de cualquier cosa que yo conozca. En primer lugar, aunque hayas leído "máquina virtual", no pienses en un intérprete, ni siquiera en "bytecode". Poplog ejecuta código compilado. Las palabras mágicas son "compilación incremental". Para imaginártelo, piensa que Poplog es interactivo, como el intérprete de Pitón. Pero cuando completa una función, la compila y la incorpora a la imagen binaria del sistema, de forma que siempre trabajas con código compilado.
Los mantenedores de Poplog presumen de tener uno de los recolectores de basura más rápidos del planeta. Por cierto que el código compilado también se recolecta. Ahora cuando oigo hablar de JIT o de NET, me entra la risa. Esto se implementó casi todo por un sólo tipo, un tal Gibson, en los años 70 y 80 para unas cuantas plataformas (VMS, UNIX...). Más recientemente llegó a PC, y hay versiones para Linux y Windows.
¿Dije que me encontré con Poplog buscando una implementación de Lisp?. Es que Poplog tiene una implementación de Lisp... y de Scheme, y de Prolog, y de ML. Debido a la sintaxis extensible de POP-11 (la versión actual de POP), se pueden implementar múltiples lenguajes dentro de la máquina virtual, además simultáneamente y comunicándose entre ellos.
De nuevo: ¿es NET una buena idea?. Desde luego no es una idea nueva.
Durante muchos años la Universidad de Sussex comercializó Poplog a través de varias empresas. ¡Llegó a venderse por £3.000!. En 1999 se liberó (X11/MIT) el código y ahora la distribución está disponible públicamente.
Pongo los enlaces básicos para más información y para descargarse el soft:
http://www.poplog.org/ es un intento de organizar la información disponible, aunque el sitio está aún algo verde.
http://www.cs.bham.ac.uk/research/poplog/ es el directorio de la distribución en la Universidad de Birmingham, donde está Aaron Sloman, que parece ser el tipo más comprometido con Poplog y su liberación. Este directorio está un poco desorganizado y cuesta encontrar a veces las cosas entre la tonelada de documentación. Si os atascáis con la instalación, recomiendo echar un vistazo al directorio sysdoc.
No me extraña demasiado que tres años después de la liberación siga casi desconocido. La comunidad actual está formada por algunos viejos hackers y antiguos clientes que lo más que hacen es actualizar el sistema, lo cual no es demasiado trabajo porque después de muchos años, los bugs conocidos son marginales.
Las librerías de integración son algo escasas. Se echan en falta al menos para GTK, alguna base de datos más y FastCGI. En compensación tiene abundante código para aplicaciones de Inteligencia Artificial, como el SimAgent. En realidad tampoco es tan difícil su interfaz binaria. Además de POP-11 tiene otro lenguaje de más bajo nivel para crear interfaces. Otro sistema que me parece preferible a lo que se estila: se crea la interfaz desde el lenguaje, en vez de obligar al que hace la librería en C a tener que usar un API especial (Pitón, Ruby...).
Supongo que en las prioridades de muchos lectores estará más el aprender un lenguaje de moda ampliamente usado que una rareza que parece haber resucitado de unas misteriosas catacumbas. Personalmente estoy decidido a darle una oportunidad. Tengo cubiertas mis necesidades más perentorias y creo que Poplog podría encajar muy bien en un proyecto de aplicación para la web que estoy rumiando. Con un poco de curro se puede crear una distribución algo más organizada, tan cómoda como la de algunos lenguajes modernos de script como Pitón, que cada vez son más potentes, pero aún no se acercan.
En fin, que para un hacker aburrido Poplog puede ser una fuente inagotable de diversión.