Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Compilador
Un Un compilador compilador es es un un programa programa que que traduce traduce un un programa programa llamado llamado programa programa fuente fuente escrito escrito en en un un cierto cierto lenguaje lenguaje denominado denominado lenguaje lenguaje fuente fuente a a un un programa programa objeto .. Adems objeto en en lenguaje lenguaje objeto objeto Adems el el compilador compilador emite emite unos .. unos ciertos ciertos mensajes mensajes de de error error
Compilador
mbitos de utilizacin 1
Las Lastcnicas tcnicasde deconstruccin construccinde decompiladores compiladoresse seutilizan utilizan tambin tambinen enotros otrosmuchos muchosmbitos mbitos Los editores de texto de sintaxis resaltada, que facilitan la edicin 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 visualizacin o impresin).
Verificadores estticos de sintaxis (como lint) que permiten detectar muchos errores antes de la compilacin. (Algo parecido a lo que se
obtiene con la opcin -fsyntax-only del compilador de GNU gcc).
mbitos de utilizacin 2
Lenguajes de scripts y de pegamento (perl, tcl/tk, phyton) que permiten el rpido desarrollo de aplicaciones con partes escritas en distintos lenguajes. El anlisis de los ficheros de configuracin requeridos en muchos modernos sistemas (ficheros .ini de Microsoft Windows o los
ficheros de recursos de las X).
Lenguajes de consulta a bases de datos. Anlisis de especificaciones de protocolos de comunicacin en lenguajes formales de especificacin (como el Abstract Syntax Notation ASN.1).
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 4
mbitos de utilizacin 3
Preprocesadores, procesan un texto fuente modificndolo en cierta forma previamente a la compilacin. (Por ejemplo
muchos compiladores admiten un conjunto de macroinstrucciones ajenas al lenguaje en s que indican al compilador si tiene que incluir algn fichero externo, si ha de hacer o no un listado completo de la compilacin, ...)(ej. Qt)
Traductores de lenguaje natural, seran los que tradujeran un lenguaje natural en otro, por ejemplo espaol a ingls. (Esto en la actualidad no se ha conseguido debido
fundamentalmente a la ambigedad del lenguaje natural. Los mayores logros en la materia siempre trabajan con un subconjunto del lenguaje natural, limitando las construcciones sintcticas vlidas y/o el vocabulario. Este tema se aborda generalmente mediante tcnicas de inteligencia artificial.)
Un poco de historia 1
Primeras mquinas muy pequeas y sencillas. Programadas usando secuencias de dgitos binarios. En seguida se vio que era mucho mejor utilizar cdigos nemotcnicos para las instrucciones mquina. As nacieron los lenguajes ensambladores. Al principio traducidos a mano. A finales de los 40 se vio que la traduccin de los cdigos nemotcnicos a cdigo mquina la podan hacer los propios ordenadores mediante programas ensambladores. Con el tiempo se desarrollaron lenguajes ms complejos, conocidos como autocodes (autocdigos), permitan describir los programas de forma ms concisa. Cada instruccin del autocode poda representar varias instrucciones en cdigo mquina. Los programas para trasladar estos primeros lenguajes de alto nivel en cdigo mquina eran ms complejos que los ensambladores se llamaron compiladores.
Un poco de historia 2
Durante los 50 los lenguajes de alto nivel evolucionaron para describir los problemas independientemente del cdigo mquina de los ordenadores utilizados (Por ejemplo, en FORTRAN IV el nmero mximo de
dimensiones de un array estaba limitado a 3, en parte porque la mquina objetivo, la IBM 709, tena slo 3 registros para indexar los arrays. Incluso en C, diseado a mediado de los 70, el operador de incremento ++, estaba motivado por la existencia del cdigo mquina equivalente en la PDP-11).
Algol 60, que en realidad apareci en el 58, fue el precursor de un nuevo enfoque en el diseo de lenguajes de alto nivel. Se dise teniendo en mente la resolucin de problemas y se ignoraron las cuestiones relativas a como debera ser traducido para ejecutarse en una mquina real.
La Lamayora mayorade delos loslenguajes lenguajesmodernos modernoshan hansido sidodiseados diseados independientemente independientementede deuna unaarquitectura arquitecturade demquina mquinaconcreta. concreta.
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 7
Mejora de productividad Programas mas lentos que los obtenidos en de los programadores ensamblador Reduccin de errores lgicos Mayor tamao de los programas obtenidos Facilidad de depurado
Interprete
Compilador
Fcil localizacin de errores. Difcil localizacin de errores. Cada vez que se ejecuta el Slo es necesaria una programa es necesaria su compilacin. Y una vez realizada, interpretacin. la velocidad de ejecucin es alta. Adecuado en la etapa de Adecuado cuando no hay ms desarrollo y depuracin. errores (etapa de explotacin)
Estructura de un compilador 1
Front end o etapa inicial
10
Estructura de un compilador 2
El proceso de compilacin se puede dividir en una serie de fases, que pueden llevarse a cabo simultneamente o consecutivamente y cada una de las cuales transforma el programa fuente de una representacin en otra.
En Enla laprctica prcticase sepueden puedenagrupar agruparalgunas algunasfases, fases,yylas lasrepresentaciones representacionesintermedias intermedias entre las fases agrupadas no necesitan ser construidas explcitamente. entre las fases agrupadas no necesitan ser construidas explcitamente. front end = a. lxico + a. sintctico + a. semntico
Etapa de anlisis
La etapa de anlisis (front end o etapa inicial) agrupa aquellas fases que dependen principalmente del lenguaje fuente, fuente y comprende:
El analizador lxico (tambin llamada scanner): agrupar los caracteres individuales en entidades lgicas. El analizador sintctico (tambin 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 representacin de rboles sintcticos para reflejar dicha estructura. Una vez determinada la estructura del programa se puede analizar su significado (semntica) mediante el analizador semntico. Se determina que variables almacenaran enteros, cuales nmero en coma flotante, si el acceso a los arrays cae dentro del rango fijado en su definicin, ... , etc.
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 12
Etapa de sntesis
La etapa de sntesis (back end o etapa final) agrupa aquellas fases que dependen principalmente de la mquina objetivo, objetivo y comprende:
El optimizador de cdigo intermedio que transforma la representacin intermedia en otra equivalente pero ms eficiente. El generador de cdigo genera un programa equivalente para su ejecucin en la mquina objetivo, aadindole posiblemente rutinas de biblioteca y cdigo de inicializacin. Finalmente puede haber un optimizador de cdigo para mejorar an ms el cdigo generado.
13
Proceso de compilacin 1
posicion := inicial + vel * 2
<ident, posicion> <oper, :=> <ident, inicial> <oper, +> <ident, vel> <oper, *> <const, 2>
1 2 3 4
id1 id 2
id3
const
Generador de cdigo
MOVF MULF MOVF ADDF MOVF id3, R2 #2.0, R2 id2, R1 R2, R1 R1, id1
id1 id 2
id3
15
Preprocesador
programa fuente
Ensamblador
cdigo mquina relocalizable
Compilador
programa objeto en lenguaje ensamblador
16
Construccin de un compilador
En la construccin de un compilador se puede proceder siguiendo varios enfoques, pudindose escribir:
en lenguaje ensamblador, con lo que se consiguen compiladores muy eficientes pero difciles de mantener. en un lenguaje de alto nivel, con lo que se hace ms fcil el mantenimiento, pero an requiere mucho tiempo de desarrollo. utilizando herramientas de construccin de compiladores como flex, bison, JavaCC, JJTree, JTB.
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 17
Herramientas
Generadores de analizadores sintcticos
Producen analizadores sintcticos partiendo de una gramtica independiente del contexto (ej. yacc, bison, JavaCC)
18
Herramientas
Herramientas formales:
Gramticas. Mquinas de Turing. Autmatas finitos deterministas y no deterministas. Autmatas de pila. Anlisis LL, LR, SLR y LALR.
Herramientas de programacin:
Lex/flex Yacc/bison
19