En general, que el futuro de la programación será (casi seguro) programación declarativa,
es algo que difícilmente puede negarse. Ya sólo la gestión eficiente
del flujo de eventos en una sencilla aplicación de escritorio puede dar
algún que otro quebradero de cabeza y si nuestros procesos consumen algo
de procesador, hacerlo eficiente para diversas condiciones (pocas o
muchas CPU, memoria, …) requiere paciencia y talento (una buena paralización no es “poner una tarea en cada núcleo”), aderecemos el plato con flujos sincronizados de datos a través de la red y disco y ya tenemos el “comerecursos” perfecto.
Parece que la programación imperativa es cada vez más costosa, mientras que la programación declarativa nos atrae cada vez más con sus cantos de sirena. Si te apetece, pensemos sobre ello en nuestra “programación imperativa vs declarativa” particular.
Los costes de la programación imperativa
Desde hace mucho tiempo me pregunto cómo es posible que en mi 8088 a 12 MHz con 512Kbytes de RAM
las aplicaciones corrieran maravillosamente (había aplicaciones muy
buenas, de editores de texto, suites ofimáticas más que aceptables y fue
esa época [hasta el 386] mi época dorada de los videojuegos). Hoy en
día es evidente que los ordenadores hacen muchas más cosas (eg. la
memoria de vídeo que tienen que gestionar es ahora 1920×1080×32 /
640×200×2 = 259.2 veces más que antes), pero la capacidad de cálculo se
ha multiplicado en muchas más veces; por ejemplo, la calidad de las
arquitecturas ahora es muchísimo mejor (a igual velocidad de reloj, los
procesadores actuales son decenas y centenas de veces más eficientes),
tienen tamaños de palabra 8 veces mayores (de 8bits a 64bits), los
compiladores generan código muchísimo más optimizado sobre algoritmos
más sofisticados (que antes no existían) y aún sin tener todo ésto en
cuenta, ahora la cantidad de proceso es 2×2500 MHz / 1×12MHz = 417 veces
más, pero es que resulta ¡que la CPU no renderiza, pues hay otra GPU
sólo para eso!. ¿Porqué entonces mi ordenador (¡para ver una simple
página web!) no va raudo como el rayo?, ¿por dónde se está yendo esa
capacidad de cálculo de mi ordenador?.
La respuesta la tenemos en “la complejidad combinada”, dicho rápidamente sería como que: “la complejidad total resultante, es mucho mayor que la suma de la complejidad de las partes”.
Por ejemplo, si tenemos que hacer un programa, solemos dividir grosso
modo, la funcionalidad total del programa en pequeñas partes que vamos
resolviendo individualmente. Así, resolvemos eficientemente las pequeñas
partes, pero al combinarlas, obtenemos soluciones ineficientes.
Por un lado, nosotros no somos capaces de abarcar una visión global
pero precisa simultáneamente del sistema y por otro, el compilador no
puede ayudarnos a suplir este problema. Así, todo problema (medianamente
complejo) que nosotros no seamos capaces de resolver, la programación imperativa tampoco lo conseguirá.
[...]
>>> Ver artículo original completo (se recomienda) en: http://www.genbetadev.com/
No hay comentarios:
Publicar un comentario