La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

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

Presentaciones similares


Presentación del tema: "Compiladores Traducción a Formatos Intermedios. Oscar Bonilla 2Universidad Galileo Resumen Metas de Representación de Programas Formato de datos en código."— Transcripción de la presentación:

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


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

Presentaciones similares


Anuncios Google