Los 1001b lenguajes de programación más enrevesados y absurdos

Si aprender JavaScript o C se te hizo cuesta arriba, mejor no sigas leyendo porque he recopilado lo más de lo más friki  😉 Para quien prefiera un repaso por este submundo en formato de artículo científico, puede verlo por aquí.

1. Programar con espacios en blanco

Revelado al mundo el 1 de abril de 2003 (el “día de los inocentes” del mundo anglosajón), el lenguaje Whitespace propone lo contrario que lo que hace el parser de cualquier lenguaje normal: ignorar cualquier texto, número o símbolo y únicamente interpretar los huecos en blanco como instrucciones. Por tanto, es perfecto para esconder código en un texto. Su máquina virtual se compone de una pila, un espacio de memoria para variables y un puñado de instrucciones.

http://en.wikipedia.org/wiki/File:Whitespace_in_vim2.png

Así se ve un programa en Whitespace en el editor vim (Fuente)

Todo: constantes, el control de flujo, operaciones aritméticas, entrada y salida, se codifica mediante secuencias de tabuladores, espacios, espacios y tabuladores. Los enfermos interesados pueden leer más en este tutorial.  

2. Befunge

Creado para hacer su compilación lo más difícil posible, se trata de un lenguaje Turing completo con un flujo de programa bidimensional: cada carácter dice al compilador o intérprete en qué dirección ir a continuación. Por si fuera poco, el programa puede modificarse a sí mismo, al estilo del clásico autómata celular de Conway.  Absolutamente no apto para humanos, ni para compiladores… aunque finalmente hay quien consiguió programar un compilador para este engendro:

aa

Este sencillo programa resuelve un Sudoku. Click para ampliar (pero no, no creas que aún así lo entenderás). (Fuente)

Imprescindible hacer un recorrido por este repositorio de programas escritos en Befunge por la, probablemente, única persona capaz de hacerlo del mundo.

3. Brainfuck

Con la idea contraria del anterior, Brainfuck fue creado con la idea de hacer su compilación lo más sencilla posible, lo que evidentemente va en contra de su usabilidad e inteligibilidad por el programador. La máquina virtual asumida por el lenguaje es extremadamente simple, y sólo soporta 8 instrucciones. La siguiente tabla resume bien el lenguaje al completo (fuente):

Comando Brainfuck Equivalente en C
(Estado inicial) char array[infinitely large size]; char *ptr=array;
> ++ptr;
< ptr;
+ ++*ptr;
- –*ptr;
. putchar(*ptr);
, *ptr=getchar();
[ while (*ptr) {
] }

A pesar de ser otro lenguaje Turing completo, hasta el más elemental “Hello world!” es ininteligible:

++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.

4. LOLCODE: Ola K aze!

Esto ya se ha ido de madre: una especie de Pascal donde todas las palabras clave están escritas en la jerga del lenguaje usado habitualmente en memes de Internet:

HAI
CAN HAS STDIO?
I HAS A VAR
IM IN YR LOOP
UP VAR!!1
VISIBLE VAR
IZ VAR BIGGER THAN 10? KTHX
IM OUTTA YR LOOP
KTHXBYE

Por ejemplo, KTHXBYE significa: “OK, Thanks, bye!” Y sí, existe compilador.

5. Una única instrucción

Existen quienes van un paso más allá en simplificar su propuesta de máquina virtual: el extremo son las máquinas de una única intrucción. Obviamente, conseguir que dicho sistema sea Turing completo requiere pensar muy bien qué instrucción va a ser la elegida. Entre otras, una opción es la siguiente:

  • SBNZ a,b,c,d –> Restar dos valores y b, almacenar el resultado en c, y si el resultado no es cero saltar a una dirección de memoria d.

Los programas producidos por estas máquinas virtuales son extremadamente largos y engorrosos, como te podrás imaginar.

6. Piet

Bautizado en honor al pintor Piet Mondrian, los programas en Piet no se escriben: se dibujan con colores. De nuevo tenemos una máquina virtual que hace uso intensivo de almacenamiento en la pila y con un puntero de programa en 2D que se desplaza por el dibujo interpretando los distintos colores como instrucciones.

Piet

Programa que imprime “Hi!” por consola, con una traza del flujo del programa. Más explicaciones, si es que las necesitas con lo claro que está, aquí.

Una forma curiosa de enviar mensajes sencillos “codificados” en una imagen, aunque desde luego no serán tan discretas como otras técnicas avanzadas de estenografía. Existe un editor/programa de dibujo y un intérprete llamado npiet.

7. INTERCAL

De los lenguajes de programación creados “por hacer la coña”, INTERCAL puede considerarse el abuelo. Fue perpetrado en 1972 por dos estudiantes de Princeton, que sarcásticamente lo presentaron como: “Compiler Language With No Pronounceable Acronym, which is, for obvious reasons, abbreviated INTERCAL”. Se publicó como un manual en texto que describía toda la sintaxis, aunque posteriormente se han creado compiladores reales. Un clásico “Hello World!” se ve así en INTERCAL:

DO ,1 <- #13
PLEASE DO ,1 SUB #1 <- #238
DO ,1 SUB #2 <- #108
DO ,1 SUB #3 <- #112
DO ,1 SUB #4 <- #0
DO ,1 SUB #5 <- #64
DO ,1 SUB #6 <- #194
DO ,1 SUB #7 <- #48
PLEASE DO ,1 SUB #8 <- #22
DO ,1 SUB #9 <- #248
DO ,1 SUB #10 <- #168
DO ,1 SUB #11 <- #24
DO ,1 SUB #12 <- #16
DO ,1 SUB #13 <- #162
PLEASE READ OUT ,1
PLEASE GIVE UP

Quien no tenga problemas con el inglés, puede echar un vistazo a la completa página en Wikipedia, repleta de extractos de la especificación original del lenguaje donde se muestra el frikísimo sentido del humor de los creadores.

8. Velato

Garabatos, dibujos…  ¡nos faltaba la música! Velato es el (¿único?) lenguaje de programación basado en lenguaje musical: los programas se pueden escribir en partituras y se guardan como ficheros MIDI. Por supuesto, existe compilador.

a

Programa “Hello World!” en Velato (Fichero MIDI)

 

9. El submundo de las templates en C++

¡No! Yo nunca metería a mi querido C++ en la lista de lenguajes absurdos. Pero… hay que admitir que una vez abres la caja de Pandora de las templates (o plantillas), se accede a unas herramientas muy poderosas, a veces tanto como para redefinir el aspecto habitual de un programa en C++. Un ejemplo maravilloso de esto es esta librería que permite operar con dibujos de formas geométricas y sus propiedades geométricas:

#include"analogliterals.hpp"
using namespace analog_literals::symbols;
unsigned int c = ( o-----o
|     !
!     !
!     !
o-----o ).area;
assert( ( o-------------o
|L             \
| L             \
|  L             \
|   o-------------o
|   !             !
!   !             !
o   |             !
L  |             !
L |             !
L|             !
o-------------o ).volume == ( o-------------o
|             !
!             !
!             !
o-------------o ).area * int(I-------------I) );
analog_literals::rectangle<4, 2> r = o---------o
|         !
!         !
o---------o;

¿Añadiríais algún otro lenguaje a la lista? No dejes de comentar 😉

Publicado en Curiosidades, Programación