CENTRO UNIVERSITARIO UAEM TEXCOCO INGENIERA EN COMPUTACIN COMPILADORES

  • Slides: 39
Download presentation
CENTRO UNIVERSITARIO UAEM TEXCOCO INGENIERÍA EN COMPUTACIÓN COMPILADORES M. En C. C. Ma. Dolores

CENTRO UNIVERSITARIO UAEM TEXCOCO INGENIERÍA EN COMPUTACIÓN COMPILADORES M. En C. C. Ma. Dolores Arévalo Zenteno

Fases de la metodología de compilación para la creación de lenguajes PROGRAMAS RELACIONADOS CON

Fases de la metodología de compilación para la creación de lenguajes PROGRAMAS RELACIONADOS CON UN COMPILADOR

Fundamentos Los compiladores ayudan a promover el uso de lenguajes de alto nivel y

Fundamentos Los compiladores ayudan a promover el uso de lenguajes de alto nivel y con ello se minimiza la sobrecarga de ejecución de los programas escritos en estos lenguajes. A demás estos también son imprescindibles a la hora de hacer efectivas las arquitecturas computacionales de alto rendimiento en las aplicaciones del usuario. El conocimiento sobre compiladores es de gran relevancia para un ingeniero ya que amplia su visión al momento de diseñar algoritmos y la codificación de los mismos.

Objetivo Identificar ampliamente programas que funcionan con el mismo fundamento de los compiladores, haciendo

Objetivo Identificar ampliamente programas que funcionan con el mismo fundamento de los compiladores, haciendo notar que la importancia de éstos en la ámbito profesional de un Ingeniero en Computación.

Intérpretes Programa origen Interprete Traduce y ejecuta línea Errores Ejecuta el programa fuente inmediatamente

Intérpretes Programa origen Interprete Traduce y ejecuta línea Errores Ejecuta el programa fuente inmediatamente en vez de generar un código objeto que se ejecuta después de que se completa la traducción.

Ensambladores Es un traductor para el lenguaje ensamblador de una computadora en particular, es

Ensambladores Es un traductor para el lenguaje ensamblador de una computadora en particular, es una forma simbólica del lenguaje de máquina de la computadora y es fácil de traducir. Código Ensamblador Errores Código Maquina

Ligadores Códig o fuente Código objeto Librerías Códig o fuente Código objeto Ligador Códig

Ligadores Códig o fuente Código objeto Librerías Códig o fuente Código objeto Ligador Códig o fuente Recopila el código que se compila o ensambla por separado en diferentes archivos objeto a un archivo que es directamente ejecutable. Código objeto Ejecutable

Cargadores Se dice que tal código es re localizable y un cargador resolverá todas

Cargadores Se dice que tal código es re localizable y un cargador resolverá todas las direcciones re localizables relativas a una dirección base o de inicio dada . El uso de un cargador hace más flexible el código ejecutable pero el proceso de carga con frecuencia ocurre en segundo plano o conjuntamente con el ligado. Rara vez un cargador es en realidad un programa por separado. Memoria principal Cargador

Preprocesadores Codigo. c #include <uno. c> int main(){ … return 1; } Uno. c

Preprocesadores Codigo. c #include <uno. c> int main(){ … return 1; } Uno. c //Codigo …. Preprocesado r Codigo. c //Codigo …. #include <uno. c> int main(){ … return 1; } Compilador Es un programa separado que es invocado por el compilador antes de que comience la traducción real. Un preprocesador puede eliminar los comentarios incluir otros archivos y ejecutar situaciones de macro.

Editores Los compiladores por lo regular aceptan programas escritos utilizando cualquier editor que pueda

Editores Los compiladores por lo regular aceptan programas escritos utilizando cualquier editor que pueda producir una archivo estándar tal como un archivo ASCII. Más recientemente ha sido integrado junto con editores y otros programas en un ambiente de desarrollo interactivo.

Depuradores 1 2 3 4 5 6 7 8 9 10 11 12 13

Depuradores 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 #include <stdio. h> #include <string. h> #define LONG_MAX_LINEA 4096 #define NOMBRE_ARCHIVO "cuento. txt" int main(void){ Descripcion FILE *fichero; char linea[LONG_MAX_LINEA]; char *p; if ((fichero = fopen(NOMBRE_ARCHIVO, "r")) == NULL){ perror(NOMBRE_ARCHIVO); return 0; } printf("Contenido del fichero: n"); if(!fgets(linea, 100, fichero)){ printf("El fichero esta vacio. n"); Tipo Nombre Valor Tipo Es un programa que puede utilizarse para determinar los errores de ejecución en un programa compilado.

Perfiladores 6 4 Un perfilador es un programa que recolecta estadísticas sobre el comportamiento

Perfiladores 6 4 Un perfilador es un programa que recolecta estadísticas sobre el comportamiento de un programa objeto durante la ejecución. 6 4 2 0

El Proceso de Compilación Un compilador es un programa que puede leer un programa

El Proceso de Compilación Un compilador es un programa que puede leer un programa en un lenguaje y traducirlo en un programa equivalente en otro lenguaje. Programa Fuente Compilador Programa Destino

Compilación Codigo. c #include <uno. c> int main(){ … return 1; } Análisis Síntesis

Compilación Codigo. c #include <uno. c> int main(){ … return 1; } Análisis Síntesis Código fuente Codigo. c #include <uno. c> int main(){ … return 1; } Código destino Error en el programa Error al generar

Análisis (Etapa Inicial): Divide al PF en sus elementos componentes y crea una representación

Análisis (Etapa Inicial): Divide al PF en sus elementos componentes y crea una representación intermedia. Se determinan las operaciones y se registran en una estructura de árbol (ej. árbol sintáctico) t 1 : = entareal (60) t 2 : = id 3 + t 1 t 3 : = id 2 + t 2 id 1 : = t 3

Síntesis (Etapa Final): Construye el programa objeto deseado a partir de la representación Intermedia

Síntesis (Etapa Final): Construye el programa objeto deseado a partir de la representación Intermedia (requiere técnicas más especializadas) MOVF id 3, R 2 MULF % 60. 0, R 2 MOVF id 2, R 1 ADDF R 2, R 1 MOVF R 1, id 1

El Proceso de Compilación El proceso de compilación se puede ver como una secuencia

El Proceso de Compilación El proceso de compilación se puede ver como una secuencia de fases, cada una de las cuales transforma una representación del programa fuente en otro. Flujo de Caracteres Analizador Léxico Flujo de Tokens Analizador Sintáctico Árbol Sintáctico Analizador Semántico Árbol Sintáctico Generador de Código Intermedio

Los compiladores pueden requerir otros programas para el procesamiento de un programa destino ejecutable.

Los compiladores pueden requerir otros programas para el procesamiento de un programa destino ejecutable. programa fuente preprocesador programa fuente compilador programa objeto en lenguaje ensamblador código de máquina relocalizable editor de carga y enlace código de máquina absoluto biblioteca archivos bj. relocal.

 • En la práctica varias fases pueden agruparse, y las representaciones intermedias entre

• En la práctica varias fases pueden agruparse, y las representaciones intermedias entre las fases agrupadas no necesitan construirse de manera explicita. Generador de Código Intermedio Representación Intermedia Optimizador de Código Independiente de la Máquina Código Máquina Destino Representación Intermedia Optimizador de Código Independiente de la Máquina Generador de Código Máquina Destino

 • Análisis Léxico (Escaneo) • Es la primera fase de compilación. Este lee

• Análisis Léxico (Escaneo) • Es la primera fase de compilación. Este lee el flujo de caracteres que ponen el programa fuente y los agrupa en secuencias significativas, conocidas como lexemas. Y para cada lexema el Analizador Léxico produce como salida un token de la forma: (nombre-token, valor-atributo)

 • Análisis Léxico (Escaneo) • El <nombre-token> es un símbolo abstracto que se

• Análisis Léxico (Escaneo) • El <nombre-token> es un símbolo abstracto que se utiliza durante el análisis sintáctico, y el <valor-atributo> apunta a una entrada en la tabla se símbolos para este token. La información de dicha tabla se necesita para el análisis semántico y la generación de código. Tabla de símbolos 1 Token 1 2 Token 2 3 token 3

 • Análisis Sintáctico (Parser) • Es la 2 da fase de compilación. Utiliza

• Análisis Sintáctico (Parser) • Es la 2 da fase de compilación. Utiliza los tokens para crear una representación intermedia en forma de árbol, en la cual cada nodo interior representa una operación y los hijos del nodo representan los argumentos de la operación.

 • Análisis Semántico • Utiliza el árbol sintáctico y la información en la

• Análisis Semántico • Utiliza el árbol sintáctico y la información en la tabla de símbolos para comprobar la consistencia semántica del programa fuente con la definición del lenguaje. Realiza comprobación de tipos, donde verifica que cada operador tenga operandos que coincidan. resul = x+ -y; y=-2; resul = x + y;

 • Generador de Código Intermedio • El compilador puede crear 1 o +

• Generador de Código Intermedio • El compilador puede crear 1 o + representaciones intermedias similares al código maquina. La representación debe ser fácil de producir y fácil de traducir en la máquina destino. int i; while(i<10){ printf(“hola”); i++; } LDF MULF LDF ADDF STF R 2, R 1, id 1, id 3 R 2, id 2 R 1, R 1 #10 R 2

 • Optimización de código • Trata de mejorar el código intermedio, de manera

• Optimización de código • Trata de mejorar el código intermedio, de manera que produzca un mejor código destino. Mejor significa mas rápido, mas corto y que consuma menos poder. Código Intermedio Optimizador de Código Independiente de la Máquina Súper Código

 • Generación de Código • Se recibe una representación intermedia del programa fuente

• Generación de Código • Se recibe una representación intermedia del programa fuente y la asigna a la lengua destino. Después, las instrucciones intermedias se traducen en secuencias de instrucciones de maquina. LDF MULF LDF ADDF STF R 2, R 1, id 1, id 3 R 2, id 2 R 1, R 1 #10 R 2 10011 11011 01101 11001 01010 01101 11100 01101 11110 00011 00100 10110 00111 01011 01110 10011 01101 101101 11010 10001 01101

Agrupamiento de Fases en Pasadas ETAPA INICIAL Y ETAPA FINAL Inicial : Fases que

Agrupamiento de Fases en Pasadas ETAPA INICIAL Y ETAPA FINAL Inicial : Fases que dependen del lenguaje fuente Hasta cierta optimación Final : Partes que dependen de la maq. objeto y del leng. intermedio PASADAS Se agrupan las actividades de varias fases en una misma pasada (lectura de un archivo de entrada y escritura de un archivo de salida) REDUCCION DEL NUMERO DE PASADAS Pocas pasadas --> Varias fases dentro de una pasada --> Prog. completo en memoria en representación intermedia Fusión de código intermedio y objeto: “ backpatching”

Token Un token es un par que consiste en un nombre de token y

Token Un token es un par que consiste en un nombre de token y un valor de atributo opcional. q 0 a q 1 b a q 2

Los nombres de los tokens son los símbolos de entrada que procesa el analizador

Los nombres de los tokens son los símbolos de entrada que procesa el analizador sintáctico. Tokens Analizador Sintáctico (id, ”x”) (op, ”=”) (id, ”a”) (op, ”+”) (id, ”b”) (op, ”*”) (id, ”c”) (punct, ”; ”) (id, ”y”) (op, ”=”) (id, ” 3”) (op, ”+”) (id, ”b”) (op, ”*”) (id, ”c”) (punct, ”; ”)

A partir de este momento, en general escribiremos el nombre de un token en

A partir de este momento, en general escribiremos el nombre de un token en negrita. (id, ”x”) (op, ”=”) (id, ”a”) (op, ”+”) (id, ”b”) (op, ”*”) (id, ”c”) (punct, ”; ”) (id, ”x”) (op, ”=”) (id, ” 3”) (op, ”+”) (id, ”b”) (op, ”*”) (id, ”c”) (punct, ”; ”)

Con frecuencia nos referiremos a un token por su nombre. (id, ”x”) Token x

Con frecuencia nos referiremos a un token por su nombre. (id, ”x”) Token x (op, ”=”) Token = (id, ”a”) Token a (op, ”+”) Token + (id, ”b”) Token b (op, ”*”) Token * (id, ”c”) Token c (punct, ”; ”) Token ; (id, ”x”) Token x (op, ”=”) Token = (id, ” 3”) Token 3 (op, ”+”) Token + (id, ”b”) Token b (op, ”*”) Token * (id, ”c”) Token c (punct, ”; ”) Token ;

Lexema Componente lexico lexema Identificador indice, a, temp Numero entero 1990, 1, 22 If

Lexema Componente lexico lexema Identificador indice, a, temp Numero entero 1990, 1, 22 If if Do do Operador dividir / Operador asignar = Es una secuencia de caracteres en el programa fuente, que coinciden con el patrón para un token y que el analizador léxico identifica como una instancia de ese token.

Patrón Es una descripción de la forma que pueden tomar los lexemas de un

Patrón Es una descripción de la forma que pueden tomar los lexemas de un token. lexema patron indice, a, temp Letras seguidas de letras o digitos 1990, 1, 22 Diguitos seguidos de mas digitos if Letra i seguida de letra f do Letra d seguida de letra o / Carácter / = Carácter =

Identificador mi. Cadena 25 Para los identificadores y algunos otros tokens, el patrón es

Identificador mi. Cadena 25 Para los identificadores y algunos otros tokens, el patrón es una estructura más compleja que se relaciona mediante muchas cadenas. En el caso de una palabra clave como token, el patrón es sólo la secuencia de caracteres que forman la palabra clave. Una letra seguida de números y/o letras

Ejemplo Token Const Relación Id Lexema const <, <=, != x, y, cont Patrón

Ejemplo Token Const Relación Id Lexema const <, <=, != x, y, cont Patrón const <|<=|!= Letras seguidas de otras letras y/o digitos

Tabla de símbolos Es un Array ampliable de registros que pueden ser indexados por

Tabla de símbolos Es un Array ampliable de registros que pueden ser indexados por una cadena en lugar de un entero. Se procesa de nuevo Se realiza la operación y se procede normalmente Operación(datos) Analizar Se realiza la operación Si No Se elimina de la tabla de símbolos y no se considera para procesos posteriores

La cadena es el identificador y el registro asociado contiene la información recogida sobre

La cadena es el identificador y el registro asociado contiene la información recogida sobre el identificador. 0 x 001 Div 0 x 005 Mod 0 x 009 i 0 x 001 0 x 002 0 x 003 0 x 004 0 x 005 0 x 006 0 x 007 0 x 008 0 x 009 0 x 010 d i v FDC m o d FDC i FDC

La interfaz básica de un módulo de tabla de símbolos consta de una sola

La interfaz básica de un módulo de tabla de símbolos consta de una sola función: FUNCTION Identificar (Nombre identificador) RETURNING un puntero a Info identificador;

Referencias Diseño de compiladores modernos Mc Graw Hill Dick Grune, Henri E. Bal, Ceriel

Referencias Diseño de compiladores modernos Mc Graw Hill Dick Grune, Henri E. Bal, Ceriel J. H. Jacobs y Koen G. Langendoen Compiladores principios, técnicas y herramientas Pearson Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman http: //tllz-andyisc. blogspot. mx/2010/08/resumen-compiladores. html www. angelfire. com/linux/eotto/comp_clase 2. pdf