Conceptos de Compiladores e Intérpretes
A
PUNTE DE
C
ÁTEDRA
SSL
–
2021
–
G
IRÓ
,
V
ÁZQUEZ
,
M
ELONI
,
C
ONSTABLE
1
Consideraciones generales
Los compiladores son citados y descriptos en numerosas oportunidades a lo largo de este libro.
En el Capítulo 1, son presentados como una de las más importantes aplicaciones de las máquinas
abstractas (Construcción de compiladores). En el Capítulo 2, se hace referencia a la contribución
de Noam Chomsky al desarrollo de lenguajes de programación de alto nivel (Gramáticas
formales); en el Capítulo 4, se presentan los analizadores léxicos (Gramáticas regulares y
autómatas finitos); en el Capítulo 5, se presentan los analizadores sintácticos (Autómatas con pila
asociados a una gramática) y, finalmente, el Capítulo 8 está destinado a una introducción a la
Semántica de Lenguajes. A pesar de ello, se considera aún necesario incluir una presentación
conjunta de los conceptos generales referidos a los compiladores y ese es el motivo de este
Apéndice A.
Lo expresado evidencia la importancia que se le reconoce a los compiladores y esto merece
ser comentado. El proceso de desarrollo de software incluye numerosas etapas, desde la
especificación de los requerimientos del sistema hasta su puesta en servicio y el posterior
mantenimiento, pasando por las etapas de análisis, diseño, programación, verificación, integración
y validación, por citar las más importantes. Son todas etapas fundamentales en la construcción de
buen software y en todas ellas se utilizan, cada vez en mayor medida, herramientas específicas.
Sin embargo, en este proceso, hay una etapa que es central, ya que en ella se construye el
producto software (programación). Para ello, se utiliza una herramienta, considerada principal, que
es la que hace que esta tarea sea posible (el compilador). En efecto, el compilador permite utilizar
lenguajes de alto poder expresivo, incluyendo el lenguaje visual, y su misión es convertir estos
programas a un lenguaje compatible con el hardware, que es el encargado de ejecutarlos.
En resumen, el compilador es una herramienta de desarrollo de software destinada a traducir
un programa escrito en un lenguaje de alto nivel (programa fuente) en otro programa escrito en
lenguaje máquina (programa objeto). Nótese que, por el diferente poder expresivo de ambos
lenguajes, se enfatiza que se trata de una traducción o conversión que requiere una valoración
semántica y no de una mera traducción literal.
Resulta difícil aceptar que no hace mucho, apenas unas décadas atrás, los computadores
debían ser programados con códigos binarios que representaban las instrucciones individuales
reconocidas por la unidad central de proceso. Estos eran los denominados “Lenguajes de Primera
Generación” y su utilización era difícil, problemática y muy susceptible a errores. Además, el
mantenimiento de los programas escritos en tales lenguajes era una tarea tremendamente ardua y
costosa.
Posteriormente, el código de máquina fue reemplazado por nombres simbólicos o
“abreviaturas nemónicas”, dando lugar así a los “Lenguajes de Segunda Generación” o
“Lenguajes ensambladores”. Se comenzó a observar una incipiente tendencia hacia la
estructuración de los programas y el uso de estas abreviaturas nemónicas facilitaban el uso de las
instrucciones y el mantenimiento de los programas. Sin embargo, se mantenían las dificultades
propias de lenguajes tan elementales, como son la fuerte dependencia de la máquina y la
necesidad de muy profundos conocimientos de su arquitectura. En síntesis, la programación con
tales lenguajes continuaba siendo una tarea artesanal reservada para un selecto grupo de
especialistas.
Para sustituir a los lenguajes ensambladores se crearon los “Lenguajes de Tercera
Generación” o “Lenguajes de alto nivel”. Estos lenguajes permitieron alcanzar un mayor nivel de
abstracción, apropiado para la especificación de datos, funciones y su control, todo ello en forma
independiente de la máquina. También hicieron posible una rápida evolución de la programación
con la incorporación de técnicas orientadas a la obtención de menores tiempos de desarrollo y
mayor claridad en el código. Así, progresivamente, se impusieron nuevos conceptos, tales como
los de programación estructurada, diseño modular, programación orientada a objetos,
programación visual, etcétera.
Al hacerse una referencia cronológica a estos Lenguajes de alto nivel debe comenzarse por
el Fortran (
For
mula
Tran
slation) que fue presentado a mediados de los años cincuenta y luego
estandarizado en sucesivas oportunidades (Fortran IV, Fortran 66, Fortran 77 y Fortran 90). La