El futuro de la tecnología está en la programación funcional, así que ve desempolvando tus libros y apuntes

Gracias @espencer, nuestro gran «early adopter» del development, llegué a un artículo del «Tío Bob» (te dejo la entrevista que le hice hace un tiempo) de esos que te deja pensando un buen rato.
El artículo expone por qué el futuro de tecnología puede pasar por los lenguajes de programación funcionales (como Haskell, F# o Clojure), frente a los imperativos (Java, C, etc.).

Lo que le contaría a Dijkstra. La columna de los jueves.

Y voy a intentar explicados el porqué, de la manera más sencilla y divulgativa que me sea posible, a sabiendas de que, por lo arduo del tema, la tarea es compleja.
Vamos allá.
Los lenguajes de programación que usamos normalmente son imperativos, es decir, cuando programas vas diciendo lo que el programa debe hacer, le vas dando ordenes. Por ejemplo, «implementar un programa que calcule el cuadrado de los 25 primeros números enteros», en Java (imperativo) vendría a ser algo así como:
for (int i=1; i<=25; i++)
System.out.println(i*i); 
Pero en Clojure (un lenguaje de programación funcional) sería algo como:
(take 25 (squares-of (integers)))
Hasta aquí bien. Ahora viene lo que nos interesa.
Observa que en el anterior no hay variables. ¿Qué sucede entonces en la memoria del ordenador? Las posiciones de memoria se inicializan sólo cuando el programa las utiliza, y luego conservan sus valores, sin cambios, durante el resto de la ejecución del programa. Ningún nuevo valor se asigna a esas posiciones de memoria. Ninguna variable, una vez inicializada, puede cambiar nunca de valor.

¿Por qué es todo esto tan importante para el futuro de la tecnología?

Si estás leyendo este post en tu portátil, y es medio decente, seguramente su procesador tenga 4 núcleos. Los de hace unos años tenían 2 núcleos. Y mucho tiempo atrás sólo un núcleo. Seguramente, los siguientes tendrán 8 núcleos, y después 16, 32, etc.
La frecuencia de reloj de los ordenadores (los ciclos de procesador) ya no pueden ir mucho más rápido. Han estado doblando velocidad durante años, pero están llegando a un punto en que la velocidad no puede incrementarse más. Así que los ingenieros de hardware, en un esfuerzo para darnos más y más ciclos por segundo, recurrieron a lo de añadir más procesadores a nuestros chips, y aquí no parece haber fin, no hay un límite de cuantos procesadores podrán añadir.
Y llegado este punto ¿cómo vamos a aprovechar cada ciclo de procesador cuando tengamos 4096 núcleos? ¿16384 procesadores compitiendo por el mismo bus de memoria? ¿Sitios web ágiles y flexibles con sus modelos, vistas y controladores compartiendo 65536 procesadores?
Como comenta el tío Bob, ya es difícil hacer cooperar a dos hilos (Threads) en Java. Y hilos son comida para niños en comparación con procesadores reales que luchan por el bus.
Esto es lo que se llama simultaneidad, y para tratar con ella hay que olvidar las asignaciones a variables. Si el valor de una posición de memoria, una vez inicializada, no cambia durante el curso de la ejecución de un programa, entonces los 131072 procesadores no tienen que competir.
No necesitas semáforos. Y no hay efectos secundarios… y ahí está la clave de los lenguajes funcionales, que resuelven muy fácilmente este problema.
El tren de la programación multi-core se acerca, y es mejor estar listos para cuando llegue. De ahí, todos los nuevos lenguajes funcionales que aparecen como Scala, F# y Clojure. Y de que se vuelva a hablar de los lenguajes antiguos, como Erlang, Haskell, ML y otros.

Algo más…

Si quieres empezar a jugar con lenguajes funcionales, yo he estado trasteando con Haskell en esta web, que tiene un IDE online.
Como siempre, difunde el conocimiento, tuitea, envía, comenta, etc.