Compiladores
Unidad 1. 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
Fuente Compilador
Programa
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.
Introducción a la compilación (4)
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)
Tradicionalmente se 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.
Sin embargo, 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
compilación (6)
El contexto de un compilador
Cuando se requiere generar un
objeto ejecutable, el compilador
requiere de otros programas.
Estructura del programa fuente
Preprocesador
Programa fuente
Compilador
Programa objeto en lenguaje ensamblador
Ensamblador
Código máquina relocalizable
Enlazador y cargador
Código máquina absoluto
Librerías, bibliotecas y
Archivos objeto relocalizables
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].
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
posición
= expresión
expresión
identificador
+ expresión
inicial
expresión
identificador
* expresión
velocidad
Número
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
(expresión1)
Proposición
de asignación
Identificador
posicion
= expresión
expresión
identificador
+ expresión
inicial
expresión
identificador
* expresión
velocidad
Número
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.
=
posicion +
inicial *
velocidad 60
=
posicion +
inicial *
velocidad ent a real
60
El análisis semántico inserta una conversión de entero a real en el árbol de análisis sintáctico
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.
Analizador léxico
Programa fuente
Analizador sintáctico
Analizador semántico
Generador de
código intermedio
Optimizador de código
Generador de código
Programa objeto
Manejador
de errores
Administrador de la
Tabla de símbolos
Estructura y fases de un
compilador (8)
Administración de la tabla de símbolos
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
60
Generador de código intermedio
temp1 = entreal(60)
temp2 = id3 * temp1
temp3
= id2
+temp2
Id1
= temp3
Optimizador de código
temp1 = id3 * 60.0
temp2 = id2 +temp1
Id1 = temp2
Generador de código
MOVF id3, R2
MULF #60.0, R2
MOVF id2, R1
ADDF R2, R1
MOV R1, id1
TABLA DE SIMBOLOS
posicion …
inicial …
velocidad …
1
2
3
4
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
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
Fuente Compilador
Programa
Objeto
Mensajes
de error
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 máquina de la computadora
real que los ejecutará.
El traductor para estos lenguajes es
relativamente grande y complejo,
además produce código objeto que se
ejecutará con tanta eficiencia como
sea posible
Lenguajes interpretados
No producen código para una máquina
real.
Producen una forma intermedia del
programa cuya ejecución es más fácil
que la ejecución del programa original.
Ordinariamente la ejecución en un
intérprete de software es más lenta.
La complejidad de implementación
suele cargarse más en el software de
simulación
Código en C
Precompilador
Compilador
Código objeto
Enlazador
Código máquina
Hardware
Archivos
de Cabecera
Archivos
de Librería
Tiempodecompilación
(Traducción)
Código en Java
Compilador
Java
Bytecode Java
Bibliotecas
o
Paquetes
Tiempodeejecución
Red
Cargador de clases
Verificador de
Bytecode
Intérprete Generador
de
Código
JVM Runtime
Hardware
MáquinavirtualJava
Procesamiento de un
programa en lenguaje C
Procesamiento de un
programa en lenguaje Java
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.
Herramientas para la
construcción de compiladores (2)
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.
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.
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.
Actividad 3
Con base en la información anterior, tratar de
determinar que emplean (compiladores o
traductores) al menos 5 lenguajes diferentes
Genere una tabla con la información obtenida
Actividad 4
Identificar alfabetos y lenguajes en un
Lenguaje de programación que tu decidas.
Presentar al grupo tu trabajo y justificar el
mismo

Más contenido relacionado

PPT
Jerarquia de chomsky
PPTX
Estructura de lenguaje ensamblador
DOCX
Traductor y su estructura
PPTX
Lenguaje ensamblador
PPT
PARADIGMA FUNCIONAL
PPTX
Registros de la cpu
PDF
Ensayo ing. de software.
Jerarquia de chomsky
Estructura de lenguaje ensamblador
Traductor y su estructura
Lenguaje ensamblador
PARADIGMA FUNCIONAL
Registros de la cpu
Ensayo ing. de software.

La actualidad más candente (20)

DOCX
Componentes y evolucion del modelado de negocios(investigacion)
PDF
Los lenguajes aceptados para una maquina de turing
PPTX
INTRODUCCIÓN A LA PROGRAMACIÓN (1).pptx
PDF
DOCX
Cuadro comparativo de lenguajes de programación
PDF
Unidad1 Lenguajes y automatas
PPTX
Unidad 2 expresiones regulares
PDF
Ingenieria de software
PPTX
Tópicos Avanzados de Programación - Unidad 2 componentes y librerias
PDF
Portafolio lenguajes y automatas unidad 3 - Autómatas finitos
PPT
Lenguaje de programacion c#
PPTX
Compiladores
PPTX
Lenguaje Ensamblador
PDF
Greenfoot 8
PDF
Tabla comparativa- metodologías de desarrollo
PPTX
Mitos de-software.
DOCX
Trabajo de compiladores completo alexandra
PPTX
PDF
Paradigmas de programación
PPTX
Ventajas y desventajas de cmmi
Componentes y evolucion del modelado de negocios(investigacion)
Los lenguajes aceptados para una maquina de turing
INTRODUCCIÓN A LA PROGRAMACIÓN (1).pptx
Cuadro comparativo de lenguajes de programación
Unidad1 Lenguajes y automatas
Unidad 2 expresiones regulares
Ingenieria de software
Tópicos Avanzados de Programación - Unidad 2 componentes y librerias
Portafolio lenguajes y automatas unidad 3 - Autómatas finitos
Lenguaje de programacion c#
Compiladores
Lenguaje Ensamblador
Greenfoot 8
Tabla comparativa- metodologías de desarrollo
Mitos de-software.
Trabajo de compiladores completo alexandra
Paradigmas de programación
Ventajas y desventajas de cmmi
Publicidad

Similar a Unidad1 2 Lenguajes y automatas (20)

PPT
Compiladores Ex..ppt
PPTX
Grupo 1 proceso de lenguajes i
PPTX
Lenguajes de programacion tema 2_compiladores e interpretes
PPT
Compilador
PPTX
compiladores.pptx presentación de compiladores
PPT
Compiladores
DOCX
C:\documents and settings\clientea\mis documentos\compiladores
PPTX
Compiladores unidad1
PDF
Compilador Funcionamiento
PPT
Evolucion de los compiladores1
PPT
Cap4 compiladores
PPT
Introduccion
PPTX
Compiladores
PDF
Compiladores
PPTX
Compiladores conceptos
DOCX
Resumencap1 carmen vargas_jeremycamacho
DOCX
Compiladores (1) pedro vasques
PDF
Materia unidad compiladores
DOCX
Compiladores y analizador lexicos
Compiladores Ex..ppt
Grupo 1 proceso de lenguajes i
Lenguajes de programacion tema 2_compiladores e interpretes
Compilador
compiladores.pptx presentación de compiladores
Compiladores
C:\documents and settings\clientea\mis documentos\compiladores
Compiladores unidad1
Compilador Funcionamiento
Evolucion de los compiladores1
Cap4 compiladores
Introduccion
Compiladores
Compiladores
Compiladores conceptos
Resumencap1 carmen vargas_jeremycamacho
Compiladores (1) pedro vasques
Materia unidad compiladores
Compiladores y analizador lexicos
Publicidad

Último (20)

PDF
Curso Proveedores LEAR seguridad e higiene
PDF
MODULO 1 Base Legal Nacional y sus aplicaciones.pdf
PPTX
CNE-Tx-ZyD_Comite_2020-12-02-Consolidado-Version-Final.pptx
PPTX
TRABAJOS DE ALTO RIESGO IZAJE Y CALIENTE.pptx
PDF
Presentacion_Resolver_CEM_Hospitales_v2.pdf
PDF
clase 1 dermocosmetica 2025 I (1).pdf..
PPTX
Expo petroelo 2do ciclo.psssssssssssssptx
PPTX
ETICA PROFESIONAL PARA MOTIVACION PERSONAL
PPT
Historia de la Estadística en ingeniería civil
PPT
Sistema de muestrea de datos en operaciones
PDF
2. Gestión del alcance gestion de proyetos.pdf
PPTX
Un tema del curso de Ingeniería Industrial.
PDF
Vigas tipos, datos curiosos y contruccion
PPTX
MAQUINAS DE FLUIDO - UNIDAD I.pptx
PDF
BROCHURE SERVICIOS CONSULTORIA ISOTEMPO 2025
PPTX
Instalaciones Electricas.pptx cables electricos
PDF
METODOLOGÍA DE INVESTIGACION ACCIDENTES DEL TRABAJO.pdf
PPTX
TRABAJOS DE ALTO RIESGO ELEC - LOTO.pptx
DOCX
Manual de Capacitación suelos trabajo edwin varon.docx
PPT
flujo de caja 2 para la evaluacion de proyectos
Curso Proveedores LEAR seguridad e higiene
MODULO 1 Base Legal Nacional y sus aplicaciones.pdf
CNE-Tx-ZyD_Comite_2020-12-02-Consolidado-Version-Final.pptx
TRABAJOS DE ALTO RIESGO IZAJE Y CALIENTE.pptx
Presentacion_Resolver_CEM_Hospitales_v2.pdf
clase 1 dermocosmetica 2025 I (1).pdf..
Expo petroelo 2do ciclo.psssssssssssssptx
ETICA PROFESIONAL PARA MOTIVACION PERSONAL
Historia de la Estadística en ingeniería civil
Sistema de muestrea de datos en operaciones
2. Gestión del alcance gestion de proyetos.pdf
Un tema del curso de Ingeniería Industrial.
Vigas tipos, datos curiosos y contruccion
MAQUINAS DE FLUIDO - UNIDAD I.pptx
BROCHURE SERVICIOS CONSULTORIA ISOTEMPO 2025
Instalaciones Electricas.pptx cables electricos
METODOLOGÍA DE INVESTIGACION ACCIDENTES DEL TRABAJO.pdf
TRABAJOS DE ALTO RIESGO ELEC - LOTO.pptx
Manual de Capacitación suelos trabajo edwin varon.docx
flujo de caja 2 para la evaluacion de proyectos

Unidad1 2 Lenguajes y automatas

  • 1. Compiladores Unidad 1. Introducción al proceso de compilación.
  • 2. 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
  • 3. 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].
  • 4. 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 Fuente Compilador Programa Objeto Mensajes de error
  • 5. 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.
  • 6. 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.
  • 7. Introducción a la compilación (4) 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).
  • 8. Introducción a la compilación (5) Tradicionalmente se 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. Sin embargo, los principios con los que se construyen compiladores también son utilizados en otros lugares: Formadores de textos (LaTex). Intérpretes de consultas (SQL).
  • 9. Introducción a la compilación (6) El contexto de un compilador Cuando se requiere generar un objeto ejecutable, el compilador requiere de otros programas. Estructura del programa fuente Preprocesador Programa fuente Compilador Programa objeto en lenguaje ensamblador Ensamblador Código máquina relocalizable Enlazador y cargador Código máquina absoluto Librerías, bibliotecas y Archivos objeto relocalizables
  • 10. 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].
  • 11. 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)
  • 12. 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 posición = expresión expresión identificador + expresión inicial expresión identificador * expresión velocidad Número 60
  • 13. 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 (expresión1) Proposición de asignación Identificador posicion = expresión expresión identificador + expresión inicial expresión identificador * expresión velocidad Número 60
  • 14. 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.
  • 15. 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. = posicion + inicial * velocidad 60 = posicion + inicial * velocidad ent a real 60 El análisis semántico inserta una conversión de entero a real en el árbol de análisis sintáctico
  • 16. 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. Analizador léxico Programa fuente Analizador sintáctico Analizador semántico Generador de código intermedio Optimizador de código Generador de código Programa objeto Manejador de errores Administrador de la Tabla de símbolos
  • 17. Estructura y fases de un compilador (8) Administración de la tabla de símbolos 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 60 Generador de código intermedio temp1 = entreal(60) temp2 = id3 * temp1 temp3 = id2 +temp2 Id1 = temp3 Optimizador de código temp1 = id3 * 60.0 temp2 = id2 +temp1 Id1 = temp2 Generador de código MOVF id3, R2 MULF #60.0, R2 MOVF id2, R1 ADDF R2, R1 MOV R1, id1 TABLA DE SIMBOLOS posicion … inicial … velocidad … 1 2 3 4
  • 18. 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
  • 19. 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
  • 20. 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 Fuente Compilador Programa Objeto Mensajes de error
  • 21. 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
  • 22. 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 máquina de la computadora real que los ejecutará. El traductor para estos lenguajes es relativamente grande y complejo, además produce código objeto que se ejecutará con tanta eficiencia como sea posible Lenguajes interpretados No producen código para una máquina real. Producen una forma intermedia del programa cuya ejecución es más fácil que la ejecución del programa original. Ordinariamente la ejecución en un intérprete de software es más lenta. La complejidad de implementación suele cargarse más en el software de simulación Código en C Precompilador Compilador Código objeto Enlazador Código máquina Hardware Archivos de Cabecera Archivos de Librería Tiempodecompilación (Traducción) Código en Java Compilador Java Bytecode Java Bibliotecas o Paquetes Tiempodeejecución Red Cargador de clases Verificador de Bytecode Intérprete Generador de Código JVM Runtime Hardware MáquinavirtualJava Procesamiento de un programa en lenguaje C Procesamiento de un programa en lenguaje Java
  • 23. 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
  • 24. 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.
  • 25. Herramientas para la construcción de compiladores (2) 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.
  • 26. 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.
  • 27. 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 …
  • 28. 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.
  • 29. 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.
  • 30. 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.
  • 31. Actividad 3 Con base en la información anterior, tratar de determinar que emplean (compiladores o traductores) al menos 5 lenguajes diferentes Genere una tabla con la información obtenida
  • 32. Actividad 4 Identificar alfabetos y lenguajes en un Lenguaje de programación que tu decidas. Presentar al grupo tu trabajo y justificar el mismo