Está en la página 1de 6

12 CAP�TULO 1.

INTRODUCCI�N

1.2.9 Herramientas de construcci�n del compilador

El escritor del compilador, como cualquier desarrollador de software, puede usar de


manera rentable entornos de desarrollo de software modernos que contienen
herramientas como editores de idiomas, depuradores, administradores de versiones,
perfiladores, pruebas de prueba, etc. Adem�s de estas herramientas generales de
desarrollo de software, se han creado otras herramientas m�s especializadas para
ayudar a implementar varias fases de un compilador.
Estas herramientas utilizan lenguajes especializados para especificar e implementar
componentes espec�ficos, y muchos utilizan algoritmos bastante sofisticados. Las
herramientas m�s exitosas son aquellas que ocultan los detalles del algoritmo de
generaci�n y producen componentes que pueden integrarse f�cilmente en el resto del
compilador. Algunas herramientas de construcci�n compiler com�nmente utilizadas
incluyen

1. Generadores de par�metros de an�lisis que producen autom�ticamente analizadores


de sintaxis a partir de una descripci�n universal de un lenguaje de programaci�n.

2. Generadores de esc�ner que producen analizadores l�xicos a partir de expresiones


regulares.
si�n descripci�n de los tokens de una lengua,

3. Eslatinas de translatiotis dirigidas por sintaxis que producen colecciones de


rutinas para recorrer un �rbol de an�lisis y generar un c�digo intermedio.

4. Qeneraiors generadores de c�digo que producen un generador de c�digos a partir


de una colecci�n de reglas para traducir cada operaci�n del lenguaje intermedio al
lenguaje de m�quina para una m�quina de destino.

5. Los motores de an�lisis de flujo de datos que facilitan la recopilaci�n de


informaci�n sobre c�mo se transmiten los valores de una parte de un programa a
otro. El an�lisis de flujo de datos es una parte clave de la optimizaci�n del
c�digo.

6. Herramientas de construcci�n de compiladores que proporcionan un conjunto


integrado de rutinas para construir varias fases de un compilador.

Describiremos muchas de estas herramientas a lo largo de este libro.

1.3 La evoluci�n de los lenguajes de programaci�n.

Las primeras computadoras electr�nicas aparecieron en la d�cada de 1940 y fueron


programadas en lenguaje masculino por secuencias de O y L que expl�citamente le
dijeron a la computadora qu� operaciones ejecutar y en qu� orden. Las operaciones
en s� mismas eran de muy bajo nivel: mover datos de una ubicaci�n a otra, agregar
el contenido de dos registros, comparar dos valores, y as� sucesivamente. No hace
falta decir que este tipo de programaci�n era lenta, tediosa y propensa a errores.
Y una vez escritos, los programas eran dif�ciles de entender y modificar.
1.3. LA EVOLUCI�N DE LAS LENGUAS DE PROGRAMACI�N 13

1.3.1 El movimiento a lenguajes de nivel superior

El primer paso hacia lenguajes de programaci�n m�s amigables con las personas fue
el desarrollo de lenguajes de ensamblaje mnem�nicos a principios de los a�os
cincuenta. Inicialmente, las instrucciones en un lenguaje ensamblador eran
simplemente representaciones mnem�nicas de instrucciones de m�quina. M�s tarde, se
agregaron instrucciones de macros a los lenguajes de ensamblaje para que un
programador pudiera definir taquigraf�as pararr�eterizadas para secuencias de
instrucciones de m�quina de uso frecuente.
En la segunda mitad de la d�cada de 1950 se dio un paso importante hacia los
idiomas de mayor nivel con el desarrollo de Fortran para computaci�n cient�fica,
Cobol para procesamiento de datos comerciales y Lisp para computaci�n simb�lica. La
filosof�a detr�s de estos lenguajes fue crear notaciones de nivel superior con las
cuales los programadores podr�an escribir m�s f�cilmente c�lculos num�ricos,
aplicaciones comerciales y programas simb�licos. Estos idiomas fueron tan exitosos
que todav�a est�n en uso hoy en d�a.
En las siguientes d�cadas, se crearon muchos m�s lenguajes con caracter�sticas
innovadoras para ayudar a hacer la programaci�n m�s f�cil, m�s natural y m�s
robusto. M�s adelante en este cap�tulo, analizaremos algunas caracter�sticas clave
que son comunes a muchos lenguajes de programaci�n modernos.
Hoy en d�a, hay miles de lenguajes de programaci�n. Se pueden clasificar de varias
maneras. Una clasificaci�n es por generaci�n. Los lenguajes de primera generaci�n
son los lenguajes de m�quina, los lenguajes de ensamblaje de segunda generaci�n y
los lenguajes de nivel superior de tercera generaci�n como Fortran, Cobol, Lisp, C,
C ++, C # y Java. Los lenguajes de cuarta generaci�n son lenguajes dise�ados para
aplicaciones espec�ficas como NOMAD para la generaci�n de informes, SQL para
consultas de bases de datos y Postscript para el formato de texto. El t�rmino
lenguaje de quinta generaci�n se ha aplicado a lenguajes basados ??en l�gica y
restricciones como Prolog y OPS5.
Otra clasificaci�n de idiomas usa el t�rmino imperatioe para los idiomas en los que
un programa especifica c�mo se debe realizar un c�mputo y la declaraci�n para los
idiomas en los que un programa especifica qu� c�mputo se debe hacer. Los lenguajes
como C, C ++, C # y Java son lenguajes imperativos. En los lenguajes imperativos
hay una noci�n de estado de programa y declaraciones que cambian el estado. Los
lenguajes funcionales como ML y Haskell y los lenguajes de l�gica de restricci�n
como Prolog se suelen considerar lenguajes declarativos.
El t�rmino lenguaje non N eumann se aplica a los lenguajes de programaci�n cuyo
modelo computacional se basa en la arquitectura de computadora de von Neumann.
Muchos de los idiomas actuales, como Fortran y C, son idiomas de von Neumann.
Un lenguaje orientado a objetos es uno que admite la programaci�n de objetos
orientados a objetos, un estilo de programaci�n en el que un programa consiste en
una colecci�n de objetos que interact�an entre s�. Simula 67 y Smalltalk son los
primeros lenguajes principales orientados a objetos. Los lenguajes como C ++, C #,
Java y Ruby son lenguajes orientados a objetos m�s recientes.
Los lenguajes de script son lenguajes interpretados con operadores de alto nivel de
firmado para "pegar juntos" los c�lculos. Estos c�lculos fueron originalmente
14 CAP�TULO 1. INTRODUCCI�N

llamados "scripts". Awk, JavaScript, Perl, PHP, Python, Ruby y Tcl son ejemplos
populares de lenguajes de scripting. Los programas escritos en script�ng.languagss
suelen ser mucho m�s cortos que los programas equivalentes escritos en lenguajes
como C.I
1.3.2 Impactos en los compiladores

Dado que el dise�o de los lenguajes de programaci�n y los compiladores est�n


�ntimamente relacionados, los avances en los lenguajes de programaci�n imponen
nuevas demandas a los escritores de compiladores. Tuvieron que dise�ar algoritmos y
representaciones para traducir y admitir las nuevas caracter�sticas del idioma.
Desde la d�cada de 1940, la arquitectura inform�tica tambi�n ha evolucionado. Los
compiladores del compilador no solo ten�an que rastrear las nuevas caracter�sticas
del lenguaje, sino que tambi�n ten�an que dise�ar algoritmos de traducci�n que
aprovecharan al m�ximo las nuevas capacidades de hardware.
Los compiladores pueden ayudar a promover el uso de idiomas de alto nivel al
minimizar la sobrecarga de ejecuci�n de los programas escritos en estos idiomas.
Los compiladores tambi�n son cr�ticos para hacer que las arquitecturas de
computadora de alto rendimiento sean efectivas en las aplicaciones de los usuarios.
De hecho, el rendimiento de un sistema inform�tico depende tanto de la tecnolog�a
de compilaci�n que los compiladores se utilizan como una herramienta para evaluar
conceptos arquitect�nicos antes de que se construya una computadora.
La compilaci�n de la escritura es un reto. Un compilador en s� mismo es un programa
largo. Adem�s, muchos sistemas modernos de procesamiento de lenguaje manejan varios
lenguajes de origen y m�quinas de destino dentro del mismo marco; es decir, sirven
como colecciones de compiladores, que consisten posiblemente en millones de l�neas
de codeo Con, las buenas t�cnicas de ingenier�a de software son esenciales para
crear y desarrollar procesadores de lenguaje modernos.
Un compilador debe traducir correctamente el conjunto de programas potencialmente
infinito que podr�a escribirse en el idioma de origen. El problema de generar el
c�digo objetivo �ptimo desde un programa de origen es indecidible en general; por
lo tanto, los escritores de compiladores deben evaluar las compensaciones sobre qu�
problemas abordar y qu� heur�sticas utilizar para abordar el problema de generar un
c�digo eficiente.
Un estudio de compiladores es tambi�n un estudio de c�mo la teor�a cumple con la
pr�ctica, como veremos en la Secci�n 1.4.
El prop�sito de este texto es ense�ar la metodolog�a y las ideas fundamentales.
utilizado en el dise�o del compilador No es la intenci�n de este texto ense�ar a
todos los algoritmos y t�cnicas que podr�an usarse para construir un sistema de
procesamiento de lenguaje de vanguardia. Sin embargo, los lectores de este texto
adquirir�n el conocimiento y la comprensi�n b�sicos para aprender a construir un
compilador de forma relativamente sencilla.

1.3.3 Ejercicios para la Secci�n 1.3

Ejercicio 1.3.1: Indique cu�l de los siguientes t�rminos:

a) imperativo
d) orientado a objetos
g) de cuarta generaci�n
b) declaraci�n e) funcional
h) scripting
c) von Neumann
f) tercera generaci�n
1.4. LA CIENCIA DE CONSTRUIR A ~ COA1PILER 15

Aplica a cual de los siguientes idiomas:

1) C
6) Lisp
2) C ++
7) ML
3) Cobol
8) Perl
4) Fortran
9) Python
5) Java
10) VB.

1.4 La ciencia de construir un compilador

El dise�o del compilador est� lleno de hermosos ejemplos en los que los problemas
complejos del mundo real se resuelven abstrayendo la esencia del problema
matem�ticamente. Estos sirven como excelentes ilustraciones de c�mo se pueden usar
las abstracciones para resolver problemas: tomar un problema, formular una
abstracci�n matem�tica que capture las caracter�sticas clave y resolverlo
utilizando t�cnicas matem�ticas. La formulaci�n del problema debe basarse en una
comprensi�n s�lida de las caracter�sticas. del programa inform�tico, y la soluci�n
debe ser validada y refinada emp�ricamente.
Un compilador debe aceptar todos los programas de origen que se ajusten a la
especificaci�n del lenguaje; el conjunto de programas de origen es infinito y
cualquier programa puede ser muy largo, posiblemente con millones de l�neas de
c�digo. Cualquier transformaci�n realizada por el compilador mientras traduce un
programa de origen debe preservar el significado del programa que se est�
compilando. Por lo tanto, los compiladores de compiladores tienen influencia no
solo en los compiladores que crean, sino en todos los programas que compilan sus
apiladores de ma�z. Sin embargo, tambi�n hace que el desarrollo del compilador sea
un desaf�o.

1.4.1 Modelado en el dise�o e implementaci�n de compiladores

El estudio de compiladores es principalmente un estudio de c�mo dise�amos el modo


matem�tico correcto y elegimos los algoritmos correctos, al mismo tiempo que
equilibramos la necesidad de generosidad y potencia con la simplicidad y la
eficiencia.
Algunos de los modelos m�s fundamentales son las m�quinas de estado finito y las
expresiones regulares, que veremos en el Cap�tulo 3. Estos modelos son �tiles para
describir las unidades l�xicas de programa (palabras clave, identificadores y
dem�s) y para describir los algoritmos utilizados por compilador para reconocer
esas unidades. Tambi�n se encuentran entre los modelos m�s fundamentales las
gram�ticas libres de contornos, que se utilizan para describir la estructura
sint�ctica de los lenguajes de programaci�n, como el anidamiento de par�ntesis o
construcciones de control. Estudiaremos las gram�ticas en el Cap�tulo 4. De manera
similar, los �rboles son un modelo importante para representar la estructura de los
programas y su traducci�n en c�digo objeto, como veremos en el Cap�tulo 5.

1.4.2 La ciencia de la optimizaci�n del c�digo

El t�rmino "optimizaci�n" en el dise�o del compilador se refiere a los intentos que


hace un com piler para producir un c�digo que sea m�s eficiente que el c�digo
obvio. "Op tim�zation" es, por lo tanto, un nombre inapropiado, ya que no hay forma
de garantizar que el c�digo producido por un compilador sea tan r�pido o m�s r�pido
que cualquier otro c�digo que realice la misma tarea.
16 CAP�TULO 1. INTRODUCCI�N

En los tiempos modernos, la optimizaci�n del c�digo que realiza un compilador se ha


vuelto m�s importante y m�s compleja. Es m�s compleja porque las arquitecturas de
los procesadores se han vuelto m�s complejas, dando m�s oportunidades para mejorar
la forma en que se ejecuta el c�digo. Es m�s importante porque las computadoras par
alel masivamente requieren una optimizaci�n sustancial, o su rendimiento se ve
afectado por �rdenes de magnitud. Con la probable prevalencia de m�quinas
multin�cleo (computadoras con chips que tienen una gran cantidad de procesadores),
todos los compiladores deber�n enfrentar el problema de aprovechar las m�quinas
multiprocesador.
Es dif�cil, si no imposible, construir un compilador robusto a partir de "hacks".
Por lo tanto, se ha desarrollado una teor�a extensa y �til sobre el problema de la
optimizaci�n del c�digo. El uso de una base matem�tica rigurosa nos permite
demostrar que una optimizaci�n es correcta y que produce el efecto deseable para
todas las entradas posibles. Veremos, comenzando en el Cap�tulo 9, c�mo modelos
como gr�ficos, matrices y programas lineales son necesarios para que el compilador
produzca un c�digo bien optimizado.
Por otro lado, la teor�a pura por s� sola es insuficiente. Como muchos problemas
del mundo real, no hay respuestas perfectas. De hecho, la mayor�a de las preguntas
que hacemos en la optimizaci�n del compilador son indecibles. Una de las
habilidades m�s importantes en el dise�o de compiladores es la capacidad de
formular el problema correcto para resolver. Necesitamos una buena comprensi�n del
comportamiento de los programas para comenzar, y una experimentaci�n y evaluaci�n
exhaustivas para validar nuestras intuiciones.
Las optimizaciones del compilador deben cumplir los siguientes objetivos de dise�o:

� La optimizaci�n debe ser correcta, es decir, preservar el significado del


programa compilado,

� La optimizaci�n debe mejorar el rendimiento de muchos programas,

� El tiempo de compilaci�n debe mantenerse razonable, y

� El esfuerzo de ingenier�a requerido debe ser manejable.

Es imposible exagerar la importancia de la correcci�n. �Es trivial escribir un


compilador que genere c�digo r�pido si el c�digo generado no necesita ser correcto!
La optimizaci�n de los compiladores es tan dif�cil de acertar que nos atrevemos a
decir que la optimizaci�n del compilador no est� completamente libre de errores.
Por lo tanto, el objetivo m�s importante al escribir un compilador es que es
correcto.
El segundo objetivo es que el compilador debe ser eficaz para mejorar el
rendimiento de muchos programas de entrada. Normalmente, el rendimiento significa
la velocidad de ejecuci�n del programa. Especialmente en aplicaciones integradas,
tambi�n podemos desear minimizar el tama�o del c�digo generado. Y en el caso de
dispositivos m�viles, tambi�n es deseable que el c�digo minimice el consumo de
energ�a. Por lo general, las mismas optimizaciones que aumentaron el tiempo de
ejecuci�n tambi�n ahorran energ�a. Adem�s del rendimiento, tambi�n son importantes
los aspectos de usabilidad como el informe de errores y la depuraci�n.
En tercer lugar, debemos mantener el tiempo de compilaci�n corto para apoyar un
desarrollo r�pido
Ciclo de depuraci�n y depuraci�n. Este requisito se ha vuelto m�s f�cil de cumplir
como
1.5. APLICACIONES DE LA TECNOLOG�A DEL COMPILADOR 17

las m�quinas se vuelven m�s r�pidas, a menudo, un programa se desarrolla y depura


primero sin optimizaciones de programas. No solo se reduce el tiempo de
compilaci�n, sino que, lo que es m�s importante, los programas no optimizados son
m�s f�ciles de depurar, porque las optimizaciones introducidas por un compilador a
menudo ocultan la relaci�n entre el c�digo fuente y el c�digo de objeto. Activar
las optimizaciones en el compilador a veces expone nuevos problemas en el programa
fuente por lo tanto, las pruebas deben realizarse nuevamente en el c�digo
optimizado. La necesidad de pruebas adicionales a veces disuade el uso de
optimizaciones en las aplicaciones, especialmente si su rendimiento no es cr�tico.
Finalmente, un compilador es un sistema complejo; debemos mantener el sistema
simple para garantizar que los costos de ingenier�a y mantenimiento del compilador
sean manejables. Hay una cantidad infinita de optimizaciones de programas que
podr�amos implementar, y se requiere un esfuerzo no trivial para crear una
optimizaci�n correcta y efectiva. Debemos priorizar las optimizaciones,
implementando solo aquellas que se cargan con los mayores beneficios en los
programas fuente encontrados en la pr�ctica.
Por lo tanto, al estudiar los compiladores, aprendemos no solo a construir un
compilador, sino tambi�n a la metodolog�a general de resolver problemas complejos y
abiertos. El enfoque utilizado en el desarrollo del compilador implica tanto la
teor�a como la experimentaci�n. Normalmente comenzamos formulando el problema en
base a nuestras intuiciones sobre cu�les son los problemas importantes.

1.5 Aplicaciones de la tecnolog�a del compilador

El dise�o del compilador no se trata solo de compiladores, y muchas personas


utilizan la tecnolog�a aprendida al estudiar compiladores en la escuela, pero, en
sentido estricto, nunca han escrito (ni siquiera parte de) un compilador para un
lenguaje de programaci�n importante. La tecnolog�a de compilaci�n tiene otros usos
importantes tambi�n. Adem�s, el dise�o del compilador incluye varios otros �mbitos
de la inform�tica. En esta secci�n, revisamos las interacciones y aplicaciones m�s
importantes de la tecnolog�a.

1.5.1 Implementaci�n de Programaci�n de Alto Nivel


Idiomas

Un lenguaje de programaci�n de alto nivel define un resumen de programaci�n: el


programador expresa un algoritmo utilizando el lenguaje, y el compilador debe
traducir ese programa al idioma de destino. En general, los lenguajes de
programaci�n de nivel superior son m�s f�ciles de programar, pero son menos
eficientes, es decir, los programas de destino se ejecutan m�s lentamente. Los
programadores que usan un lenguaje de bajo nivel tienen m�s control sobre una
computaci�n y pueden, en principio, producir un c�digo m�s eficiente.
Desafortunadamente, los programas de nivel inferior son m�s dif�ciles de escribir
y, lo que es peor, menos port�tiles, m�s propensos a errores y m�s dif�ciles de
mantener. Optimizaci�n de com pilers en t�cnicas reales para mejorar el rendimiento
del c�digo generado, compensando as� la ineficiencia introducida por las
abstracciones de alto nivel.

También podría gustarte