Introducción A La Compilación - Página Personal De César Ignacio

Preview only show first 6 pages with water mark for full document please download

Transcript

Compilador Un Un compilador es un un programa programa que que traduce traduce un un compilador es programa llamado escrito en programa llamado programa un cierto cierto programa fuente fuente escrito en un lenguaje lenguaje denominado denominado lenguaje un programa lenguajefuente fuente aa un programa objeto en lenguaje Además el el compilador compilador emite emite objeto en lenguaje objeto. objeto. Además unos unos ciertos ciertos mensajes mensajes de de error. error. #gcc hello.c -o hello.exe -fsyntax-only hello.c: In function `main’: hello.c:3: ‘i’ undeclared hello.c:8: unterminated string of char Compilador hello.c:9: undefined reference to ‘print’ Programa fuente en lenguaje fuente Mensajes de error y diagnostico César Ignacio García Osorio. Universidad de Burgos. Ámbitos de utilización 1 • Los editores de texto de sintaxis resaltada, que facilitan la edición de programas. • Los programas formateadores de texto (como por ejemplo TeX y LaTeX, que a partir del documento y de los comandos de formateado permiten obtener un fichero adecuado para su visualización o impresión). • Verificadores estáticos de sintaxis (como lint) que permiten detectar muchos errores antes de la compilación. (Algo parecido a lo que se obtiene con la opción -fsyntax-only del compilador de GNU gcc). programas con sus propios lenguajes interpretados como Derive o Mathematica). • Lenguajes de macros de aplicaciones extensibles (Scheme en el mundo GNU y Visual Basic for Applications en el mundo Microsoft Windows). César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. ALeF. Introducción a los compiladores. 2 Ámbitos de utilización 2 Las Lastécnicas técnicasde deconstrucción construcciónde decompiladores compiladoresse seutilizan utilizan también tambiénen enotros otrosmuchos muchosámbitos ámbitos • Los interpretes (para lenguajes como Lisp o Basic, o para Programa objeto en lenguaje objeto 3 • Lenguajes de scripts y de “pegamento” (perl, tcl/tk, phyton) que permiten el rápido desarrollo de aplicaciones con partes escritas en distintos lenguajes. • El análisis de los ficheros de configuración requeridos en muchos modernos sistemas (ficheros .ini de Microsoft Windows o los ficheros de recursos de las X). • Compiladores de circuitos de silicio (que a partir de lenguajes especiales que describen el trazado de los circuitos impresos obtienen las máscaras para la obtención del circuito impreso mediante técnicas fotográficas). • Lenguajes de consulta a bases de datos. • Análisis de especificaciones de protocolos de comunicación en lenguajes formales de especificación (como el Abstract Syntax Notation ASN.1). César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 4 Ámbitos de utilización 3 Un poco de historia 1 • Primeras máquinas muy pequeñas y sencillas. Programadas usando secuencias de dígitos binarios. • En seguida se vio que era mucho mejor utilizar códigos nemotécnicos para las instrucciones máquina. Así nacieron los lenguajes ensambladores. Al principio traducidos a mano. • A finales de los 40 se vio que la traducción de los códigos nemotécnicos a código máquina la podían hacer los propios ordenadores mediante programas ensambladores. • Con el tiempo se desarrollaron lenguajes más complejos, conocidos como autocodes (autocódigos), permitían describir los programas de forma más concisa. Cada instrucción del autocode podía representar varias instrucciones en código máquina. Los programas para trasladar estos primeros lenguajes de alto nivel en código máquina eran más complejos que los ensambladores se llamaron compiladores. • Preprocesadores, procesan un texto fuente modificándolo en cierta forma previamente a la compilación. (Por ejemplo muchos compiladores admiten un conjunto de macroinstrucciones ajenas al lenguaje en sí que indican al compilador si tiene que incluir algún fichero externo, si ha de hacer o no un listado completo de la compilación, ...) • Traductores de lenguaje natural, serían los que tradujeran un lenguaje natural en otro, por ejemplo español a inglés. (Esto en la actualidad no se ha conseguido debido fundamentalmente a la ambigüedad del lenguaje natural. Los mayores logros en la materia siempre trabajan con un subconjunto del lenguaje natural, limitando las construcciones sintácticas válidas y/o el vocabulario. Este tema se aborda generalmente mediante técnicas de inteligencia artificial.) César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 5 Un poco de historia 2 6 Los Los lenguajes lenguajes de de alto alto nivel nivel compilados compilados están están en en la la actualidad actualidad bien bien establecidos. establecidos. dimensiones de un array estaba limitado a 3, en parte porque la máquina objetivo, la IBM 709, tenía sólo 3 registros para indexar los arrays. Incluso en C, diseñado a mediado de los 70, el operador de incremento ++, estaba motivado por la existencia del código máquina equivalente en la PDP-11). Ventajas • Algol 60, que en realidad apareció en el 58, fue el precursor de un nuevo enfoque en el diseño de lenguajes de alto nivel. Se diseñó teniendo en mente la resolución de problemas y se ignoraron las cuestiones relativas a como debería ser traducido para ejecutarse en una máquina real. Desventajas • Mejora de productividad • Programas mas lentos que de los programadores los obtenidos en ensamblador • Reducción de errores lógicos • Mayor tamaño de los programas obtenidos • Facilidad de depurado La Lamayoría mayoríade delos loslenguajes lenguajesmodernos modernoshan hansido sidodiseñados diseñados independientemente independientementede deuna unaarquitectura arquitecturade demáquina máquinaconcreta. concreta. ALeF. Introducción a los compiladores. ALeF. Introducción a los compiladores. Uso de lenguajes de alto nivel • Durante los 50 los lenguajes de alto nivel evolucionaron para describir los problemas independientemente del código máquina de los ordenadores utilizados (Por ejemplo, en FORTRAN IV el número máximo de César Ignacio García Osorio. Universidad de Burgos. César Ignacio García Osorio. Universidad de Burgos. 7 César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 8 Estructura de un compilador 1 Interpretar versus compilar Front end o etapa inicial • Hay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel. – Compilación: traducirlo todo el programa a otro programa equivalente en código máquina del ordenador. Entonces se ejecuta el programa obtenido. – Interpretación: interpretar las instrucciones del programa escrito en lenguaje de alto nivel y ejecutarlas una por una. Interprete Compilador • Fácil localización de errores. • Difícil localización de errores. • Cada vez que se ejecuta el • Sólo es necesaria una programa es necesaria su compilación. Y una vez realizada, la velocidad de ejecución es alta. interpretación. • Adecuado en la etapa de • Adecuado cuando no hay más desarrollo y depuración. errores (etapa de explotación) Back end o etapa final César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 9 Estructura de un compilador 2 10 • La etapa de análisis (front end o etapa inicial) agrupa aquellas fases que dependen principalmente del lenguaje fuente, fuente y comprende: En Enlalapráctica prácticase sepueden puedenagrupar agruparalgunas algunasfases, fases,yylas lasrepresentaciones representacionesintermedias intermedias entre las fases agrupadas no necesitan ser construidas entre las fases agrupadas no necesitan ser construidasexplícitamente. explícitamente. – El analizador léxico (también llamada scanner): agrupar los caracteres individuales en entidades lógicas. – El analizador sintáctico (también llamado parser) analiza la estructura general de todo el programa, agrupando las entidades simples identificadas por el scanner en construcciones mayores, como sentencias, bucles, rutinas, que componen el programa completo. Normalmente se utiliza la representación de árboles sintácticos para reflejar dicha estructura. – Una vez determinada la estructura del programa se puede analizar su significado (semántica) mediante el analizador semántico. Se determina que variables almacenaran enteros, cuales número en coma flotante, si el acceso a los arrays cae dentro del rango fijado en su definición, ... , etc. front end = a. léxico + a. sintáctico + a. semántico (middle end = generación de código intermedio) back end = opt. de cod. intermedio + gen. de cod. + opt. de cod • Si el front end (etapa de análisis o etapa inicial), que comprende aquellas fases que dependen principalmente del lenguaje fuente, se diseña adecuadamente. Es posible usar distintos back end (etapa de síntesis o etapa final), que incluye las fases que dependen de la máquina objeto, de modo que se puede obtener código para distintas máquinas. ALeF. Introducción a los compiladores. ALeF. Introducción a los compiladores. Etapa de análisis • El proceso de compilación se puede dividir en una serie de fases, que pueden llevarse a cabo simultáneamente o consecutivamente y cada una de las cuales transforma el programa fuente de una representación en otra. César Ignacio García Osorio. Universidad de Burgos. César Ignacio García Osorio. Universidad de Burgos. 11 César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 12 El manejador de errores y el administrador de la tabla de símbolos Etapa de síntesis • La etapa de síntesis (back end o etapa final) agrupa aquellas fases que dependen principalmente de la máquina objetivo, objetivo y comprende: • Un compilador tiene que tener un determinado comportamiento ante programas erróneos. Este proceso se agrupa en una fase llamada manejador de errores. Cada una de las fases anteriores interacciona con el manejador de errores. • Otro elemento en la compilación es la tabla de símbolos a la que acceden cada una de las fases a través del administrador de la tabla de símbolos . En la tabla de símbolos se almacena información sobre los distintos identificadores. (De variables, constantes, funciones y procedimientos, – El optimizador de código intermedio que transforma la representación intermedia en otra equivalente pero más eficiente. – El generador de código genera un programa equivalente para su ejecución en la máquina objetivo, añadiéndole posiblemente rutinas de biblioteca y código de inicialización. – Finalmente puede haber un optimizador de código para mejorar aún más el código generado. como: tipo, memoria asignada, ámbito, alcance, ..., etc. Las fases anteriores introducen estas información sobre los identificadores en la tabla de símbolos y después la utilizan de varias formas). César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 13 César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 14 Proceso de compilación 1 Entorno de trabajo de un compilador posicion := inicial + vel * 2 Analizador léxico id1 := id2 + id3 * 2 Analizador sintáctico temp1 temp2 temp3 id1:= + * id3 TABLA DE SÍMBOLOS posición ... inicial ... vel ... Editor Generador de código intermedio := id1 id 2 1 2 3 4 2 estructura del programa fuente := entareal(2) := id3 + temp1 := id2 + temp2 temp3 Preprocesador programa fuente Analizador semántico Optimizador de código intermedio temp1 := id3 * 2.0 id1:= id2 + temp1 := id1 id 2 + * id3 entareal Generador de código MOVF MULF MOVF ADDF MOVF Compilador id3, R2 #60.0, R2 id2, R1 R2, R1 R1, id1 programa objeto en lenguaje ensamblador código máquina relocalizable Editor de carga y enlace biblioteca. archivos objeto relocalizables Ejecutable 2 César Ignacio García Osorio. Universidad de Burgos. Ensamblador ALeF. Introducción a los compiladores. 15 César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 16 Construcción de un compilador Herramientas • Herramientas formales: • En la construcción de un compilador se puede proceder siguiendo varios enfoques, pudiéndose escribir: – Gramáticas. – Máquinas de Turing. – Autómatas finitos deterministas y no deterministas. – Autómatas de pila. – Análisis LL, LR, SLR y LALR. – en lenguaje ensamblador, con lo que se consiguen compiladores muy eficientes pero difíciles de mantener. – en un lenguaje de alto nivel, con lo que se hace más fácil el mantenimiento, pero aún requiere mucho tiempo de desarrollo. – utilizando herramientas de construcción de compiladores como lex y yacc. César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. • Herramientas de programación: – Lex/flex – Yacc/bison 17 César Ignacio García Osorio. Universidad de Burgos. ALeF. Introducción a los compiladores. 18