lunes, junio 14, 2010

Intérpretes y el arte de la programación, 2da Parte


It is no exaggeration to regard this as
the most fundamental idea in programming:
"The evaluator, which determines
the meaning of expressions in a
programming language,
is just another program"

Structure and Interpretation of Computer Programs
Abelson & Sussman, 1996



Continuación del tema sobre programación de computadoras, Intérpretes y el arte de estructurar. Esta entrada junto con la anterior (1ra parte) conforman un breve resumen y crónica sobre la idea fundamental de la programación de computadoras.

Revisaremos las estructuras: Analizador Sintáctico, Intérprete. Además de la programación funcional como herramienta habilitadora en la construcción de Analizadores Sintácticos (Parsers en inglés) que "navegan" a traves de gramáticas de lenguajes para descubrir la estructura inmersa en un texto cualquiera. La estructura del texto está definida por una Gramática. Una Gramática se utiliza para definir un Lenguaje y sobre-poner una estructura en cada Sentencia del Lenguaje (la gramática en si misma es una programa, ejecutado por un autómata que recorre las producciones gramaticales y también el texto del listado fuente siendo traducido). La función de "navegar" de un Analizador Sintáctico verifica que el texto obedece las convenciones sintácticas de la Gramática. Revisar estas estructuras virtuales es un paso necesario para continuar nuestro recorrido sobre Intérpretes y Virtual Machines partiendo ahora de los años 1970s. Uno de los ejemplos que utilizaremos se conecta directamente con la referencia que hicimos de FORTRAN en la 1ra Parte. Este tema es muy extenso y en la Internet y en las bibliotecas existe mucha literatura sobre él. Recomiendo entonces tomar estos escritos como punto inicial en una labor de investigación en la cual el lector descubrirá el gran espectro de aplicaciones que tienen hoy día y que tendrán en el futuro estas ideas fundamentales. También, al igual que en la 1ra parte, haremos referencia a varios textos de estudio.


Sección del listado fuente de EULER, la cual representa al Intérprete para la ejecución del P-Code generado por compilador [1]. Wirth nunca más abandonó este método de escribir a cerca de un lenguaje X incluyendo dentro del mismo texto/documento el listado fuente de un Compilador e Intérprete para la traducción del lenguaje X. Documentos como este de Wirth, escritos durante la década de 1960, sembraron la semilla para la portabilidad y método de distribución de lenguajes de 3ra generación que proliferaron durante la década de 1970 (Tiny Basic, SmallTalk y otros).

Muestra del clásico ejemplo las Torres de Hanoi escrito en el lenguaje Pascal. La siguiente figura muestra la traducción hecha por el compilador Pascal-F. El traductor o Compilador Pascal-F recibía de entrada un listado fuente en lenguaje Pascal y producía en su salida un listado fuente en F-Code. Este listado fuente en F-Code es Fortran puro y podía ser traducido a su vez por cualquier compilador Fortran de la época [2] . Este método (de utilizar un lenguaje de alto nivel como lenguaje Assembler, aprovechando la difusión de tal lenguaje para asegurar la portabilidad) continuó apareciendo en las siguientes décadas a 1970s. La primera referencia bibliográfica de este método la encontré en el libro "Compiler Design in C" por Allen I. Holub (1990). Posterior a esta publicación existe el trabajo titulado "C--: A portable Assembly Language" por Peyton Jones, Nordin, Oliva (1997). Este último trabajo es en parte una crítica a la utilización del lenguaje C como Assembler.


Un punto muy importante a tomar en cuenta: el Compilador diseñado por Manning estaba escrito en lenguaje Pascal, de tal manera que su listado fuente pudiera ser compilado por otra instancia del mismo compilador ya existente en la instalación destino (un Compilador Pascal traduciendo el listado fuente del mismo Compilador). Aquí aparece nuevamente la idea fundamental expresada por los profesores Abelson y Sussman en su libro: “el evaluador o programa que traduce un programa, es en sí mismo otro programa”. Esta idea fundamental permitió el transporte y la reproducción) de compiladores y lenguajes de una plataforma computacional a otra. La siguiente imagen muestra esta idea fundamental de un evaluador (traductor) construyendo otra instancia de si mismo ("Drawing Hands" - Maurits Cornelis Escher, 1948)



El Sistema Operacional UNIX es otro ejemplo de la aplicación de la tendencia hacia la Portabilidad que nació entre los años 1967 y 1971. Los creadores del UNIX escribieron los listados fuente en el lenguaje Assembler para la computadora DEC PDP-7 localizada en Bell Laboratories para el año 1968 [3]. Posteriormente, en 1973, los listados fuente fueron re-escritos en un lenguaje llamado C [3]. Es de suponer que el ejemplo que Niklaus Wirth dio en 1965 con el lenguaje EULER motivó el uso del método de escribir Compiladores e Intérpretes (e incluso Sistemas Operacionales como en este caso de UNIX) utilizando un lenguaje X para traducir el mismo lenguaje X.

Otro punto fundamental que revisaremos es la abstracción en la programación. Segun el texto de Abelson y Sussman, existen tres mecanismos para la construcción de ideas complejas a partir de ideas básicas [4]:

* Expresiones primitivas, las cuales representan las entidades más simples del lenguaje de programación.
* Formas de combinación, mediante las cuales se sintetizan elementos compuestos a partir de las entidades más simples.
* Formas de abstracción, mediante las cuales se asignan nombres a los elementos compuestos para luego poder ser manipulados como entidades simples. Este mecanismo de abstracción es fundamental en lenguajes como C++, C#, OBERON, Scheme, Java.

-------------------------------------------------------------------------------

[1] Wirth y Amp - Euler: A generalization of Algol, and its Formal Definition – 1965
[2] Joseph Manning - PASCAL-F : A Portable FORTRAN-Based PASCAL Compiler - 1981
[3] Kernighan y Pike - The Unix Programming Environment – 1984
[4] Abelson y Sussman - Structure and Interpretation of Computer Programs - 1996