Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porGuilermo Tobias Modificado hace 10 años
1
Compiladores Traducción a Formatos Intermedios
2
Oscar Bonilla 2Universidad 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
3
Oscar Bonilla 3Universidad 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 Arbol de Parseo Representación intermedia de alto nivel Representación intermedia de bajo nivel Código de Máquina
4
Oscar Bonilla 4Universidad 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.
5
Oscar Bonilla 5Universidad 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
6
Oscar Bonilla 6Universidad Galileo Ejemplos de Representación de Objetos y Ejecución de Programas
7
Oscar Bonilla 7Universidad 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; } }
8
Oscar Bonilla 8Universidad 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 3748
9
Oscar Bonilla 9Universidad 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 3748
10
Oscar Bonilla 10Universidad Galileo Invocando el Método Add vect.add(1); Crear Activation Record Método Add para Vector 3748
11
Oscar Bonilla 11Universidad Galileo Invocando el Método Add vect.add(1); Crear Activation Record –this va al stack this Método Add para Vector 3748
12
Oscar Bonilla 12Universidad Galileo Invocando el Método Add vect.add(1); Crear Activation Record –this va al stack –Parámetros al stack 1 x this Método Add para Vector 3748
13
Oscar Bonilla 13Universidad 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 x i this Método Add para Vector 3748
14
Oscar Bonilla 14Universidad 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 x i this Método Add para Vector 3748
15
Oscar Bonilla 15Universidad 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 0 x i this Método Add para Vector 3748
16
Oscar Bonilla 16Universidad 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 0 x i this Método Add para Vector 3748
17
Oscar Bonilla 17Universidad Galileo void add(int x) { int i; i = 0; while (i < v.length) v[i] = v[i]+x; i = i+1; } 1 0 x i this Método Add para Vector 3748 Ejecutando el Método Add
18
Oscar Bonilla 18Universidad Galileo void add(int x) { int i; i = 0; while (i < v.length) v[i] = v[i]+x; i = i+1; } 1 0 x i this Método Add para Vector 3748 Ejecutando el Método Add
19
Oscar Bonilla 19Universidad 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 0 x i this Método Add para Vector 3748
20
Oscar Bonilla 20Universidad 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 0 x i this Método Add para Vector 3748
21
Oscar Bonilla 21Universidad 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 0 x i this Método Add para Vector 3748
22
Oscar Bonilla 22Universidad 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 0 x i this Método Add para Vector 3748
23
Oscar Bonilla 23Universidad 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 0 x i this Método Add para Vector 3748
24
Oscar Bonilla 24Universidad 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 0 x i this Método Add para Vector 3848
25
Oscar Bonilla 25Universidad 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 0 x i this Método Add para Vector 3848
26
Oscar Bonilla 26Universidad 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 1 x i this Método Add para Vector 3848
27
Oscar Bonilla 27Universidad 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 3 x i this Método Add para Vector 3859
28
Oscar Bonilla 28Universidad 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
29
Oscar Bonilla 29Universidad Galileo Ejemplo: Clase Point class point { int c; int getColor() { return(c); } int distance() { return(0); } }
30
Oscar Bonilla 30Universidad 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); } }
31
Oscar Bonilla 31Universidad 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 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!
32
Oscar Bonilla 32Universidad Galileo Implementando Dynamic Dispatch Mecanismo Básico: Tabla de Métodos Método getColor para point Método distance para cartesianPoint Método getColor para point Método distance para polarPoint Método getColor para point Método distance para point Tabla de métodos para objetos point Tabla de métodos para objetos cartessianPoint Tabla de métodos para objetos polarPoint Método angle para polarPoint
33
Oscar Bonilla 33Universidad 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 2 Método distance para polarPoint 1 2 c r t Método angle para polarPoint
34
Oscar Bonilla 34Universidad Galileo Objetos Point Método getColor para point 1 Método distance para cartesianPoint Método getColor para point 4 Método distance para polarPoint Método getColor para point 2 1 3 4 6 Método distance para point c c x y c r t Método angle para polarPoint
35
Oscar Bonilla 35Universidad 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
36
Oscar Bonilla 36Universidad 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
37
Oscar Bonilla 37Universidad 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
38
Oscar Bonilla 38Universidad 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
39
Oscar Bonilla 39Universidad 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
40
Oscar Bonilla 40Universidad 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 para Campos de clase vector Tabla de Símbolos para Parámetros de add Tabla de Símbolos para Locales de add this descriptor para this
41
Oscar Bonilla 41Universidad Galileo Tabla de Símbolos del Programa Mapea los nombres de clases a descriptores de clases Implementación Típica: Tabla Hash vector point cartesianPoint polarPoint class descriptor para vector class descriptor para point class descriptor para cartesianPoint class descriptor para polarPoint
42
Oscar Bonilla 42Universidad 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
43
Oscar Bonilla 43Universidad Galileo Class Descriptors para point y cartesianPoint y x field descriptor para x field descriptor para y distance method descriptor para distance c field descriptor para c getColor method descriptor para getColor class descriptor para point class descriptor para cartesianPoint
44
Oscar Bonilla 44Universidad 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
45
Oscar Bonilla 45Universidad Galileo Ejemplo Tabla de Símbolos de Tipos boolean boolean descriptor int int descriptor int [] array descriptor boolean [] array descriptor vector [] array descriptor class descriptor para vector
46
Oscar Bonilla 46Universidad 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
47
Oscar Bonilla 47Universidad Galileo Method Descriptor para Método add this i this descriptor local descriptor field symbol table para vector class Tabla de símbolos de variables locales x Tabla de símbolos de parámetros parameter descriptor Código para método add Method descriptor para add
48
Oscar Bonilla 48Universidad 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
49
Oscar Bonilla 49Universidad Galileo v field descriptor add class descriptor para vector this i this descriptor local descriptor x parameter descriptor Código para método add Method descriptor para add boolean boolean descriptor int int descriptor int [] array descriptor boolean [] array descriptor vector [] array descriptor class_decl vectorfield_decl intv[]
50
Oscar Bonilla 50Universidad Galileo Traduciendo de Parse Trees a Tablas de Símbolos
51
Oscar Bonilla 51Universidad 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
52
Oscar Bonilla 52Universidad 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
53
Oscar Bonilla 53Universidad Galileo class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table
54
Oscar Bonilla 54Universidad Galileo class descriptor para vector class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table vector
55
Oscar Bonilla 55Universidad Galileo v field descriptor class descriptor para vector class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table vector
56
Oscar Bonilla 56Universidad Galileo v field descriptor add class descriptor para vector this this descriptor Method descriptor para add class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table vector
57
Oscar Bonilla 57Universidad Galileo v field descriptor add class descriptor para vector this this descriptor x parameter descriptor Method descriptor para add class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table vector
58
Oscar Bonilla 58Universidad Galileo v field descriptor add class descriptor para vector this i this descriptor local descriptor x parameter descriptor Method descriptor para add class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements class symbol table vector
59
Oscar Bonilla 59Universidad Galileo v field descriptor add class descriptor para vector this i this descriptor local descriptor x parameter descriptor Method descriptor para add class_decl vectorfield_decl intv[] method_decl add intx param_declvar_decl inti statements Código para método add class symbol table vector
60
Oscar Bonilla 60Universidad Galileo Representando Código en High-Level Intermediate Representation
61
Oscar Bonilla 61Universidad 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
62
Oscar Bonilla 62Universidad 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
63
Oscar Bonilla 63Universidad Galileo Ejemplo x*x + y*y + ldf Descriptor de campo para x en tabla de símbolos de campos para clase cartesianPoint * ldf * Descriptor de campo para y en tabla de símbolos de campos para clase cartesianPoint
64
Oscar Bonilla 64Universidad Galileo Ejemplo v[i]+x lda + ldp Descriptor de campo para v en tabla de símbolos de campos para clase vector Descriptor local para I en tabla de símbolos locales del método add de la clase vector Descriptor de parámetro para x en tabla de símbolos de parámetros para método add de clase vector ldl ldf
65
Oscar Bonilla 65Universidad Galileo Caso Especial: Operador de Largo de Arreglo Nodo len representa el largo del arreglo –expression tree para array Ejemplo: v.length len descriptor de campo para v en tabla de símbolos de campos para clase vector ldf
66
Oscar Bonilla 66Universidad 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
67
Oscar Bonilla 67Universidad Galileo Ejemplo v[i]=v[i]+x lda + ldp Descriptor de campo para v en tabla de símbolos de campos para clase vector Descriptor local para I en tabla de símbolos de locales para método add de clase vector Descriptor de parámetro para x en tabla de símbolos de parámetros para método add de clase vector ldl sta ldlldf
68
Oscar Bonilla 68Universidad 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
69
Oscar Bonilla 69Universidad Galileo Ejemplo while (i < v.length) v[i] = v[i]+x; local descriptor para i ldl field descriptor para vparameter descriptor para x while < len lda + ldp ldl sta ldl ldf
70
Oscar Bonilla 70Universidad Galileo De Parse Trees a Representación Intermedia
71
Oscar Bonilla 71Universidad 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
72
Oscar Bonilla 72Universidad Galileo while (i < v.length) v[i] = v[i]+x; local descriptor para ifield descriptor para vparameter descriptor para x
73
Oscar Bonilla 73Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl local descriptor para ifield descriptor para vparameter descriptor para x
74
Oscar Bonilla 74Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl ldf local descriptor para ifield descriptor para vparameter descriptor para x
75
Oscar Bonilla 75Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldllen ldf local descriptor para ifield descriptor para vparameter descriptor para x
76
Oscar Bonilla 76Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len ldf local descriptor para ifield descriptor para vparameter descriptor para x
77
Oscar Bonilla 77Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len ldf local descriptor para ifield descriptor para vparameter descriptor para x
78
Oscar Bonilla 78Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len ldlldf local descriptor para ifield descriptor para vparameter descriptor para x
79
Oscar Bonilla 79Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len lda ldlldf local descriptor para ifield descriptor para vparameter descriptor para x
80
Oscar Bonilla 80Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len ldaldp ldlldf local descriptor para ifield descriptor para vparameter descriptor para x
81
Oscar Bonilla 81Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len lda + ldp ldlldf local descriptor para ifield descriptor para vparameter descriptor para x
82
Oscar Bonilla 82Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len lda + ldp ldlldf local descriptor para ifield descriptor para vparameter descriptor para x
83
Oscar Bonilla 83Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len lda + ldp ldl ldf local descriptor para ifield descriptor para vparameter descriptor para x
84
Oscar Bonilla 84Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl < len lda + ldp ldl sta ldl ldf local descriptor para ifield descriptor para vparameter descriptor para x
85
Oscar Bonilla 85Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl while < len lda + ldp ldl sta ldl ldf local descriptor para ifield descriptor para vparameter descriptor para x
86
Oscar Bonilla 86Universidad Galileo while (i < v.length) v[i] = v[i]+x; ldl while < len lda + ldp ldl sta ldl ldf local descriptor para ifield descriptor para vparameter descriptor para x
87
Oscar Bonilla 87Universidad 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
88
Oscar Bonilla 88Universidad 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
89
Oscar Bonilla 89Universidad Galileo Meta Mantener la Independencia de Máquina Pero Acercarnos al Modelo de una Máquina Estándar (espacio de direcciones plano, branches)
90
Oscar Bonilla 90Universidad Galileo Convirtiendo el Control de Flujo Estructurado a Control de Flujo No Estructurado
91
Oscar Bonilla 91Universidad 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)
92
Oscar Bonilla 92Universidad Galileo ldl i < len lda + ldp x ldl i sta ldl i ldf v cbr entry exit while (i < v.length) v[i] = v[i]+x; Aristas de Control de Flujo Aristas de Instrucción y Expresión
93
Oscar Bonilla 93Universidad Galileo if (x < y) { a = 0; } else { a = 1; } entry ldl xldl y < cbr stl a 0stl a 1 exit
94
Oscar Bonilla 94Universidad Galileo Short-Circuit Conditionals while (i < v.length && v[i] != 0) { i = i+1; } entry ldl ilen < cbr stl i exit ldf v lda 0 != cbr ldf vldl i 0 +
95
Oscar Bonilla 95Universidad Galileo Más Short-Circuit Conditionals if (a < b || c != 0) { i = i+1; } entry ldl a < cbr stl i exit cbr ldl i 0 + ldl b ldl c 0 !=
96
Oscar Bonilla 96Universidad 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 c si c es true, control va a nodo t si c es false, control va a nodo f retorna b - b es begin node para evaluación de condición Nuevo tipo de nodo - nop node
97
Oscar Bonilla 97Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: next(e x ) = b y ; 4: return (b x, e y ); seq xy bxbx exex byby eyey
98
Oscar Bonilla 98Universidad 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: (b x,e x ) = destruct(x); seq xy bxbx exex
99
Oscar Bonilla 99Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); seq xy bxbx exex byby eyey
100
Oscar Bonilla 100Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: next(e x ) = b y ; seq xy bxbx exex byby eyey
101
Oscar Bonilla 101Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: next(e x ) = b y ; 4: return (b x, e y ); seq xy bxbx exex byby eyey
102
Oscar Bonilla 102Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: e = new nop; 4: next(e x ) = e; 5: next(e y ) = e; 6: b c = shortcircuit(c, b x, b y ); 7: return (b c, e); if cy bcbc bxbx exex e x byby eyey
103
Oscar Bonilla 103Universidad 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: (b x,e x ) = destruct(x); if cy bxbx exex x
104
Oscar Bonilla 104Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); if cy bxbx exex x byby eyey
105
Oscar Bonilla 105Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: e = new nop; if cy bxbx exex e x byby eyey
106
Oscar Bonilla 106Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: e = new nop; 4: next(e x ) = e; 5: next(e y ) = e; if cy bxbx exex e x byby eyey
107
Oscar Bonilla 107Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: e = new nop; 4: next(e x ) = e; 5: next(e y ) = e; 6: b c = shortcircuit(c, b x, b y ); if cy bcbc bxbx exex e x byby eyey
108
Oscar Bonilla 108Universidad 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: (b x,e x ) = destruct(x); 2: (b y,e y ) = destruct(y); 3: e = new nop; 4: next(e x ) = e; 5: next(e y ) = e; 6: b c = shortcircuit(c, b x, b y ); 7: return (b c, e); if cy bcbc bxbx exex e x byby eyey
109
Oscar Bonilla 109Universidad 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: (b x,e x ) = destruct(x); 3: b c = shortcircuit(c, b x, e); 4: next(e x ) = b c ; 5: return (b c, e); while cx bcbc e bxbx exex
110
Oscar Bonilla 110Universidad 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 cx e
111
Oscar Bonilla 111Universidad 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: (b x,e x ) = destruct(x); while cx e bxbx exex
112
Oscar Bonilla 112Universidad 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: (b x,e x ) = destruct(x); 3: b c = shortcircuit(c, b x, e); while cx bcbc e bxbx exex
113
Oscar Bonilla 113Universidad 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: (b x,e x ) = destruct(x); 3: b c = shortcircuit(c, b x, e); 4: next(e x ) = b c ; while cx bcbc e bxbx exex
114
Oscar Bonilla 114Universidad 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: (b x,e x ) = destruct(x); 3: b c = shortcircuit(c, b x, e); 4: next(e x ) = b c ; 5: return (b c, e); while cx bcbc e bxbx exex
115
Oscar Bonilla 115Universidad 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 c 1 && c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, b 2, f); 3: return (b 1 ); c 1 && c 2 b1b1 f b2b2 t
116
Oscar Bonilla 116Universidad 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 c 1 && c 2 1: b 2 = shortcircuit(c 2, t, f); c 1 && c 2 f b2b2 t
117
Oscar Bonilla 117Universidad 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 c 1 && c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, b 2, f); c 1 && c 2 b1b1 f b2b2 t
118
Oscar Bonilla 118Universidad 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 c 1 && c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, b 2, f); 3: return (b 1 ); c 1 && c 2 b1b1 f b2b2 t
119
Oscar Bonilla 119Universidad 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 c 1 || c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, t, b 2 ); 3: return (b 1 ); c 1 || c 2 b1b1 f b2b2 t
120
Oscar Bonilla 120Universidad 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 c 1 || c 2 1: b 2 = shortcircuit(c 2, t, f); c 1 || c 2 f b2b2 t
121
Oscar Bonilla 121Universidad 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 c 1 || c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, t, b 2 ); c 1 || c 2 b1b1 f b2b2 t
122
Oscar Bonilla 122Universidad 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 c 1 || c 2 1: b 2 = shortcircuit(c 2, t, f); 2: b 1 = shortcircuit(c 1, t, b 2 ); 3: return (b 1 ); c 1 || c 2 b1b1 f b2b2 t
123
Oscar Bonilla 123Universidad 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 ! c 1 1: b = shortcircuit(c 1, f, t); return(b); b ft ! c 1
124
Oscar Bonilla 124Universidad 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 e 1 < e 2 1: b = new cbr(e 1 < e 2, t, f); 2: return (b); e 1 < e 2 e1e1 e2e2 < cbr tf
125
Oscar Bonilla 125Universidad Galileo Nops En Representación Desestructurada while (i < v.length && v[i] != 0) { i = i+1; } entry ldl ilen < cbr stl i exit ldf v lda 0 != cbr ldf vldl i 0 + nop
126
Oscar Bonilla 126Universidad Galileo Eliminando Nops Via Peephole Optimization nop...
127
Oscar Bonilla 127Universidad Galileo Convirtiendo A Flat Address Space
128
Oscar Bonilla 128Universidad 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
129
Oscar Bonilla 129Universidad Galileo Layout de Memoria Stack Código Generado Heap Objetos Arreglos locales (parámetros) ¿Cuándo se establece el código generado? ¿Cuándo crece y disminuye el stack? ¿Cuándo crece y disminuye el heap?
130
Oscar Bonilla 130Universidad 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 –this es el parámetro 0
131
Oscar Bonilla 131Universidad 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 3748 Método getColor para point 4 Método distance para polarPoint 1 3 c r t Método angle para polarPoint
132
Oscar Bonilla 132Universidad 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 point 4 Método distance para polarPoint 1 3 c r t Método angle para polarPoint this
133
Oscar Bonilla 133Universidad 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
134
Oscar Bonilla 134Universidad Galileo Cartesian Point Field Offsets y x 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 descriptor para point class descriptor para cartesianPoint
135
Oscar Bonilla 135Universidad Galileo ldp 0 ld 8 ldp 0 ld 12 ldp 0 ld 12 ldp 0 ld 8 ++ * * ldf field descriptor para x (8) + ldf + field descriptor para y (12) Expresión Ejemplo x*x + y*y
136
Oscar Bonilla 136Universidad 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)
137
Oscar Bonilla 137Universidad 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
138
Oscar Bonilla 138Universidad Galileo Ejemplo: v[5]+x lda + ldp field descriptor para v (4) parameter descriptor para x (1) 5 ldf ldp 0 ld 4+ 4* 54 + ld 0 + ldp 1
139
Oscar Bonilla 139Universidad Galileo Offset de Largo en Instrucción ld lda + ldp field descriptor para v (4) parameter descriptor para x (1) 5 ldf ldp 0 ld 4 * 54 + + ldp 1
140
Oscar Bonilla 140Universidad 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
141
Oscar Bonilla 141Universidad 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
142
Oscar Bonilla 142Universidad 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
143
Oscar Bonilla 143Universidad 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
144
Oscar Bonilla 144Universidad Galileo Ejemplo de Offsets de Locales y Parámetros this i this descriptor (8) local descriptor (4) field symbol table para vector class local variable symbol table x parameter symbol table parameter descriptor (12) Código para método add Method descriptor para add
145
Oscar Bonilla 145Universidad Galileo Ejemplo: v[i]+x lda + ldp field descriptor para v (4) parameter descriptor para x (1) ldf ldp 0 ld 4* 4 + + ldp 1 local descriptor para i (-4) ldl sp ld 4
146
Oscar Bonilla 146Universidad 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....
147
Oscar Bonilla 147Universidad Galileo ldp 0 ld 4 * 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 + 1 sp st 4 sp 0 enter 12 exit 12 ld 0
148
Oscar Bonilla 148Universidad 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
Presentaciones similares
© 2025 SlidePlayer.es Inc.
All rights reserved.