H. Hernan Moraldo - personal archive
home about faq contact website

Cuando todos los caminos conducen al Assembler...

Dated: lunes, agosto 15, 2005

(From H. Hernán Moraldo's personal blog)

La tradición en el arte, la técnica y la ciencia transmite, por todos los medios disponibles, conceptos que son premisas para la comunicación entre los individuos que participan de las diferentes áreas del saber humano. Esas premisas se toman en general como verdaderas sin mayor discusión, aún cuando con el tiempo se lleguen a desarrollar poderosas razones para dudar de las mismas.

El programador que ve los lenguajes progresar a través de los diferentes paradigmas, en general vive ese proceso con una mentalidad de transformación: siendo que todos los lenguajes de programación permiten básicamente construir los mismos programas, los nuevos lenguajes de programación se pueden comprender como una construcción sobre los anteriores.

Así, cada lenguaje de programación se puede comprender en términos de uno perteneciente a una generación anterior, y usualmente de más bajo nivel; esto genera una escalera, un camino, que para cada lenguaje parece llevar finalmente a la Roma del desarrollador: el lenguaje Assembler primero, y luego el código máquina.

Parece ser, bajo estos términos, que la única verdad de todos los lenguajes es en realidad el Assembler, y que todo lo demás es apenas maquillaje colocado sobre los originales fierros, para ocultar sus mecanismos a aquellos que no tienen el coraje requerido para comprenderlos, y hacer uso de ellos.

Este razonamiento es ya una tradición en el mundo de la programación, una tradición que alimenta la idea de que la verdad sucede en los fierros de la computadora, y que un programador inteligente sólo puede aceptar tomar un lenguaje de más alto nivel cuando ya no queda la posibilidad de seguir siendo productivo con el mismo. Y todos los programadores de esta línea de pensamiento suelen pensar que volver a los días del Assembler sería un gran acontecimiento, porque sólo en aquellos tiempos los programadores eran programadores, mientras que ahora son otra cosa, tipejos hablando de objetos y conceptos falsos, que no suceden en la máquina, que no están en la máquina, y que por tanto son una mentira creada para su satisfacción.

Creo que esta visión fierrera de la computación es una visión simplista e ingenua. El Assembler no está mas cerca de ser la base de la programación que C por ejemplo, y de hecho ambos son lenguajes pobres en su capacidad de expresar con ingenioso diseño los algoritmos construidos en los mismos.

Si lo pensamos, todo lo que hay en nuestra computadora es una cantidad brutal de átomos y partículas varias en constante movimiento, de las que si nos abstenemos de mayores especulaciones apenas podemos decir que describen la transformación de un sólo número enorme. La computadora es finalmente, una máquina de estado finito gigantesca, que pasa de un número enorme a otro número enorme, y que lo hace así de manera permanente.

Ya ésta es una interpretación sobre un suceso físico, que requiere una cierta abstracción con respecto al mismo. Pasar a explicar esos números enormes en términos de comandos de código máquina requeriría un nuevo y gigantesco salto de abstracción. Que es sin embargo arbitrario y no nos da pauta de por qué es que resulta necesario, o más necesario por ejemplo que un salto de abstracción más grande que nos permita hablar, ya no de Assembler, sino por ejemplo de C, o de C++.

Sin embargo, cuando nosotros programamos, no es esa masa de bytes la que nos preocupa, ni el Assembler ni el C... en realidad lo que estamos haciendo es llevar a la realidad un concepto que es verdadero en nuestras mentes: un algoritmo abstracto, que en nuestra cotidiana tarea de desarrolladores instanciamos en un formato arbitrario (llámese ASM, C, Basic, código máquina o números con enormes cantidades de dígitos).

Ese algoritmo abstracto es lo único verdadero en nuestra tarea de programadores, y de hecho esto verdadero se vuelve de una realidad menor cuando lo llevamos al mundo concreto: porque en nuestro mundo físico de ninguna cosa se puede garantizar su correcto funcionamiento, y además por cierto porque nuestra implementación suele ser ligeramente errónea, con pequeños bugs y diferencias que hacen que nuestro programa físico no tenga una verdadera correspondencia con el algoritmo original en nuestras mentes.

Desarrollo esta idea para mostrar mi punto, que hay más vida luego de los lenguajes de bajo nivel, y que esa vida es de hecho más real, y más interesante que su equivalente en el bajo nivel. Porque los lenguajes de más alto nivel, lejos de ser burdas construcciones sobre anteriores paradigmas, representan en realidad en cada ocasión un paso hacia la más adecuada representación de los conceptos que se encuentran en nuestra mente. Los lenguajes de programación son en definitiva herramientas humanas para la expresión de ideas, y sólo podrían considerarse completos y verdaderos si permitieran expresar con absoluta precisión lo que nos resulta más cercano y oculto de todo: nuestro propio pensamiento, nuestro propio entramado de ideas.

Así, los lenguajes en su continuo avance histórico, no se alejan del ideal del Assembler, sino que por el contrario avanzan hacia el ideal de la perfecta comunicación del pensamiento humano.

¿De qué lenguajes, de los que conocemos, podemos decir entonces que son más verdaderos, que son más puros en el desempeño de su función primordial? Creo que podemos pensar en esos términos sólo de los lenguajes que representan más fielmente a paradigmas abstractos. Y comparando paradigmas, veo al paradigma de objetos como un modesto progreso sobre el paradigma procedural, mientras que veo a los lenguajes lógicos y funcionales mucho más cerca del objetivo, por estar basados en la muy amada ciencia matemática.

¿Y qué con la matemática? Sucede que la matemática es el mejor lenguaje que conoce el hombre para la expresión de ideas abstractas, y esto lo hace ideal para el cumplimiento de esta tarea. Vale la pena recordar que más de una teoría apunta que esto sucede no tanto porque la matemática está más cerca de parecerse a la estructura de los objetos abstractos que existen en el mundo (y que buscamos comunicar), sino porque la matemática está más cerca de parecerse a la estructura de nuestra propia mente, que es en realidad (bajo esta concepción) la que da creación a esos objetos abstractos en primer lugar.



Interesting feedback:



Nahuel said:

Hace mucho que no encuentro a los assemblerianos que mencionas, supongo que se fueron extinguiendo :)
IMHO, lo que hay en el fondo del tema de los lenguajes de programacion son dos fuerzas involucradas sobre como representar conocimiento. Por un lado el conocimiento plasmado debe ser tratable algoritmicamente (*), y por el otro debe facilitar la comprension del humano y servir como medio de comunicacion de ideas, modelos.
Otras fuerzas intervienen tambien, como facilitar reuso, etc.
Creo que es _extremadamente_ interesante investigar lo que se desarrollo sobre "knowledge representation" como tal (ontologias, etc), que quizas no esta tratado como "lenguaje de programacion" en si, pero que en futuro creo q va a tener muchisimo peso.
Veo en el desarrollo de los lenguajes 3 lineas principales (obviamente, hay influencias reciprocas, etc, no se puede hacer una separacion estricta). La primera es una linea practica (asm, C, etc). La segunda seria una linea purista, academicista, formalista, matematica (scheme, haskell hasta donde se, etc). Y la otra esta desarrollada a partir de estudiar los mecanismos cognitivos humanos (el laburo de Alan Kay).
Me parece mas interesante la ultima de esas lineas, que en realidad terminaria englobando a las otras.
(pasar a ontologias programas OO, etc, y fijarse como quedan para darse cuenta)
(*) Con esto no me refiero a que tienen que poder expresar algoritmos (obviamente eso si), sino que tiene que ser una representacion capaz de ser tratada algoritmicamente. Por ej, tenemos una representacion de conocimiento poderosisima que es el lenguaje natural, pero no podemos programar con el porque no sabemos tratarlo de manera q a la maquina "le sirva". En cambio si hacemos un DSL en Lisp de manera de poder describir de forma declarativa, por ej, DSP's, y que a partir de ahi se generen, ese lenguaje si es "tratable".
El desarrollo del campo de la representacion del conocimiento no va a dar lugar simplemente a "programar mas rapido", sino que creo que va a ser bastante mas revolucionario.

Reply:

Sobre assemblerianos: creo que está lleno de programadores que ven cada nuevo lenguaje como un poco menos serio, menos importante y profesional que el anterior. Deberías ver los foros de Adva más seguido (a veces se vuelve al C vs. C++, C++ versus Java, y muchas veces el argumento es el tipico del macho-programmer).
Muy interesante tu división en tres líneas principales, no sabía que la objetosa venía por un lado ontológico. Y es muy interesante que así sea, voy a meterme un poco más en tema porque parece interesante.



In categories: All Spanish Programming Philosophy Mathematics BlogPosts 2005




Copyright 2000-2008 by Horacio Hernán Moraldo
All rights reserved