1.48k likes | 1.6k Views
Traducción a Formatos Intermedios. 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
E N D
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 Oscar Bonilla2Universidad 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 Representaciónintermedia de alto nivel Representaciónintermedia debajo nivel Arbol de Parseo Código deMáquina Oscar Bonilla3Universidad 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. Oscar Bonilla4Universidad 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 Oscar Bonilla5Universidad Galileo
Ejemplos de Representación de Objetos y Ejecución de Programas Oscar Bonilla6Universidad Galileo
Ejemplo: Vector Class class vector { int v[]; void add(int x) { int i; i = 0; while (i < v.length) { v[i] = v[i]+x; i = i+1; } } } Oscar Bonilla7Universidad Galileo
Representando Arreglos • 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 3 7 4 8 Oscar Bonilla8Universidad 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 Oscar Bonilla9Universidad Galileo
Invocando el Método Add vect.add(1); • Crear Activation Record Método Add para Vector 3 7 4 8 Oscar Bonilla10Universidad 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 Oscar Bonilla11Universidad Galileo
Invocando el Método Add vect.add(1); • Crear Activation Record • this va al stack • Parámetros al stack this 1 x Método Add para Vector 3 7 4 8 Oscar Bonilla12Universidad 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 this 1 x i Método Add para Vector 3 7 4 8 Oscar Bonilla13Universidad 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; } this 1 x i Método Add para Vector 3 7 4 8 Oscar Bonilla14Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla15Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla16Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla17Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla18Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla19Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla20Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla21Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla22Universidad 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; } this 1 x 0 i Método Add para Vector 3 7 4 8 Oscar Bonilla23Universidad 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; } this 1 x 0 i Método Add para Vector 3 8 4 8 Oscar Bonilla24Universidad 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; } this 1 x 0 i Método Add para Vector 3 8 4 8 Oscar Bonilla25Universidad 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; } this 1 x 1 i Método Add para Vector 3 8 4 8 Oscar Bonilla26Universidad 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; } this 1 x 3 i Método Add para Vector 3 8 5 9 Oscar Bonilla27Universidad 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 Oscar Bonilla28Universidad Galileo
Ejemplo: Clase Point class point { int c; int getColor() { return(c); } int distance() { return(0); } } Oscar Bonilla29Universidad 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); } } Oscar Bonilla30Universidad Galileo
Dynamic Dispatch ¿Qué método distance es ejecutado? • Si p es point return(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! if (x == 0) { p = new point(); } else if (x < 0) { p = new cartesianPoint(); } else if (x > 0) { p = new polarPoint(); } y = p.distance(); Oscar Bonilla31Universidad Galileo
Implementando Dynamic Dispatch • Mecanismo Básico: Tabla de Métodos Tabla de métodos para objetos point Método getColor para point Método distance para point Tabla de métodospara objetoscartessianPoint Método getColor para point Método distance para cartesianPoint Tabla de métodospara objetospolarPoint Método getColor para point Método distance para polarPoint Método angle para polarPoint Oscar Bonilla32Universidad 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 polarPoint Método getColor para point c 2 Método distance para polarPoint r 1 Método angle para polarPoint t 2 Oscar Bonilla33Universidad Galileo
Objetos Point Método getColor para point c 2 Método distance para point Método getColor para point c 1 Método distance para cartesianPoint x 4 y 6 Método getColor para point c 4 Método distance para polarPoint r 1 Método angle para polarPoint t 3 Oscar Bonilla34Universidad 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 Oscar Bonilla35Universidad 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 Oscar Bonilla36Universidad 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 Oscar Bonilla37Universidad 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 Oscar Bonilla38Universidad 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 Oscar Bonilla39Universidad Galileo
Jerarquía en método add de vector Tabla de Símbolos paraCampos de clase vector v descriptor para campo v Tabla de Símbolospara Parámetros de add x descriptor para parámetro x this descriptor para this Tabla de Símbolospara Locales de add i descriptor para local i Oscar Bonilla40Universidad Galileo
Tabla de Símbolos del Programa • Mapea los nombres de clases a descriptores de clases • Implementación Típica: Tabla Hash vector class descriptor para vector point class descriptor para point cartesianPoint class descriptor para cartesianPoint polarPoint class descriptor para polarPoint Oscar Bonilla41Universidad 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 Oscar Bonilla42Universidad Galileo
Class Descriptors para point y cartesianPoint class descriptor para point c field descriptor para c getColor method descriptor para getColor x field descriptor para x y field descriptor para y distance method descriptor para distance class descriptor para cartesianPoint Oscar Bonilla43Universidad 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 Oscar Bonilla44Universidad Galileo
int int descriptor int [] array descriptor boolean boolean descriptor boolean [] array descriptor class descriptor para vector vector [] array descriptor Ejemplo Tabla de Símbolos de Tipos Oscar Bonilla45Universidad 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 Oscar Bonilla46Universidad Galileo
Method Descriptor para Método add field symbol table para vector class Tabla de símbolosde parámetros x parameter descriptor this this descriptor Method descriptor para add Tabla de símbolosde variables locales i local descriptor Código para método add Oscar Bonilla47Universidad 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 Oscar Bonilla48Universidad Galileo
class_decl vector field_decl int v [] v field descriptor x parameter descriptor add this this descriptor class descriptor para vector Method descriptor para add i local descriptor Código para método add int int descriptor int [] array descriptor boolean boolean descriptor boolean [] array descriptor vector [] array descriptor Oscar Bonilla49Universidad Galileo
Traduciendo de Parse Trees a Tablas de Símbolos Oscar Bonilla50Universidad Galileo