Introducción a la compilación - Página personal de César Ignacio

Anuncio
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
<ident, posicion> <oper, :=>
<ident, inicial> <oper, +> <ident, vel>
<oper, *> <const, 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
Descargar