Generación de código
Tema 8
Generación de código
Ciencias de la Computación e Inteligencia Artificial
8. Generación de código
Índice
8.1 Visión general
8.2 Código de tres direcciones
8.3 Código asociado a las instrucciones comunes
2
Procesadores de lenguaje
1
8.1 Visión general
8. Generación de código
8.1.1 La arquitectura front-end/back-end
• El objetivofinal de un compilador es traducir el código fuente a
código máquina (o ensamblador) de la plataforma de destino.
• Muchos compiladores presentan una arquitectura dividida en
dos partes: front-end y back-end.
– El front-end realiza una traducción de código fuente a código
intermedio.
– El back-end realiza una traducción de código intermedio a código
máquina
• Esta división permitegenerar familias de compiladores que
comparten el front-end.
3
Procesadores de lenguaje
8.1 Visión general
8. Generación de código
8.1.2 Características del código intermedio
• Sus instrucciones corresponden básicamente a las
instrucciones generales de los procesadores
• Es independiente de la máquina (hasta cierto punto)
• No tiene en cuenta características como la
arquitectura delprocesador, el número de registros
del procesador o la funcionalidad de estos registros.
• Aunque se pueda expresar en modo texto, el código
intermedio se almacena en memoria en forma de
árbol (ASA)
El
d t t
Procesadores de lenguaje
tili
d
l
4
il d
2
8.1 Visión general
8. Generación de código
8.1.3 Otras opciones
• Lenguajes pseudointerpretados (Java). Elcompilador genera un
código binario de una máquina virtual. Este código es
interpretado en tiempo de ejecución.
• Traductores fuente-fuente. La idea es traducir un código fuente
a un lenguaje de alto nivel diferente (generalmente C) para el
que ya exista un compilador eficiente. Esta solución se aplica
comúnmente para lenguajes declarativos (Prolog, Haskell) o
para producir código paramicroprocesadores que se
distribuyan con un compilador de C.
5
Procesadores de lenguaje
8. Generación de código
8.2 Código de tres direcciones
8.2.1 Características generales
• Se suele tomar como código intermedio
• Está formado por instrucciones con un máximo de tres
direcciones: operando1, operando2 y resultado.
• Las instrucciones se representan por cuartetos: (operador,operando1, operando2, resultado).
• No todas las direcciones deben estar ocupadas. Existen
instrucciones con menos direcciones.
• Las instrucciones son muy parecidas a las de cualquier
ensamblador: sumas, restas, multiplicaciones, saltos
condicionales, saltos incondicionales, ...
6
Procesadores de lenguaje
3
8. Generación de código
8.2 Código de tres direcciones
8.2.1Características generales
• Las direcciones de memoria se gestionan de manera simbólica,
es decir, no se asigna un valor numérico a estas direcciones.
• No se trata de ningún estándar. Cada familia de compiladores
define su propia representación intermedia.
• Al diseñar un compilador hay total libertad a la hora de definir
las instrucciones del código intermedio.
• Por ejemplo, la familia de compiladoresgcc utiliza el código
intermedio RTL (Register Transfer Language). Los front-end de
C y C++ definen además otras representaciones previas
llamadas GENERIC y GIMPLE que facilitan la optimización.
7
Procesadores de lenguaje
8. Generación de código
8.2 Código de tres direcciones
8.2.2 Instrucciones típicas
• Instrucciones básicas:
– x := y op z (operación binaria aritmética ológica)
– x := op y
(operación unaria aritmética o lógica)
– x := y
(asignación simple)
– goto etiqueta (salto incondicional)
– if x oprelacional y goto etiqueta (salto condicional)
• Instrucciones de asignación con índice
– x[i] := y
– x := y[i]
8
Procesadores de lenguaje
4
8. Generación de código
8.2 Código de tres direcciones
8.2.2 Instrucciones típicas
•...
Regístrate para leer el documento completo.