Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de...

148
Compiladore s Traducción a Formatos Intermedios

Transcript of Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de...

Page 1: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

CompiladoresTraducción a Formatos

Intermedios

Page 2: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 2 Universidad Galileo

Resumen

• Metas de Representación de Programas

• Formato de datos en código en ejecución

• Tareas de Compilación

• Tablas de Símbolos

• Representación de Código de Alto Nivel

• Eliminando el Control de Flujo Estructurado

• Convirtiendo a un Espacio de Direcciones Plano

Page 3: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 3 Universidad Galileo

Metas de Representación de Programas

• Permitir el análisis y transformación del programa– Optimizaciones

• Estructurar la traducción a código de máquina– Secuencia de Pasos

Arbolde

Parseo

Representaciónintermedia de alto nivel

Representaciónintermedia debajo nivel

Código deMáquina

Page 4: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 4 Universidad Galileo

High Level IR

• Preserva la estructura de los Objetos• Adecuada para Optimizaciones Orientadas a Objetos

– Asignación Inline de Objetos

– Optimizaciones de Dynamic Dispatch

• Preserva el Control de Flujo Estructurado• Adecuada para Optimizaciones a nivel de Loops

– Bloquearse por Cache

– Loop Interchange, Fusion, Unrolling, etc.

Page 5: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 5 Universidad Galileo

Low Level IR

• Mueve el modelo de datos a un Espacio de Direcciones Plano

• Elimina el Control de Flujo Estructurado

• Adecuada para tareas de compilación de bajo nivel– Register Allocation– Instruction Selection

Page 6: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 6 Universidad Galileo

Ejemplos de Representación de Objetos y Ejecución de Programas

Page 7: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 7 Universidad Galileo

Ejemplo: Vector Classclass vector {

int v[];

void add(int x) {

int i;

i = 0;

while (i < v.length) { v[i] = v[i]+x; i = i+1; }

}

}

Page 8: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 8 Universidad Galileo

• Items almacenados contiguamente en memoria• Largo almacenado en la primera Word

• Código de Colores– Rojo – generado por el compilador automáticamente

– Azul, Amarillo, Rosado – datos o código de programa

– Magenta – datos o código de ejecución

Representando Arreglos

3 7 4 8

Page 9: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 9 Universidad Galileo

Representando Objetos Vector

• Primer Word apunta a información de la clase– Tabla de métodos

• Siguiente Word tiene campos (fields)– Para vectors, Primer Word es una referencia al array

Método add para vector

3 7 4 8

Page 10: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 10 Universidad Galileo

Invocando el Método Add

vect.add(1);

• Crear Activation Record

Método Add para Vector

3 7 4 8

Page 11: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 11 Universidad Galileo

Invocando el Método Add

vect.add(1);

• Crear Activation Record– this va al stack

this

Método Add para Vector

3 7 4 8

Page 12: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 12 Universidad Galileo

Invocando el Método Add

vect.add(1);

• Crear Activation Record– this va al stack– Parámetros al stack

1 xthis

Método Add para Vector

3 7 4 8

Page 13: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 13 Universidad Galileo

Invocando el Método Add

vect.add(1);

• Crear Activation Record– this va al stack– Parámetros al stack– Espacio para locales al stack

1 xi

this

Método Add para Vector

3 7 4 8

Page 14: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 14 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

1 xi

this

Método Add para Vector

3 7 4 8

Page 15: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 15 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 16: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 16 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 17: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 17 Universidad Galileo

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Ejecutando el Método Add

Page 18: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 18 Universidad Galileo

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Ejecutando el Método Add

Page 19: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 19 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 20: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 20 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 21: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 21 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 22: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 22 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 23: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 23 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 7 4 8

Page 24: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 24 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 8 4 8

Page 25: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 25 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

10

xi

this

Método Add para Vector

3 8 4 8

Page 26: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 26 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

11

xi

this

Método Add para Vector

3 8 4 8

Page 27: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 27 Universidad Galileo

Ejecutando el Método Add

void add(int x) {

int i;

i = 0;

while (i < v.length)

v[i] = v[i]+x;

i = i+1;

}

13

xi

this

Método Add para Vector

3 8 5 9

Page 28: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 28 Universidad Galileo

Tareas de Compilación

• Determinar el Formato de los Objetos y Arrays en Memoria

• Determinar el Formato del Stack de Llamada en Memoria

• Generar Código para Leer Valores– this, párametros, elementos de arreglo, campos de objetos

• Generar Código para Computar Nuevos Valores• Generar Código para Escribir Valores• Generar Código para Construcciones de Control

Page 29: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 29 Universidad Galileo

Ejemplo: Clase Point

class point {

int c;

int getColor() { return(c); }

int distance() { return(0); }

}

Page 30: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 30 Universidad Galileo

Subclases de Point

class cartesianPoint extends point{

int x, y;

int distance() { return(x*x + y*y); }

}

class polarPoint extends point {

int r, t;

int distance() { return(r*r); }

int angle() { return(t); }

}

Page 31: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 31 Universidad Galileo

Dynamic Dispatch

if (x == 0) {

p = new point();

} else if (x < 0) {

p = new cartesianPoint();

} else if (x > 0) {

p = new polarPoint();

}

y = p.distance();

¿Qué método distance es ejecutado?

• Si p es pointreturn(0)

• Si p es cartesianPoint return(x*x + y*y)

• Si p es polarPoint return(r*r)

• ¡Método Invocado depende del Tipo del Receptor!

Page 32: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 32 Universidad Galileo

Implementando Dynamic Dispatch

• Mecanismo Básico: Tabla de Métodos

Método getColor para pointMétodo distance para cartesianPoint

Método getColor para pointMétodo distance para polarPoint

Método getColor para pointMétodo distance para point

Tabla de métodospara objetos point

Tabla de métodospara objetoscartessianPoint

Tabla de métodospara objetospolarPoint Método angle para polarPoint

Page 33: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 33 Universidad Galileo

Implementando Object Fields

• Cada objeto es un pedazo contiguo de memoria

• Campos de la jerarquía de herencia asignados secuencialmente en un pedazo de memoria

• Primer word es un pointer a tabla de métodos

• Ejemplo: objeto polarPointMétodo getColor para point

2 Método distance para polarPoint12

crt

Método angle para polarPoint

Page 34: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 34 Universidad Galileo

Objetos Point

Método getColor para point1 Método distance para cartesianPoint

Método getColor para point4 Método distance para polarPoint

Método getColor para point2

13

46

Método distance para pointc

cxy

crt

Método angle para polarPoint

Page 35: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 35 Universidad Galileo

Invocando Métodos

• Compilador numera los métodos en cada jerarquía de herencia– getColor es Método 0– distance es Método 1– angle es Método 2

• Los puntos de invocación de Métodos accesan la entrada correspondiente en la tabla de métodos

Page 36: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 36 Universidad Galileo

Tareas de Compilación

• Determinar el Formato de Objetos en Memoria– Campos de las clases padres– Campos de la clase actual

• Numerar los Métodos y crear la Tabla de Métodos– Métodos de las clases padres– Métodos de la clase actual

• Generar Código para los Métodos– Accesos a Campos, Variables Locales y Parámetros– Invocaciones a Métodos

Page 37: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 37 Universidad Galileo

Tablas de Símbolos• Compilador usa información de la Tabla de

Símbolos para Producir– Layout de Objetos en Memoria– Tablas de Métodos– Código para accesar los Campos de Objetos,

Variables Locales y Parámetros

Page 38: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 38 Universidad Galileo

Tablas de Símbolos durante la traducción del Parse Tree al IR

• Tablas de Símbolos mapean identificadores (strings) a Descriptores (información acerca de los identificadores)

• Operación Básica: Lookup– Dado un string, encontrar el Descriptor

– Implementación Típica: Tabla Hash

• Ejemplos– Dado un nombre de clase, encontrar el descriptor de la clase

– Dado un nombre de variable, encontrar el descriptor• Descriptor local, descriptor de parámetro, descriptor de campo

Page 39: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 39 Universidad Galileo

Jerarquía de Tablas de Símbolos

• Jerarquía viene de– Scopes Anidados

• Scope Local dentro del Scope de Campos

– Herencia• Clases hijas dentro de una clase padre

• Tabla de Símbolos Jerárquica refleja estas jerarquías

• Lookup procede hacia arriba en la jerarquía hasta que se encuentre un descriptor

Page 40: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 40 Universidad Galileo

Jerarquía en método add de vector

i descriptor para local i

x descriptor para parámetro x

v descriptor para campo v

Tabla de Símbolos paraCampos de clase vector

Tabla de Símbolospara Parámetros de add

Tabla de Símbolospara Locales de add

this descriptor para this

Page 41: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 41 Universidad Galileo

Tabla de Símbolos del Programa

• Mapea los nombres de clases a descriptores de clases

• Implementación Típica: Tabla Hash

vectorpoint

cartesianPointpolarPoint

class descriptor para vectorclass descriptor para pointclass descriptor para cartesianPointclass descriptor para polarPoint

Page 42: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 42 Universidad Galileo

Class Descriptor

• Tabla de Símbolos para Métodos– Tabla de Símbolos Padre es la Tabla de Símbolos

de la Clase Padre

• Tabla de Símbolos para Campos– Tabla de Símbolos Padre es la Tabla de Símbolos

de la Clase Padre

• Referencia al Descriptor de la Clase Padre

Page 43: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 43 Universidad Galileo

Class Descriptors para point y cartesianPoint

yx field descriptor para x

field descriptor para y

distance method descriptor para distance

c field descriptor para c

getColor method descriptor para getColor

class descriptorpara point

class descriptorpara cartesianPoint

Page 44: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 44 Universidad Galileo

Descriptores de Campo, Parámetro, Local y Tipo

• Descriptores de Campo, Parámetro y Local se refieren a Descriptores de Tipo– Descriptores de Tipo Base: int, boolean– Descriptor de Tipo Array, que contiene referencia a

descriptor de tipo para elementos del array– Descriptor de Clase

• Descriptores de Tipo relativamente simples• Descriptores de Tipo Base y Descriptores de

Array guardados en Tabla de Símbolos de Tipos

Page 45: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 45 Universidad Galileo

Ejemplo Tabla de Símbolos de Tipos

boolean boolean descriptor

int int descriptorint [] array descriptor

boolean [] array descriptorvector [] array descriptor class descriptor

para vector

Page 46: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 46 Universidad Galileo

Descriptores de Método

• Contienen Referencia al Código para el Método

• Contienen Referencia a Tabla de Símbolos Local para Variables Locales al Método

• Tabla de Símbolos Padre de Tabla de Símbolos Local es la Tabla de Símbolos de Parámetros de los Parámetros del Método

Page 47: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 47 Universidad Galileo

Method Descriptor para Método add

this

i

this descriptor

local descriptor

field symbol tablepara vector class

Tabla de símbolosde variables locales

x

Tabla de símbolosde parámetros

parameter descriptor

Código para método add

Method descriptorpara add

Page 48: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 48 Universidad Galileo

Resumen de Tablas de Símbolos• Tabla de Símbolos del Programa (Descriptores de Clases) • Descriptores de Clases

Tabla de Símbolos de Campos (Descriptores de Campos) Tabla de Símbolos para SuperClass

Tabla de Símbolos de Métodos (Descriptores de Métodos) Tabla de Símbolos de Métodos para Superclass

• Descriptores de Métodos Tabla de Símbolos para Variables Locales (Descriptores de

Variable Local) Tabla de Símbolos de Parámetros (Descriptores de Parámetros)

Tabla de Símbolos de Campos de la Clase Receptora• Descriptores Locales, de Parámetros y de Campos

Descriptores de Tipo en Tabla de Símbolos de Tipo o Descriptores de Clase

Page 49: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 49 Universidad Galileo

v field descriptor

addclass descriptorpara vector

this

i

this descriptor

local descriptor

x parameter descriptor

Código para método add

Method descriptorpara add

boolean boolean descriptor

int int descriptorint [] array descriptor

boolean [] array descriptorvector [] array descriptor

class_decl

vector field_decl

int v []

Page 50: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 50 Universidad Galileo

Traduciendo de Parse Trees a Tablas de Símbolos

Page 51: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 51 Universidad Galileo

De Parse Trees a Tablas de Símbolos

• Recorrer recursivamente el Parse Tree

• Contruir la tabla de símbolos a medida que hacemos el recorrido

Page 52: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 52 Universidad Galileo

Recorriendo Declaraciones de Clases• Extraer Nombre de Clase y Nombre de Superclase• Crear Descriptor de Clase (tablas de símbolos de campos y

métodos), poner el descriptor en la Tabla de Símbolos de Clases• Poner Descriptores de Array en Tabla de Símbolos de Tipos• Buscar (lookup) el nombre de la Superclase en la Tabla de

Símbolos de Clases, hacer el link a la Superclase en el Descriptor de Clase al Descriptor de Clase Encontrado

• Recorrer Declaraciones de Campos para llenar la Tabla de Símbolos de Campos

• Recorrer Declaraciones de métodos para llenar la Tabla de Símbolos de Métodos

Page 53: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 53 Universidad Galileo

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

Page 54: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 54 Universidad Galileo

class descriptorpara vector

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

vector

Page 55: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 55 Universidad Galileo

v field descriptor

class descriptorpara vector

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

vector

Page 56: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 56 Universidad Galileo

v field descriptor

addclass descriptorpara vector

this this descriptor

Method descriptorpara add

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

vector

Page 57: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 57 Universidad Galileo

v field descriptor

addclass descriptorpara vector

this this descriptorx parameter descriptor

Method descriptorpara add

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

vector

Page 58: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 58 Universidad Galileo

v field descriptor

addclass descriptorpara vector

this

i

this descriptor

local descriptor

x parameter descriptor

Method descriptorpara add

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

class symboltable

vector

Page 59: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 59 Universidad Galileo

v field descriptor

addclass descriptorpara vector

this

i

this descriptor

local descriptor

x parameter descriptor

Method descriptorpara add

class_decl

vector field_decl

int v []

method_decl

add

int x

param_decl var_decl

int i

statements

Código para método add

class symboltable

vector

Page 60: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 60 Universidad Galileo

Representando Código en High-Level Intermediate

Representation

Page 61: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 61 Universidad Galileo

Idea Básica

• Moverse hacia lenguaje ensamblador• Preservar estructura de alto nivel

– Formato de objetos– Control de flujo estructurado– Distinción entre parámetros, locales y campos

• Abstracciones de alto nivel de lenguaje ensamblador– Nodos load y store– Acceso mediante locales, parámetros y campos

abstractos, no a directamente a memoria

Page 62: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 62 Universidad Galileo

Representando Expresiones• Expression Trees Representan Expressions

– Nodos Internos – Operaciones como +, -, etc.– Hojas – Nodos Load Representan Accesos a Variables

• Nodos Load– ldf nodo para accesos a campos – descriptor de campo

• (implícitamente accesa this – puede agregar una referencia al objeto accesado)

– ldl nodo para accesos a variables locales – descriptor local– ldp nodo para accesos a parámetros – descriptor de parámetro– lda nodo para accesos a arreglos

• expression tree para array• expression tree para índice

Page 63: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 63 Universidad Galileo

Ejemplo

x*x + y*y +

ldf

Descriptor de campo para xen tabla de símbolos de campospara clase cartesianPoint

*

ldf ldf

*

ldf

Descriptor de campo para yen tabla de símbolos de campospara clase cartesianPoint

Page 64: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 64 Universidad Galileo

Ejemplo

v[i]+x

lda

+

ldp

Descriptor de campo para v en tabla de símbolos de campos para clase vector

Descriptor localpara I en tabla de símboloslocales del método add de laclase vector

Descriptor de parámetropara x en tabla de símbolos deparámetros para método add declase vector

ldlldf

Page 65: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 65 Universidad Galileo

Caso Especial: Operador de Largo de Arreglo

• Nodo len representa el largo del arreglo– expression tree para array

• Ejemplo: v.lengthlen

descriptor de campo para ven tabla de símbolos de campospara clase vector

ldf

Page 66: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 66 Universidad Galileo

Representando Statements de Asignación

• Nodos Store– stf para stores a campos

• Descriptor de campo

• expression tree para valor guardado

– stl para stores a variables locales • Descriptor local

• expression tree para valor guardado

– sta para stores a elementos de array• expression tree para array

• expression tree para index

• expression tree para valor guardado

Page 67: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 67 Universidad Galileo

Ejemplov[i]=v[i]+x

lda

+

ldp

Descriptor de campopara v en tabla de símbolosde campos para clasevector

Descriptor local paraI en tabla de símbolosde locales para métodoadd de clase vector

Descriptor de parámetropara x en tabla de símbolosde parámetros para métodoadd de clase vector

ldl

sta

ldlldf

Page 68: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 68 Universidad Galileo

Representando Control de Flujo• Nodos de Statement

– Nodo sequence - primer statement, siguiente statement

– Nodo if• expression tree para condición• Nodo para statement then y nodo para statement else

– Nodo while• expression tree para condición• statement node para loop body

– Nodo return• expression tree para return value

Page 69: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 69 Universidad Galileo

Ejemplo

while (i < v.length)

v[i] = v[i]+x;

local descriptor para i

ldl

field descriptor para v parameter descriptor para x

while

<

len lda

+

ldp

ldl

sta

ldl

ldf

ldf

ldf

Page 70: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 70 Universidad Galileo

De Parse Trees a Representación Intermedia

Page 71: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 71 Universidad Galileo

De Parse Trees a Representación Intermedia

• Recorrer Recursivamente el Parse Tree• Construir la Representación Bottom-Up

– Buscar identificadores de variables en Tablas de Símbolos

– Construir Nodos Load para Accesar Variables

– Construir Expresiones a partir de Nodos Load y Nodos Operador

– Construir Nodos Store para Statements de Asignación

– Combinar Nodos Store con Nodos de Control de Flujo

Page 72: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 72 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

local descriptor para ifield descriptor para v parameter descriptor para x

Page 73: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 73 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

local descriptor para ifield descriptor para v parameter descriptor para x

Page 74: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 74 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 75: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 75 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl len

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 76: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 76 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 77: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 77 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len

ldfldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 78: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 78 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len

ldlldfldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 79: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 79 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda

ldlldfldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 80: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 80 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda ldp

ldlldfldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 81: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 81 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda

+

ldp

ldlldfldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 82: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 82 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda

+

ldp

ldlldf

ldf

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 83: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 83 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda

+

ldp

ldl

ldl

ldf

ldf

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 84: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 84 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

<

len lda

+

ldp

ldl

sta

ldl

ldf

ldf

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 85: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 85 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

while

<

len lda

+

ldp

ldl

sta

ldl

ldf

ldf

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 86: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 86 Universidad Galileo

while (i < v.length)

v[i] = v[i]+x;

ldl

while

<

len lda

+

ldp

ldl

sta

ldl

ldf

ldf

ldf

local descriptor para ifield descriptor para v parameter descriptor para x

Page 87: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 87 Universidad Galileo

Notación Abreviada

while (i < v.length)

v[i] = v[i]+x;

ldl i

while

<

len lda

+

ldp x

ldl i

sta

ldl i

ldf v

ldf v

ldf v

Page 88: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 88 Universidad Galileo

Conversión a Representación Intermedia de Bajo Nivel

• Convertir el Control de Flujo Estructurado a Control de Flujo por Saltos (Branches)– Conditional Branches

• Convertir el Modelo Estructurado de Memoria a Modelo Plano de Memoria– Stack Addressing para Locales– Flat Addressing para Campos– Flat Addressing para Arrays

Page 89: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 89 Universidad Galileo

MetaMantener la Independencia

de Máquina

PeroAcercarnos al Modelo de una

Máquina Estándar (espacio de direcciones plano, branches)

Page 90: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 90 Universidad Galileo

Convirtiendo el Control de Flujo Estructurado a Control de Flujo No

Estructurado

Page 91: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 91 Universidad Galileo

Representación del Programa

• Control Flow Graph (CFG)– Nodos CFG son Nodos de Instrucción

• Nodos stl, sta, stf, cbr nodes son instruction nodes

• Nodos ldl, lda, ldp, len, +, <, ... son expression nodes

– Aristas de CFG Representan el Flujo del Control– Divisiones (forks) en Instrucciones de Jump

Condicional– Uniones (merges) Cuándo el Control puede llegar a

un punto de múltiples formas– Nodos de Entrada y Salida (Entry & Exit Nodes)

Page 92: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 92 Universidad Galileo

ldl i

<

len

lda

+

ldp x

ldl i

sta

ldl i

ldf v

ldf v

ldf v

cbr

entry

exit

while (i < v.length)v[i] = v[i]+x;

Aristas deControl deFlujo

Aristas de Instrucción yExpresión

Page 93: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 93 Universidad Galileo

if (x < y) { a = 0;

} else { a = 1;

}

entry

ldl x ldl y

<

cbr

stl a 0 stl a 1

exit

Page 94: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 94 Universidad Galileo

Short-Circuit Conditionalswhile (i < v.length && v[i] != 0) {

i = i+1;}

entry

ldl i len

<

cbr

stl iexit

ldf v

lda 0

!=

cbr

ldf v ldl ildl i 0

+

Page 95: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 95 Universidad Galileo

Más Short-Circuit Conditionalsif (a < b || c != 0) {

i = i+1;}

entry

ldl a

<

cbr

stl i

exit

cbr

ldl i 0

+

ldl b

ldl c 0

!=

Page 96: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 96 Universidad Galileo

Rutinas para Desestructurar la Representación del Programa

destruct(n)genera forma de más bajo nivel para código representado por n retorna (b,e) - b es begin node, e es end node en forma desestructurada

shortcircuit(c, t, f)genera forma short-circuit del condicional representado por csi c es true, control va a nodo tsi c es false, control va a nodo fretorna b - b es begin node para evaluación de condición

Nuevo tipo de nodo - nop node

Page 97: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 97 Universidad Galileo

Desestructurando Seq Nodes destruct(n)

genera forma de más bajo nivel para código representado por n retorna (b,e) - b es begin node, e es end node en forma desestructuradasi n es de la forma seq x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y); 3: next(ex) = by; 4: return (bx, ey);

seq

x y

bx

ex by

ey

Page 98: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 98 Universidad Galileo

Desestructurando Seq Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma seq x y

1: (bx,ex) = destruct(x);

seq

x y

bx

ex

Page 99: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 99 Universidad Galileo

Desestructurando Seq Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma seq x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

seq

x y

bx

ex by

ey

Page 100: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 100 Universidad Galileo

Desestructurando Seq Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma seq x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: next(ex) = by;

seq

x y

bx

ex by

ey

Page 101: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 101 Universidad Galileo

Desestructurando Seq Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma seq x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: next(ex) = by; 4: return (bx, ey);

seq

x y

bx

ex by

ey

Page 102: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 102 Universidad Galileo

Desestructurando If Nodes destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: e = new nop; 4: next(ex) = e; 5: next(ey) = e;

6: bc = shortcircuit(c, bx, by); 7: return (bc, e);

if

c ybc

bx ex

ex by ey

Page 103: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 103 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x);

if

c y

bx ex

x

Page 104: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 104 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

if

c y

bx ex

x by ey

Page 105: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 105 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: e = new nop;

if

c y

bx ex

ex by ey

Page 106: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 106 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: e = new nop; 4: next(ex) = e; 5: next(ey) = e;

if

c y

bx ex

ex by ey

Page 107: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 107 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: e = new nop; 4: next(ex) = e; 5: next(ey) = e;

6: bc = shortcircuit(c, bx, by);

if

c ybc

bx ex

ex by ey

Page 108: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 108 Universidad Galileo

Desestructurando If Nodesdestruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma if c x y

1: (bx,ex) = destruct(x); 2: (by,ey) = destruct(y);

3: e = new nop; 4: next(ex) = e; 5: next(ey) = e;

6: bc = shortcircuit(c, bx, by); 7: return (bc, e);

if

c ybc

bx ex

ex by ey

Page 109: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 109 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop; 2: (bx,ex) = destruct(x);

3: bc = shortcircuit(c, bx, e); 4: next(ex) = bc; 5: return (bc, e);

while

c x

bc

ebx

ex

Page 110: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 110 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop;

while

c x

e

Page 111: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 111 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop; 2: (bx,ex) = destruct(x);

while

c x

ebx

ex

Page 112: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 112 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop; 2: (bx,ex) = destruct(x);

3: bc = shortcircuit(c, bx, e);

while

c x

bc

ebx

ex

Page 113: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 113 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop; 2: (bx,ex) = destruct(x);

3: bc = shortcircuit(c, bx, e); 4: next(ex) = bc;

while

c x

bc

ebx

ex

Page 114: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 114 Universidad Galileo

Desestructurando While Nodes

destruct(n)

genera forma de más bajo nivel para código representado por n

retorna (b,e) - b es begin node, e es end node en forma desestructurada

si n es de la forma while c x

1: e = new nop; 2: (bx,ex) = destruct(x);

3: bc = shortcircuit(c, bx, e); 4: next(ex) = bc; 5: return (bc, e);

while

c x

bc

ebx

ex

Page 115: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 115 Universidad Galileo

Shortcircuiting Condiciones “And”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 && c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, b2, f);

3: return (b1);

c1 && c2

b1

fb2

t

Page 116: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 116 Universidad Galileo

Shortcircuiting Condiciones “And”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 && c2

1: b2 = shortcircuit(c2, t, f);

c1 && c2

fb2

t

Page 117: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 117 Universidad Galileo

Shortcircuiting Condiciones “And”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 && c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, b2, f);

c1 && c2

b1

fb2

t

Page 118: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 118 Universidad Galileo

Shortcircuiting Condiciones “And”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 && c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, b2, f);

3: return (b1);

c1 && c2

b1

fb2

t

Page 119: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 119 Universidad Galileo

Shortcircuiting Condiciones “Or”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 || c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, t, b2);

3: return (b1);

c1 || c2

b1

f

b2t

Page 120: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 120 Universidad Galileo

Shortcircuiting Condiciones “Or”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 || c2

1: b2 = shortcircuit(c2, t, f);

c1 || c2

f

b2t

Page 121: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 121 Universidad Galileo

Shortcircuiting Condiciones “Or”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 || c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, t, b2);

c1 || c2

b1

f

b2t

Page 122: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 122 Universidad Galileo

Shortcircuiting Condiciones “Or”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma c1 || c2

1: b2 = shortcircuit(c2, t, f); 2: b1 = shortcircuit(c1, t, b2);

3: return (b1);

c1 || c2

b1

f

b2t

Page 123: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 123 Universidad Galileo

Shortcircuiting Condiciones “Not”

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma ! c1

1: b = shortcircuit(c1, f, t); return(b);

b

f t

! c1

Page 124: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 124 Universidad Galileo

Condiciones Computadas

shortcircuit(c, t, f)

genera forma short-circuit del condicional representado por c

retorna b - b es begin node para forma shortcircuit

si c es de la forma e1 < e2

1: b = new cbr(e1 < e2, t, f); 2: return (b);

e1 < e2

e1 e2

<

cbr

t f

Page 125: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 125 Universidad Galileo

Nops En Representación Desestructurada

while (i < v.length && v[i] != 0) { i = i+1;

}

entry

ldl i len

<

cbr

stl i

exit

ldf v

lda 0

!=

cbr

ldf v ldl ildl i 0

+

nop

Page 126: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 126 Universidad Galileo

Eliminando Nops Via Peephole Optimization

nop

... ...

Page 127: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 127 Universidad Galileo

Convirtiendo A Flat Address Space

Page 128: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 128 Universidad Galileo

Modelo de Memoria para Target Machine• Una sola memoria plana

– Compuesta de words– Direccionable por bytes

• Nodos Modelan Instrucciones Load y Store– ld addr,offset – resultado es contenido de memoria

en localidad addr+offset– st addr,offset,value - guarda value en localidad

addr+offset– Vamos a reemplazar nodos lda, ldf, ldl con nodos ld– Vamos a reemplazar nodos sta, stf, stl con nodos st

Page 129: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 129 Universidad Galileo

Layout de Memoria

Stack

Código Generado

HeapObjetos

Arreglos

locales(parámetros)

• ¿Cuándo se establece el código generado?

• ¿Cuándo crece ydisminuye el stack?

• ¿Cuándo crece ydisminuye el heap?

Page 130: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 130 Universidad Galileo

Parámetros

• La Mayoría de Máquinas tienen Convenciones de Llamado – Primer Parámetros en registro 5,

– Segundo Parámetro en registro 6, …

• Las Convenciones de Llamado varían entre máquinas• Asumimos que cada parámetro es un Word• Direccionamos los Parámetros por Número

– ldp <número de parámetro>

– this es el parámetro 0

Page 131: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 131 Universidad Galileo

Layouts de Objetos y Arrays

• Asignación Contigua para Objetos y Arrays• Campos Colocados Consecutivamente

– Tabla de Métodos en el Primer Word

• Elementos de Arrays Colocados Consecutivamente– Largo en Primer Word 3 7 4 8

Método getColor para point4 Método distance para polarPoint13

crt

Método angle para polarPoint

Page 132: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 132 Universidad Galileo

Accesando Campos

• Asumimos que this apunta al principio del objeto• ¿Cuál es la dirección del campo r?

– Asumimos que cada campo ocupa 4 bytes

• this+(2*4), o base+field offset

Método getColor para point4 Método distance para polarPoint13

crt

Método angle para polarPoint

this

Page 133: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 133 Universidad Galileo

Convirtiendo Nodos ldf a Nodos ld

• Computar los offsets de los campos– Recorrer la jerarquía de clase (tablas de símbolos de

campos)– Offsets para subclases comienzan donde terminan

los offsets de superclases– Guardar offsets en tabla de símbolos de campos

• Usar offsets para reemplazar nodos ldf con nodos ld

Page 134: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 134 Universidad Galileo

Cartesian Point Field Offsets

yx field descriptor para x (8)

field descriptor para y (12)

distance method descriptor para distance

c field descriptor para c (4)

getColor method descriptor para getColor

class descriptorpara point

class descriptorpara cartesianPoint

Page 135: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 135 Universidad Galileo

ldp 0

ld 8

ldp 0

ld 12

ldp 0

ld 12

ldp 0

ld 8

+ +

**

ldf

field descriptor para x (8)

+

ldf ldf

+

ldf

field descriptor para y (12)

Expresión Ejemplox*x + y*y

Page 136: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 136 Universidad Galileo

Accesando Elementos de Arrays

• Asumimos que variable array apunta al principio del array

• Elementos del array guardados contiguamente• No olvidar que el largo está al principio del array• ¿Cuál es la dirección de v[5]?• Asumimos enteros de 4 bytes• (dirección en v) + 4 + (5*4)• Base de Array + 4 + (índice * tamaño de elemento)

Page 137: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 137 Universidad Galileo

Convirtiendo Nodos lda a Nodos ld

• Computar Dirección de Elemento del Array– Base + 4 + (índice * tamaño de elemento)

• ld de esa dirección

• Offset de nodo ld es 0

• Optimización– Poner offset para saltarse el largo en instrucción ld

Page 138: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 138 Universidad Galileo

Ejemplo: v[5]+x

lda

+

ldp

field descriptor para v (4)

parameter descriptorpara x (1)

5ldf

ldp 0

ld 4 +

4 *

5 4

+

ld 0

+

ldp 1

Page 139: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 139 Universidad Galileo

Offset de Largo en Instrucción ld

lda

+

ldp

field descriptor para v (4)

parameter descriptorpara x (1)

5ldf

ldp 0

ld 4 *

5 4

+

ld 4

+

ldp 1

Page 140: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 140 Universidad Galileo

Variables Locales

• Asumimos que están asignadas en el stack

• Direccionamos usando offsets de un call stack pointer

• Recordar, el stack crece para abajo, no para arriba, así que los offsets son positivos

• Símbolo especial sp contiene el stack pointer

Page 141: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 141 Universidad Galileo

Acciones al Invocar un Método• Caller

– Arreglar los parámetros usando convención– Arreglar dirección de retorno usando convención– Saltar al callee

• Callee– Asignar stack frame = Decrementar stack pointer– Computar– Arreglar valor de retorno usando convención– Liberar stack frame = Incrementar stack pointer– Retornar al caller

Page 142: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 142 Universidad Galileo

Administración del Stack

• Computar tamaño del stack frame– Asignado al entrar al método

– Liberado al retornar

– Tiene las variables locales

– Más espacio para todos los parámetros

– Asumimos que todos los locales y parámetros miden un word

• Computar offsets de locales y parámetros– Guardar en tablas de símbolos de locales y parámetros

– Todavía usamos nodos ldp para accesar parámetros

Page 143: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 143 Universidad Galileo

Eliminando Nodos ldl

• Usamos los offsets en tabla de símbolos de locales y el sp

• Reemplazamos todos los nodos ldl con nodos ld

Page 144: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 144 Universidad Galileo

Ejemplo de Offsets de Locales y Parámetros

this

i

this descriptor (8)

local descriptor (4)

field symbol tablepara vector class

local variablesymbol table

x

parametersymbol table

parameter descriptor (12)

Código para método add

Method descriptorpara add

Page 145: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 145 Universidad Galileo

Ejemplo: v[i]+x

lda

+

ldp

field descriptor para v (4)

parameter descriptorpara x (1)

ldf

ldp 0

ld 4 *

4

+

ld 4

+

ldp 1

local descriptor para i (-4)

ldl

sp

ld 4

Page 146: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 146 Universidad Galileo

Nodos Enter y Nodos Exit para método add

void add(int x) {

int i;

...

}

• ¿Qué tan grande es el stack frame para add? – 12 bytes (espacio para this, x, i)– Asumiendo words de 4 bytes

enter 12

exit 12

....

Page 147: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 147 Universidad Galileo

ldp 0

ld 4 *

4

+

ld 4

+

ldp 1

sp

ld 4

ldp 0

ld 4 *

4

+

sp

ld 4

st 4

sp

ld 4

<

ldp 0

ld 4

Ejemplo con Direcciones

cbr

st 4

sp

ld 4+

1sp

st 4

sp 0

enter 12

exit 12

ld 0

Page 148: Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código.

Oscar Bonilla 148 Universidad Galileo

Resumen• Accesos a Campos se traducen a nodos ld o st

– Dirección es pointer a objeto, offset es offset de campo

• Accesos a arrays se traducen a nodos ld o st– Dirección es pointer a array + 4 + (índice * tamaño de

elemento)– Ponemos el offset del largo (4) en instrucción ld o st

• Accesos locales se traducen a nodos ld o st– Dirección es sp, offset es offset de la variable local

• Accesos a parámetros se traducen a– Instrucciones lpd – específicando el número de parámetro

• Nodos Enter y Nodos Exit especifican el tamaño del stack frame