Sunteți pe pagina 1din 41

INGENIERÍA

EN
SISTEMAS COMPUTACIONALES

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
INTRODUCCIÓN
Caracterización de la asignatura :

En ésta asignatura se debe desarrollar el análisis semántico, la


generación de código, la optimización y la generación del
código objeto para obtener el funcionamiento de un
compilador.

La asignatura trata de concretar un traductor iniciado en la


asignatura previa para que el estudiante comprenda que es
capaz, mediante técnicas bien definidas, de crear su propio
lenguaje de programación.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
Intención Didáctica:
La asignatura consta de cuatro bloques estructurados
y definidos que abarcan la última etapa de la fase de
análisis y síntesis. Al término del semestre se debe
obtener un compilador o traductor completo,
funcionando de acuerdo a ciertas restricciones y
requisitos.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
Competencia de la asignatura:
Implementa un compilador para un lenguaje específico
considerando las etapas del mismo.

Define, diseña y programa las fases del analizador léxico y


sintáctico de un traductor o compilador para preámbulo de
la construcción de un compilador.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
TEMARIO
1. Análisis semántico.
1.1 Árboles de expresiones.
1.2 Acciones semánticas de un analizador
sintáctico.
1.3 Comprobaciones de tipos en
expresiones.
1.4 Pila semántica en un analizador
sintáctico.
1.5 Esquema de traducción.
1.6 Generación de la tabla de símbolo y
tabla
de direcciones.
1.7 Manejo de errores semánticos.
Subsecretaría de Educación Superior
Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
2. Generación de código intermedio.
2.1 Notaciones.
2.1.1 Prefija
2.1.2 Infija.
2.2.3 Postfija.
2.2 Representaciones de código Intermedio.
2.2.1 Notación Polaca.
2.2.2 Código P.
2.2.3 Triplos.
2.2.4 Cuádruplos.
2.3 Esquema de generación.
2.3.1 Variables y constantes.
2.3.2 Expresiones.
2.3.3 Instrucción de asignación.
2.3.4 Instrucciones de control.
2.3.5 Funciones.
2.3.6 Estructuras.
Subsecretaría de Educación Superior
Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
3. Optimización.

3.1 Tipos de optimización.


3.1.1 Locales.
3.1.2 Ciclos.
3.1.3 Globales.
3.1.4 De mirilla.
3.2 Costos.
3.2.1 Costo de ejecución. (memoria, registros, pilas).
3.2.2 Criterios para mejorar el código.
3.2.3 Herramientas para el análisis del flujo de
datos.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
4.Generación de código objeto.
4.1 Registros.
4.2 Lenguaje ensamblador.
4.3 Lenguaje máquina.
4.4 Administración de memoria.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
Fuentes de información
1. Aho Alfred V., U. J. (2007). Compiladores. Principios, técnicas y herramientas (2da.
ed.). México: Pearson Educación.
2. Alfonseca Moreno, M. (2006). Compiladores e intérpretes: teoría y práctica (1ra
ed.). España: Pearson/Prentice Hall.
3. Carrión Viramontes, J. E. (2008). Teoría de la computación. México: Limusa.
4. Hopcroft John E., M. R. (2002). Introducción a la Teoría de Autómatas, Lenguajes y
Computación (2da. ed.). Madrid: Addison-Wesley.
5. Isasi Pedro, M. P. (1997). Lenguajes, gramáticas y autómatas. Un enfoque Práctico.
Addison- Wesley.
6. Kelley, D. (1995). Teoría de Autómatas y Lenguajes Formales, (1ra. ed.). Madrid:
Prentice Hall.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
EVALUACION PRIMER PARCIAL

1. Evaluación Escrita 30%


2. Prácticas 25+25=50%
3. Actividades en clase 20%

Las actividades que se entreguen en periodo


de recuperación solo podrán obtener como
máximo calificación, la mínima aprobatoria.

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
INTRODUCCION

Subsecretaría de Educación Superior


Tecnológico de Estudios Superiores de Ixtapaluca
Km. 7, Carretera Ixtapaluca-Coatepec, col. Coatepec, C.P. 56580, Ixtapaluca, Estado De México.
Tels. (55) 13 14 81 51 Ext. 102, Fax (55) 13 14 81
Compiladores
Introducción al proceso de compilación.
Contenido

 Introducción a la compilación
 Estructura y fases de un compilador
 Lenguajes y tipos de traductores
 Herramientas para el desarrollo de un compilador
 Clasificación de los compiladores
Introducción a la compilación

 La escritura de compiladores comprende los lenguajes de programación, la


arquitectura de computadoras, la teoría de lenguajes, los algoritmos y la
ingeniería de software [Aho98].
Introducción a la compilación (2)

 A grandes rasgos, un compilador es un programa


que lee un programa escrito en algún lenguaje
(fuente) y lo traduce a un programa equivalente en
otro lenguaje (objeto).
 Una parte importante de éste proceso de
traducción es presentar los errores del programa
fuente.
Programa Programa
Fuente Compilador Objeto

Mensajes
de error
Introducción a la compilación (3)

 Modelo de análisis y síntesis de la compilación


 Fase de análisis
 Divide al programa fuente en sus elementos componentes y crea una
representación intermedia.
 Fase de síntesis
 Construye el programa objeto a partir de la representación
intermedia.
Introducción a la compilación (4)
 Existe una gran variedad de software que realiza algún
tipo de análisis sobre programas fuente, por ejemplo:
 Editores de estructuras
 Analiza el texto del programa fuente imponiéndole una
estructura jerárquica apropiada.
 También puede proporcionar:
 Palabras clave de forma automática
 Saltos desde un paréntesis, llave, o corchete que abre hasta
su correspondiente que cierra.
 Ayuda en la edición de las estructuras propias del lenguaje.
 Visualizadores estéticos
 Imprime el programa fuente de tal forma que visiblemente
claro. Por ejemplo:
 Los comentarios pueden aparecer con un tipo de letra especial, al
igual que las palabras clave.
 Indentación proporcional a la profundidad del anidamiento.
 Verificadores estáticos
 Lee el programa fuente y lo analiza para intentar descubrir
errores potenciales sin ejecutar el programa. Por ejemplo:
 Partes del programa que nunca se podrán ejecutar.
 Si una variable se utiliza antes de ser definida.
 Intentar utilizar una variable de tipo real como apuntador.
 Intérpretes
 En lugar de producir un programa objeto como resultado de
una traducción, realiza las operaciones que implica el
programa fuente.
 En la mayoría de las ocasiones son utilizados para ejecutar
órdenes (por ejemplo: el intérprete de comandos).
Introducción a la compilación (5)
 Tradicionalmentese concibe a un
compilador como un programa que
recibe un programa fuente, escrito
en algún lenguaje de alto nivel, y
genera código máquina.
 Sinembargo, los principios con los
que se construyen compiladores
también son utilizados en otros
lugares:
 Formadores de textos (LaTex).
 Intérpretes de consultas (SQL).
Introducción a la Estructura del programa fuente

compilación (6) Preprocesador

 El contexto de un
compilador
Programa fuente

 Cuando se requiere generar


un objeto ejecutable, el Compilador

compilador requiere de otros


programas. Programa objeto en lenguaje ensamblador

Ensamblador

Código máquina relocalizable

Librerías, bibliotecas y
Archivos objeto relocalizables Enlazador y cargador

Código máquina absoluto


Estructura y fases de un compilador
 En la compilación el análisis consta de tres fases:
 Análisis lineal
 Lasecuencia de caracteres que forma el programa
fuente se lee de izquierda a derecha y se agrupa en
componentes léxicos, que son secuencias de
caracteres que tienen un significado colectivo.
 Análisis jerárquico
 Los componentes léxicos se agrupan
jerárquicamente en colecciones anidadas con un
significado colectivo.
 Análisis semántico
 Se realizan ciertas revisiones para asegurar que los
componentes de un programa se ajustan de un modo
significativo.
Estructura y fases de un compilador (2)
 Análisis lineal
 También conocido como: análisis léxico o exploración.
 Ejemplo, en la proposición de asignación:
 posicion = inicial + velocidad * 60
 Se identifican los siguientes componentes léxicos
 Identificador (posicion)
 Símbolo de asignación (=)
 Identificador (inicial)
 Signo de suma (+)
 Identificador (velocidad)
 Signo de multiplicación (*)
 Número (60)
Estructura y fases de un compilador (3)
 Análisis jerárquico
 También llamado análisis sintáctico.
 Implica agrupar los componentes léxicos en frases
gramaticales que el compilador utiliza para sintetizar la
salida.
 Por lo general, las frases gramaticales se representan
mediante un árbol de análisis sintáctico.
 Ejemplo: Proposición
de asignación

Identificador = expresión

posición expresión + expresión

identificador expresión * expresión

inicial identificador Número

velocidad 60
Estructura y fases de un compilador (4)
 La estructura jerárquica de un programa normalmente se expresa
utilizando reglas recursivas. Para el ejemplo anterior de la proposición
de asignación se tiene:
 Cualquier identificador es una expresión
 Cualquier número es una expresión
 Si expresión1 y expresión2 son expresiones, entonces también lo
son:
 expresión1 + expresión2
 expresión1 * expresión2 Proposición
de asignación
 (expresión1)
Identificador = expresión

posicion expresión + expresión

identificador expresión * expresión

inicial identificador Número

velocidad 60
Estructura y fases de un compilador (5)

 Muchos lenguajes definen recursivamente las proposiciones mediante


reglas como:
 Si identificador1 es un identificador y expresión2 es un identificador,
entonces:
 Identificador1 = expresión2
 Si expresión1 es una expresión y proposición2 es una proposición,
entonces:
 while ( expresión1 ) do proposición2
 if ( expresión1 ) then proposición2
 El análisis lineal (léxico) no es suficientemente poderoso para analizar
proposiciones o expresiones recursivas.
 Cuándo una construcción del lenguaje fuente es recursiva, entonces es
factible emplear una gramática libre de contexto para formalizar la
recursión.
Estructura y fases de un compilador (6)
 Análisis semántico
 Revisa el programa e intenta encontrar errores semánticos.
 Reúne la información sobre los tipos para la fase posterior de
generación de código.
 Un componente importante es la verificación de tipos.
 Se verifica si cada operador tiene los operandos permitidos.
 Un real no debe utilizarse como índice de un arreglo.
 Convertir un número entero a real para algunos operadores.
Estructura y fases de un compilador (7)
 Conceptualmente un compilador opera en fases, cada una de las
cuales transforma al programa fuente de una representación a otra.

Programa fuente

Analizador léxico

Analizador sintáctico

Analizador semántico
Administrador de la Manejador
Tabla de símbolos de errores
Generador de
código intermedio

Optimizador de código

Generador de código

Programa objeto
Estructura

y fases
Administración de la tabla de símbolos
de un compilador (8)
 Registra los identificadores e información referente a ellos.
 Se tiene un registro por cada identificador.
 Todas las fases hacen uso de esta tabla.
 Detección e información de errores
 En cada fase se pueden encontrar errores.
 Se debe definir como se deben tratar los errores en cada una de las fases.
 Las fases de análisis
 Cambian la representación interna del programa fuente conforme avanza cada
una de ellas.
 Generación de código intermedio
 Se puede considerar como código para una máquina abstracta.
 Dicha representación debe ser fácil de producir y fácil de traducir al código
objeto.
 Optimización de código
 Trata de mejorar el código intermedio de modo que resulte un código máquina
más rápido de ejecutar.
 Generación de código
 Por lo general se trata de código máquina relocalizable o código ensamblador.
 Se deben seleccionar posiciones de memoria para cada una de las variables.
posicion = inicial + velocidad * 60

Analizador léxico

id1 = id2 + id3 * 60

Analizador sintáctico
=
id1 +
id2 *
id3 60

Analizador semántico
=
id1 +
id2 *
id3 ent a real
T ABLA DE S IMBOLOS
60
1 posicion …
Generador de código intermedio
2 inicial …
3 velocidad … temp1 = entreal(60)
4 temp2 = id3 * temp 1
temp3 = id2 +temp 2
Id1 = temp3

Optimizador de código

temp 1 = id3 * 60.0


temp 2 = id2 +temp 1
Id1 = temp2

Generador de código

MOVF id 3, R2
MULF #60.0, R2
MOVF id 2, R1
ADDF R2, R1
MOV R1, id1
Estructura y fases de un compilador (9)
 Con frecuencia las fases de un compilador se agrupan en
una etapa inicial y una etapa final:
 Etapa inicial
 Comprende aquellas fases que dependen principalmente del
código fuente.
 Normalmente incluye el análisis léxico, sintáctico y
semántico, la creación de la tabla de símbolos, la generación
de código intermedio y cierta optimización de éste.
 También incluye el manejo de errores correspondientes a
cada etapa.
 Etapa final
 Comprende aquellas partes del compilador que dependen de
la máquina objeto.
 En general estas partes dependen del lenguaje intermedio,
más que del lenguaje fuente.
 Comprende aspectos de optimización y generación de código,
junto con el manejo de errores necesario y las operaciones
con la tabla de símbolos.

CLR Architecture.PNG
Estructura y fases de un compilador (10)
 Pasadas
 Consiste en leer un archivo de entrada y escribir uno de salida.
 Es común que se apliquen varias fases de la compilación en una sola pasada
 Reducción de pasadas
 Es deseable tener pocas pasadas dado que la lectura y la escritura de archivos
intermedios lleva tiempo.
 Sin embargo, en ocasiones resulta muy difícil generar código si no se tiene una
representación intermedia completa. Por ejemplo:
 Las instrucciones de tipo goto que saltan hacia delante. En este caso es posible
dejar un espacio en blanco y rellenar cuando la información esté disponible
Lenguajes y tipos de traductores
 Un lenguaje de programación se puede definir como:
 Notación formal para describir algoritmos o funciones que serán ejecutadas por una
computadora.
 Lenguaje para comunicar instrucciones a la computadora.
 Convención para escribir descripciones que pueden ser evaluadas.
 Dentro de los atributos de un buen lenguaje están:
 Claridad y sencillez
 Naturalidad para la aplicación
 Apoyo para la abstracción
 Facilidad para verificar programas
 Entorno de programación
 Portabilidad de programas
 Costo de uso
 Costo de ejecución
 Costo de traducción
 Costo de creación y prueba
 Costo de mantenimiento
Lenguajes y tipos de traductores (2)
 El término general traductor denota cualquier procesador de
lenguajes que acepta programas en cierto lenguaje fuente como
entrada y produce lenguajes funcionalmente equivalentes en otro
lenguaje objeto.
 Varios tipos de traductores tienen nombres especializados:
 Ensamblador
 Compilador
 Cargador o editor de vínculos
 Preprocesador o macroprocesador
 Conversor fuente-fuente
 Simulador o intérprete de software
 Compresores
 Formateadores
Lenguajes y tipos de traductores (3)
 Se puede hacer una clara división entre dos
tipos de lenguajes:
 Lenguajes compilados
 Ordinariamente se traducen al lenguaje Procesamiento de un Procesamiento de un
máquina de la computadora real que los programa en lenguaje C programa en lenguaje Java

ejecutará. Código en C Código en Java

Archivos
 El traductor para estos lenguajes es Precompilador

Tiempo de compilación
de Cabecera Compilador Bibliotecas

relativamente grande y complejo, además Java o

(Traducción)
Compilador Paquetes
produce código objeto que se ejecutará
con tanta eficiencia como sea posible Código objeto Bytecode Java

 Lenguajes interpretados Enlazador Archivos Red


de Librería
 No producen código para una máquina Código máquina Cargador de clases
real.

Máquina virtual Java


Hardware
 Producen una forma intermedia del Verificador de
Bytecode
programa cuya ejecución es más fácil que

Tiempo de ejecución
la ejecución del programa original. Intérprete Generador
de
 Ordinariamente la ejecución en un JVM Runtime
Código

intérprete de software es más lenta.


 La complejidad de implementación suele Hardware

cargarse más en el software de simulación


Herramientas para la construcción de
compiladores
 Existen herramientas especializadas
para implementar las diferentes fases
de un compilador.
 Los sistemas de ayuda para construir
compiladores se conocen como:
 Compiladores de compiladores
 Generadores de compiladores
 Sistemas generadores de compiladores
Herramientas para la construcción de
compiladores (2)
 Algunas herramientas útiles para la construcción de compiladores
 Generadores de analizadores léxicos
 Por lo general, trabajan a partir de una especificación basada en
expresiones regulares.
 La organización básica del analizador léxico resultante es un autómata
finito.
 Generadores de analizadores sintácticos
 Trabajan a partir de una gramática independiente del contexto.
 El generador hace de esta fase una de las más fáciles de aplicar.
 Se utilizan poderosos y complejos algoritmos para realizar el análisis.
 Dispositivos de traducción dirigida por la sintaxis
 Producen grupos de rutinas que recorren el árbol de análisis sintáctico
generando código intermedio.
 Generadores automáticos de código
 Toman un conjunto de reglas que definen la traducción de cada
operación del lenguaje intermedio al lenguaje de máquina objeto.
 La técnica fundamental es la concordancia de plantillas.
Herramientas para la construcción de
compiladores (3)
 Un compilador es muy complejo como para programarlo en
ensamblador.
 En el entorno de programación UNIX, los compiladores se escriben
generalmente en C.
 Se deben utilizar las ventajas del lenguaje para compilarse a sí
mismo (los compiladores de C se escriben en C).
 Sin embargo, un compilador sólo es un programa. El entorno en el
que se desarrolle este programa puede afectar la velocidad y la
fiabilidad de la implantación del compilador.
 La mayoría de las personas que escriben compiladores eligen un
lenguaje orientado a sistemas como C.
Herramientas para la construcción de
compiladores (3)
 La escritura de compiladores, y en general de cualquier herramienta,
tendrá un usuario final. Dicho usuario es quien hace realmente útil al
software. Es necesario aplicar técnicas de ingeniería de software en la
construcción de compiladores para evitar …
Clasificación de los compiladores

 Una característica que identifica a los compiladores es el hecho de


que traducen completamente el lenguaje fuente de entrada previo
a la ejecución del lenguaje objeto a ejecutar.
 Los compiladores se pueden clasificar por el número de pasadas
en:
 Compilador de una pasada
 Examinan solo una vez el código fuente para generar el código objeto
 Compiladores de múltiples pasadas
 Requiere de pasos intermedios (código intermedio) antes de generar
el código objeto final.
 Entre menos pasadas menor tiempo de compilación, sin embargo más
pasadas pueden generar código objeto más eficiente.
Clasificación de los compiladores (2)
 Por el código objeto generado se pueden clasificar en:
 Metacompilador
 Es un programa que acepta como entrada la descripción de
un lenguaje y produce el compilador de dicho lenguaje.
 Por lo regular hay dos tipos de metacompiladores, los que
trabajan con expresiones regulares y aquellos que lo hacen
con gramáticas libres de contexto.
 Ejemplos clásicos son Lex (generador de analizadores
léxicos) y Yacc (generador de analizadores sintácticos).
 Descompilador
 Realiza una tarea de traducción inversa, es decir, va del
código máquina al lenguaje de alto nivel.
 Es relativamente sencillo cuando se trata de ir a código
ensamblador o macro ensamblador, pero no cuando se
quiere llegar a un lenguaje de alto nivel.
Clasificación de los compiladores (3)
 Compiladores-intérpretes
 Realizan dos fases: la fase de compilación y
la fase de interpretación
 La fase de compilación traduce la entrada
en una representación intermedia por una
única vez.
 La fase de interpretación parte de la
representación generada por la primera fase
para la ejecución del programa.
 Compiladores cruzados
 Surgen como solución al problema de
desarrollar un primer compilador para una
nueva arquitectura.
 Dado que el desarrollo de compiladores es
una tarea compleja, resulta más fácil
construirlos sobre una máquina que ya
disponga de herramientas de software.
 Se denomina compilador cruzado a un
compilador que se ejecuta en una máquina
pero el código objeto es para otra máquina.

S-ar putea să vă placă și