Está en la página 1de 10

#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 hello.

c:9: undefined reference to print

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

Programa fuente en lenguaje fuente

Mensajes de error y diagnostico

Programa objeto en lenguaje objeto


ALeF. Introduccin a los compiladores. 2

Csar Ignacio Garca Osorio. Universidad de Burgos.

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).

Los interpretes (para lenguajes como Lisp o Basic, o para


lenguajes interpretados como Derive o Mathematica).

programas con sus propios

Lenguajes de macros de aplicaciones extensibles (Scheme en el mundo


GNU y Visual Basic for Applications en el mundo Microsoft Windows).
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 3

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).

Compiladores de circuitos de silicio (que a partir de lenguajes especiales


que describen el trazado de los circuitos impresos obtienen las mscaras para la obtencin del circuito impreso mediante tcnicas fotogrficas).

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.)

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

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.

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los 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

Uso de lenguajes de alto nivel


Los Los lenguajes lenguajes de de alto alto nivel nivel compilados compilados estn estn en en la la actualidad actualidad bien bien establecidos. establecidos.
Ventajas Desventajas

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

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

Interpretar versus compilar


Hay dos maneras de ejecutar un programa escrito en un lenguaje de alto nivel.
Compilacin: traducirlo todo el programa a otro programa equivalente en cdigo mquina del ordenador. Entonces se ejecuta el programa obtenido. Interpretacin: interpretar las instrucciones del programa escrito en lenguaje de alto nivel y ejecutarlas una por una.

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)

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

Estructura de un compilador 1
Front end o etapa inicial

Back end o etapa final

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

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

(middle end = generacin de cdigo intermedio)


back end = opt. de cod. intermedio + gen. de cod. + opt. de cod Si el front end (etapa de anlisis o etapa inicial), que comprende aquellas fases que dependen principalmente del lenguaje fuente, se disea adecuadamente. Es posible usar distintos back end (etapa de sntesis o etapa final), que incluye las fases que dependen de la mquina objeto, de modo que se puede obtener cdigo para distintas mquinas.
ALeF. Introduccin a los compiladores. 11

Csar Ignacio Garca Osorio. Universidad de Burgos.

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.

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

13

El manejador de errores y el administrador de la tabla de smbolos


Un compilador tiene que tener un determinado comportamiento ante programas errneos. 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 compilacin es la tabla de smbolos a la que acceden cada una de las fases a travs del administrador de la tabla de smbolos . En la tabla de smbolos se almacena informacin sobre los distintos identificadores. (De variables, constantes, funciones y procedimientos,
como: tipo, memoria asignada, mbito, alcance, ..., etc. Las fases anteriores introducen estas informacin sobre los identificadores en la tabla de smbolos y despus la utilizan de varias formas).
Csar Ignacio Garca Osorio. Universidad de Burgos. ALeF. Introduccin a los compiladores. 14

Proceso de compilacin 1
posicion := inicial + vel * 2

Analizador lxico id1 := id2 + id3 * const Analizador sintctico


:= + *

<ident, posicion> <oper, :=> <ident, inicial> <oper, +> <ident, vel> <oper, *> <const, 2>

1 2 3 4

TABLA DE SMBOLOS posicin ... inicial ... vel ...

Generador de cdigo intermedio


temp1 temp2 temp3 temp4 id1:= := 2 := entareal(temp1) := id3 * temp2 := id2 + temp3 temp4

id1 id 2

id3

const

Analizador semntico Optimizador de cdigo intermedio


:= + * temp1 := id3 * 2.0 id1:= id2 + temp1 entareal const

Generador de cdigo
MOVF MULF MOVF ADDF MOVF id3, R2 #2.0, R2 id2, R1 R2, R1 R1, id1

id1 id 2

id3

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

15

Entorno de trabajo de un compilador


Editor
estructura del programa fuente

Preprocesador
programa fuente

Ensamblador
cdigo mquina relocalizable

Compilador
programa objeto en lenguaje ensamblador

Editor de carga y enlace Ejecutable

biblioteca. archivos objeto relocalizables

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

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)

Generadores de analizadores lxicos


Generan automticamente analizadores lxicos partiendo de una especificacin basada en expresiones regulares (ej. lex, flex, JavaCC)

Generadores de rboles sintcticos


Proporcionan medios para facilitar la creacin de rboles sintcticos (ej. JJTree, JTB)

Dispositivos de traduccin dirigida por la sintaxis


Producen grupos de rutinas que recorren el rbol de anlisis sintctico generando cdigo intermedio

Generadores automticos de cdigo


Toman un conjunto de reglas que definen la traduccin de cada operacin del lenguaje intermedio al lenguaje mquina objeto. La tcnica fundamental es la concordancia de plantillas.

Dispositivos para anlisis de flujo de datos


Permiten la optimizacin de cdigo en funcin de una recoleccin de informacin sobre la forma en que se transmiten los valores de una parte de un programa a cada una de las otras partes.

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

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

Csar Ignacio Garca Osorio. Universidad de Burgos.

ALeF. Introduccin a los compiladores.

19

También podría gustarte