Diseño de compiladores. Representación intermedia Ambientes de ejecución
|
|
- José Ramón Ramos Segura
- hace 8 años
- Vistas:
Transcripción
1 Diseño de compiladores Representación intermedia Ambientes de ejecución
2 Generación de la RI Es la ultima etapa del frontend de un compilador El objetivo es traducir el programa en el formato que espera el backend del compilador El código intermedio generado no tiene porque ser ensamblador, puede ser de mayor nivel
3 Por que una RI? Simplificación del código El código maquina (objeto) tiene ciertas restricciones que hacen que no podamos realizar ciertas operaciones a ese nivel El lenguaje intermedio puede ser una aproximación a ese lenguaje final, en donde podamos realizar las operaciones deseadas Ejemplo: No tener multiplicación en el lenguaje destino? La implementamos como secuencia de sumas!
4 Por que una RI? Manejar con un solo backend, múltiples frontends Por ejemplo, gcc permite manejar C, C++, Java, Fortran y muchos mas Cada frontend traduce su código a un lenguaje intermedio denominado GENERIC Muy similar al enfoque.net, pero sin el runtime que controle el código ejecutable
5 Por que una RI? Manejar múltiples backends, para el mismo frontend La idea es utilizar el mismo lenguaje intermedio, y luego traducirlo a diferentes plataformas usando backends diferentes Las optimizaciones se tratan de hacer sobre el código intermedio en la mayoría de los casos Es similar a la idea de Java con el runtime (bytecode a código nativo, JIT)
6 Representación Intermedia Son difíciles de lograr, ya que deben balancear dos necesidades opuestas Por un lado tenemos las necesidades del lenguaje de alto nivel y por el otro las de bajo nivel Si la RI es muy de alto nivel, entonces no podemos hacer ciertas optimizaciones de bajo nivel Si la RI es muy de bajo nivel, entonces no podemos usar el conocimiento del alto nivel para mejorar el código
7 Código Fuente Un ejemplo, la arquitectura de GCC, de relativamente bajo nivel
8 Código Fuente AST
9 Código Fuente GENERIC AST
10 Código Fuente GENERIC AST HIGH GIMPLE
11 Código Fuente GENERIC AST HIGH GIMPLE SSA
12 Código Fuente GENERIC AST HIGH GIMPLE SSA LOW GIMPLE
13 Código Fuente GENERIC AST HIGH GIMPLE SSA LOW GIMPLE RTL
14 Código Fuente GENERIC AST HIGH GIMPLE SSA LOW GIMPLE Código Maquina RTL
15 Código Fuente GENERIC AST HIGH GIMPLE SSA LOW GIMPLE Código Maquina RTL
16 RI de alto nivel Algunos ejemplos Java Bytecode Cpython bytecode LLVM IR Microsoft CIL Aspectos interesantes: Mantienen la estructura de alto nivel del programa Permiten compilación a lenguajes de mas bajo nivel Permiten INTERPRETACION O JIT (Just In Time Compilation)
17 Que nos importa en esta etapa? Ambientes de ejecución Como implementamos las características de un lenguaje en el código maquina (especialmente si el código maquina no las soporta) Un ejemplo, que pasa con la recursión Que estructuras de datos necesitamos? Código de Tres Direcciones (C3D) Que ventajas tiene, porque es interesante Como podemos generar el C3D? Veremos con ejemplos
18 AMBIENTES DE EJECUCIÓN
19 Un problema importante Los lenguajes de programación manejan aspectos de alto nivel Funciones Objetos Excepciones Tipado dinámico y estático Introspección Estructuras de control
20 Un problema importante Pero la maquina destino suele operar en términos mucho mas primitivos Aritmética Movimiento de datos Estructuras de control muy simples, generalmente saltos y secuencias Soporte básico de acceso a memoria Acceso directo Acceso en formato PILA
21 Ambiente de ejecución Es una forma de representar estos conceptos de alto nivel, usando lo que tenemos disponible en la plataforma destino para nuestro lenguaje
22 Ambiente de ejecución Es una serie de estructuras de datos y procedimientos que se mantienen en runtime de forma de implementar los conceptos de alto nivel Ejemplos: Stack, Heap, Área estática, Tablas de funciones, etc. Depende FUERTEMENTE de las características del lenguaje origen y el lenguaje/plataforma destino
23 Por ejemplo Si tenemos un lenguaje tipo Java, debemos considerar Como se ven los objetos en memoria Como se ven las funciones en memoria Donde se colocan en la memoria Como se implementan las llamadas a funciones Como se implementa la herencia Lo mejor, es que no hay una única respuesta a estas consideraciones!
24 Representación de datos Nos interesa determinar como se colocan los datos en memoria La maquina por lo general soporta opciones limitadas Enteros de largo fijo: 8 bits, 16 bits, 32 bits, con signo, sin signo Flotantes: 32 bits, 64 bits, 80 bits IEEE 754 Debemos codificar nuestros tipos usando estos elementos disponibles
25 Representando tipos primitivos Tipos primitivos integrales byte, char, short, int, long, unsigned, uint16_t Se mapean directo a los tipos de la maquina destino Tipos primitivos reales float, double, long double Se mapean directo a los tipos de la maquina destino
26 Representando tipos primitivos Punteros Típicamente representados como enteros, que contienen la dirección de memoria destino que nos interesa El tamaño del entero depende de la arquitectura destino Tenemos enteros de 32 bits, 64 bits
27 Representando arrays Arrays tipo C Los elementos del array se colocan uno atrás del otro en memoria Arr[0] Arr[1] Arr[2]... Arr[n-1]
28 Representando arrays Arrays tipo Java Los elementos del array se colocan uno atrás del otro en memoria Se coloca el tamaño del array al principio n Arr[0] Arr[1] Arr[2]... Arr[n-1]
29 Representando arrays Arrays tipo D Los elementos del array se colocan uno atrás del otro en memoria Se coloca un punteo al primer y post-ultimo elemento Arr[0] Arr[1] Arr[2]... Arr[n-1] First Past-End
30 Representando arrays multidim. Se representan como arrays de arrays La forma de los arrays en memoria depende del tipo de array usado Arrays tipo C: int a[3][2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1]
31 Representando arrays multidim. Se representan como arrays de arrays La forma de los arrays en memoria depende del tipo de array usado Arrays tipo C: int a[3][2] a[0][0] a[0][1] a[1][0] a[1][1] a[2][0] a[2][1] Array de tamaño 2 Array de tamaño 2 Array de tamaño 2
32 Representando arrays multidim. Se representan como arrays de arrays La forma de los arrays en memoria depende del tipo de array usado Arrays tipo Java: int[][] a = new int[3][2] 3 a[0] a[1] a[2] 2 a[0][0] a[0][1] 2 a[1][0] a[1][1] 2 a[2][0] a[2][1]
33 Representando funciones Algunas cosas a responder Como funciona la ejecución dinámica de funciones Donde se coloca el código ejecutable de las funciones Como se pasan los parámetros y como se devuelven los resultados Donde se almacenan las variables locales La respuesta depende de lo que soporte el lenguaje destino
34 Stack Generalmente las llamadas a funciones se implementan utilizando un stack de registros de activación (stack frames) Al llamar a una función, hacemos un push de un nuevo registro de activación Al retornar de una función, hacemos un pop del registro de activación actual
35 Árbol de activaciones Es un árbol que representa todas las llamadas a funciones hechas por un programa en una ejecución particular No siempre puede ser determinado en tiempo de compilación Depende del comportamiento en runtime El equivalente estático es un grafo de llamadas
36 Árbol de activaciones Cada nodo del árbol representa una llamada a una función Cada registro de activación contiene un link de control al registro de activación de la función que lo invoco Este link también es conocido como enlace de control Permite armar una cadena de llamadores Recordar tipado dinámico!
37 int main() { fibonacci(3); } main int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); }
38 int main() { fibonacci(3); } int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); } main fibonacci n = 3
39 int main() { fibonacci(3); } int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); } main fibonacci n = 3 fibonacci n = 2
40 int main() { fibonacci(3); } int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); } main fibonacci n = 3 fibonacci n = 2 fibonacci n = 1
41 int main() { fibonacci(3); } int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); } main fibonacci n = 3 fibonacci n = 2 fibonacci n = 1 fibonacci n = 0
42 int main() { fibonacci(3); } int fibonacci(int n) { if (n <= 1) return n; return fibonacci(n 1) + fibonacci(n 2); } main fibonacci n = 3 fibonacci n = 2 fibonacci n = 1 fibonacci n = 1 fibonacci n = 0
43 Un árbol de activación no necesita ser mantenido en memoria para siempre SOLO nos interesa la rama actual Esto es equivalente a realizar una recorrida en profundidad
44 Por que podemos optimizar? El stack se puede optimizar por 2 grandes razones Una vez que una función retorna, su registro de activación no necesita ser referenciado nuevamente No necesitamos nodos viejos del árbol de activación
45 Por que podemos optimizar? El stack se puede optimizar por 2 grandes razones En un momento de tiempo, un registro de activación ha terminado de ejecutar, o es un ancestro del registro de activación actual No necesitamos múltiples ramas del árbol activas a la vez
46 Enlaces de control y activación El enlace de control de una función, es un puntero al registro de activación de la función que lo llamo Usado para determinar donde reanudar la ejecución después que la función retorna
47 Enlaces de control y activación El enlace de acceso de una función, es un puntero al registro de activación de la función donde esta definida la primera Usado para determinar el valor de variables fuera de scope
48 Un ejemplo Supongamos un lenguaje tipo Java o C Vamos a usar un runtime stack Cada registro de activación debe almacenar Parámetros Variables locales Variables temporales (introducidas por la RI) Enlaces de acceso y de control
49 Stack Frame La organización lógica del stack frame, es creada por el generador de RI Ignora detalles específicos de la maquina destino La organización física del stack frame, es creada por el generador de código Basada en la organización lógica Incluye aspectos de la maquina destino, como por ejemplo punteros, registros, etc.
50 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales
51 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M
52 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1
53 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1...
54 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1
55 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales
56 Stack Frame para la invocación f(a1,a2,...,an) Stack Frame para la invocación g(b1,b2,...,bm) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales
57 Convenciones de llamada El llamador es el responsable de pushear y popear el espacio necesario para los parámetros de la función llamada El llamado, es el responsable de pushear y popear el espacio necesario para sus variables locales y temporales
58 Objetos Es difícil construir un lenguaje orientado a objetos, expresivo y eficiente Algunos conceptos son difíciles de implementar Despacho dinámico Interfaces Herencia múltiple Control de tipos dinámico (instanceof)
59 structs tipo C Una estructura es un tipo que contiene valores nombrados Un enfoque común? colocar cada campo en memoria según el orden en que fue declarado
60 structs tipo C Una estructura es un tipo que contiene valores nombrados Un enfoque común? colocar cada campo en memoria según el orden en que fue declarado struct Struct { int myint; char mychar; double mydouble; }; 4 Bytes 1 Byte 8 bytes
61 structs tipo C En realidad en memoria, el direccionamiento se hace en multiplos de 8 bytes (o 32, o 64, etc) No podemos ocupar solo 5 bytes de memoria struct Struct { int myint; char mychar; double mydouble; }; 4 Bytes 1 Byte 8 bytes
62 structs tipo C En realidad en memoria, el direccionamiento se hace en múltiplos de 4 bytes (u 8, 16, 32, 64, etc.) No podemos ocupar solo 5 bytes de memoria struct Struct { int myint; char mychar; double mydouble; }; 4 Bytes 1 Byte 3 Bytes 8 bytes
63 Accediendo a los campos Una vez que los campos se han colocado en memoria, estamos solo ante una tira de bytes Como sabemos a que corresponde cada cosa? 4 Bytes 1 Byte 3 Bytes 8 bytes
64 Accediendo a los campos Una idea: Mantenemos una tabla, interna al compilador, contiendo el offset necesario para acceder a cada campo 4 Bytes 1 Byte 3 Bytes 8 bytes Cuando queremos acceder a un campo, comenzamos por la dirección del struct, y luego avanzamos según el offset elegido
65 struct Struct { int x; char y; double z; }; 4 Bytes 1 Byte 3 Bytes 8 bytes
66 struct Struct { int x; char y; double z; }; 4 Bytes 1 Byte 3 Bytes 8 bytes Struct* st = new Struct; st->x = 137; st->y = 'A'; st->z = 2.71;
67 struct Struct { int x; char y; double z; }; 4 Bytes 1 Byte 3 Bytes 8 bytes Struct* st = new Struct; st 0x F8 st->x = 137; st->y = 'A'; st->z = 2.71;
68 struct Struct { int x; char y; double z; }; 4 Bytes 1 Byte 3 Bytes 8 bytes Struct* st = new Struct; st->x = 137; st->y = 'A'; st->z = 2.71; st 0x F8 137 st + 0 bytes A st + 4 bytes 2.71 st + 8 bytes
69 Herencia Como se vería en memoria esto? class Base { int x; int y; } class Derived extends Base { int z; }
70 4 Bytes 4 Bytes class Base { int x; int y; };
71 class Base { int x; int y; }; 4 Bytes 4 Bytes 4 Bytes 4 Bytes 4 Bytes class Derived extends Base { int z; };
72 Accediendo a los campos El acceso a los campos de un objeto, en el caso de tener herencia, es muy similar a las estructuras antes vistas Usamos la dirección de la instancia, y un offset para cada campo que queramos acceder
73 class Base { int x; int y; }; 4 Bytes 4 Bytes class Derived extends Base { int z; }; 4 Bytes 4 Bytes 4 Bytes Base bs = new Base(); bs.x = 137; bs.y = 42; bs 0x F8 137 bs + 0 bytes 42 bs + 4 bytes
74 class Base { int x; int y; }; 4 Bytes 4 Bytes class Derived extends Base { int z; }; 4 Bytes 4 Bytes 4 Bytes Base bs = new Derived(); bs 0x F8 bs.x = 137; 137 bs + 0 bytes bs.y = 42; 42 bs + 4 bytes
75 class Base { int x; int y; }; 4 Bytes 4 Bytes class Derived extends Base { int z; }; 4 Bytes 4 Bytes 4 Bytes Base bs = new Base(); bs.x = 137; bs.y = 42; bs 0x F8 137 bs + 0 bytes 42 bs + 4 bytes Base dr = new Derived(); dr 0x F8 dr.x = 137; 137 dr + 0 bytes dr.y = 42; 42 dr + 4 bytes
76 Herencia simple El diagramado de memoria de una clase D que extiende a una clase B, esta dado por el diagramado de memoria de la clase B, seguido por el diagramado de memoria de la clase D Intuitivamente: Una referencia de tipo B, apuntando a un objeto de tipo D, aun ve el objeto B dentro de D
77 Herencia simple B B D ptr1 : referencia de tipo B ptr2 : referencia de tipo B ptr3 : referencia de tipo D
78 Métodos Los métodos de una clase, son como funciones tradicionales, pero con dos complicaciones Como sabemos cual es el objeto sobre el que se esta aplicando la función? Como sabemos cual función llamar en runtime, por ejemplo para casos de overloading u overriding?
79 this Dentro de una función miembro de una clase, la palabra clave this (o cualquiera de sus variantes), referencia el objeto sobre el que la función aplica Idea: Tratamos this como el primer parámetro implícito de toda función miembro de una clase Cualquier función de N argumentos, es en realidad una función de N+1 argumentos
80 class TheClass { int x; void thefunction(int value) { this.x = value; } } TheClass t = new TheClass(); t.thefunction(42);
81 class TheClass { int x; void thefunction(int value) { this.x = value; } } TheClass t = new TheClass(); t.thefunction(42);
82 class TheClass { int x; } void TheClass_theFunction(TheClass this, int value) { this.x = value; } TheClass t = new TheClass(); t.thefunction(42);
83 class TheClass { int x; } void TheClass_theFunction(TheClass this, int value) { this.x = value; } TheClass t = new TheClass(); t.thefunction(42);
84 class TheClass { int x; } void TheClass_theFunction(TheClass this, int value) { this.x = value; } TheClass t = new TheClass(); TheClass_theFunction(t, 42);
85 Algunas reglas para this Cuando generamos código para llamar a una función miembro de otro objeto, debemos pasar ese objeto como primer parámetro de la función Permite representar el this dentro de la función llamada Dentro de la función, tratamos this como un parámetro mas this puede ser usado como una estructura, en la que hacemos el lookup de los campos con los métodos anteriores
86 Despacho dinámico El despacho dinámico implica determinar que función llamar en runtime, en base al tipo dinámico del objeto sobre el que se invoca la función Conceptualmente, la idea es simple:
87 Despacho dinámico Primero, obtenemos una lista de todas las clases en nuestro programa Luego, generamos código en la RI similar a este: Si el objeto es de tipo A Llamamos a la versión de la clase A de la función Si el objeto es de tipo B Llamamos a la versión de la clase B de la función Si el objeto es de tipo C Llamamos a la versión de la clase C de la función
88 Despacho dinámico Generalmente, en la practica no es buena idea implementar literalmente lo anterior Por dos motivos Es lento El numero de chequeos es O(N), donde N es el numero de clases No es implementable en la mayoría de los lenguajes Que pasa si soporta carga dinámica de clases?
89 Despacho dinámico Podemos usar un enfoque similar al usado para los campos de una clase y su clase derivada Lo hacemos en base a tablas de funciones
90 class Base { int x; void sayhi() { Print("Base"); } } class Derived extends Base{ int y; void sayhi() { Print("Derived"); } } Base.x Base.x Derived.y Código para Base.sayHi Código para Derived.sayHi
91 class Base { int x; void sayhi() { Print("Base"); } } class Derived extends Base{ int y; void sayhi() { Print("Derived"); } } sayhi Base.x sayhi Base.x Derived.y Código para Base.sayHi Código para Derived.sayHi
92 class Base { int x; void sayhi() { Print("Base"); } } class Derived extends Base{ int y; void sayhi() { Print("Derived"); } } sayhi Base.x sayhi Base.x Derived.y Código para Base.sayHi Código para Derived.sayHi
93 class Base { int x; void sayhi() { Print("Base"); } } class Derived extends Base{ int y; void sayhi() { Print("Derived"); } } sayhi Base.x sayhi Base.x Derived.y Código para Base.sayHi Código para Derived.sayHi Base b = new Base(); b.sayhi(); fn = Dirección de b + 0 bytes Invocar fn(b)
94 class Base { int x; void sayhi() { Print("Base"); } } class Derived extends Base{ int y; void sayhi() { Print("Derived"); } } sayhi Base.x sayhi Base.x Derived.y Código para Base.sayHi Código para Derived.sayHi Base b = new Derived(); b.sayhi(); fn = Dirección de b + 0 bytes Invocar fn(b)
95 Virtual Function Tables Una vtable (Virtual Function Table), es un array de punteros a implementaciones de funciones miembro de una clase Para invocar a una función miembro Determinamos el índice en la vtable Obtenemos una referencia al código de la función a través de dicho índice Invocamos a la función
96 Virtual Function Tables Según el tipo de objeto con el que estemos trabajando, podemos tener variantes en las vtables Por ejemplo Que pasa cuando usamos interfaces? Que pasa cuando tenemos herencia múltiple? Que pasa cuando combinamos herencia múltiple con interfaces?
97 Chequeo dinámico de tipos Muchos lenguajes orientados a objetos, requieren alguna forma de control dinamico de tipos Por ejemplo En Java, instanceof En C++, dynamic_cast En C# is a Queremos determinar si un tipo es convertible en otro tipo, NO si son iguales
98 class A { void f() {} } class B extends A { void f() {} } class C extends A { void f() {} } class D extends B { void f() {} } class E extends C { void f() {} }
99 class A { void f() {} } class B extends A { void f() {} } class C extends A { void f() {} } class D extends B { void f() {} } class E extends C { void f() {} } Parent A.f() Parent B.f() Parent C.f() Parent D.f() Parent E.f()
100 Una idea simple Hacemos que cada vtable de un objeto, apunte a la clase padre Para chequear si el objeto es convertible a un tipo T, recorremos los punteros en la vtable de los objetos, hasta encontrar una clase T, o llegar a un tipo sin padre El tiempo de búsqueda es O(d), donde d es la profundidad de la clase en la jerarquía
101 Otra idea mucho mejor Hay una forma mucho mas inteligente y rápida de controlar en runtime la convertibilidad, en tiempo O(1) Asumimos: Que en general no hay muchas clases derivadas de una misma clase (por ejemplo, máximo 10) Un chequeo en runtime de convertibilidad de B a A, solo es posible si B <= A Todos los tipos son conocidos estáticamente
102 Parent A.f() Parent B.f() Parent C.f() Parent Parent Parent Parent D.f() E.f() F.f() G.f()
103 Parent A.f() Parent B.f() Parent C.f() Parent Parent Parent Parent D.f() E.f() F.f() G.f()
104 1 A.f() 2 B.f() 3 C.f() 2*5 2*7 3*11 3*13 D.f() E.f() F.f() G.f()
105 1 A.f() 2 B.f() 3 C.f() D.f() E.f() F.f() G.f()
106 1 A.f() 2 B.f() 3 C.f() D.f() E.f() F.f() G.f() A myobject = /* */ if (myobject instanceof C) { /* */ }
107 1 A.f() 2 B.f() 3 C.f() D.f() E.f() F.f() G.f() A myobject = /* */ if (myobject instanceof C) { /* */ }
108 1 A.f() 2 B.f() 3 C.f() D.f() E.f() F.f() G.f() A myobject = /* */ if (myobject->vtable.key % 3 == 0) { /* */ }
109 CDT mediante números primos Asignamos a cada clase, un numero primo único Podemos reusar primero en jerarquías diferentes Establecemos la clave de esa clase, como el producto de ese primo, por todos los primos de sus superclases
110 CDT mediante números primos Para chequear en runtime si un objeto es convertible a un tipo T Buscamos la clave del objeto (según su clase) Si la clave de T divide a la clave del objeto, entonces el objeto es convertible Sino, no es convertible Asumiendo que el producto de los primos, cabe en un entero (de ahí la limitación de tamaño), el control se puede hacer en O(1)
111 CÓDIGO DE TRES DIRECCIONES
112 C3D / TAC C3D = Código de 3 Direcciones TAC = Three Address Code Es un lenguaje ensamblador de alto nivel, en donde toda operación tiene como máximo tres operandos Usa un stack explicito para representar las llamadas a funciones Usa vtables para despacho dinámico de funciones
113 int x; int y; int x2 = x * x; int y2 = y * y; int r2 = x2 + y2; x2 = x * x; y2 = y * y; r2 = x2 + y2;
114 int a; int b; int c; int d; a = b + c + d; b = a * a + b * b; _t0 = b + c; a = _t0 + d; _t1 = a * a; _t2 = b * b; b = _t1 + _t2;
115 int a; int b; int c; int d; a = b + c + d; b = a * a + b * b; _t0 = b + c; a = _t0 + d; _t1 = a * a; _t2 = b * b; b = _t1 + _t2;
116 Variables temporales El código de tres direcciones puede tener como máximo tres operandos Evaluar una expresión con mas de tres operandos, implica romper la expresión en sub expresiones, introduciendo variables temporales
117 También podemos tener menos de tres operandos El máximo es tres int a; int b; a = * b; _t0 = 5; _t1 = 2 * b; a = _t0 + _t1;
118 Instrucciones de asignación Asignación de variables var = constant; var1 = var2; var1 = var2 op var3; var1 = constant op var2; var1 = var2 op constant; var = constant1 op constant2; Operadores: +, -, *, /, %
119 Booleanos int x; int y; bool b1; bool b2; bool b3; b1 = x + x < y b2 = x + x == y b3 = x + x > y _t0 = x + x; _t1 = y; b1 = _t0 < _t1; _t2 = x + x; _t3 = y; b2 = _t2 == _t3; _t4 = x + x; _t5 = y; b3 = _t5 < _t4;
120 C3D con booleanos Las variables booleanas se representan con enteros, que pueden tener valor 0 o diferente de 0 Agregamos los operadores: <, ==,, && Por ejemplo: b = (x <= y) _t0 = x < y; _t1 = x == y; b = _t0 _t1;
121 Flujo de control int x; int y; int z; if (x < y) z = x; else z = y; _t0 = x < y; IfZ _t0 Goto _L0; z = x; Goto _L1; _L0: z = y; _L1: z = z * z; z = z * z;
122 Flujo de control int x; int y; int z; if (x < y) z = x; else z = y; _t0 = x < y; IfZ _t0 Goto _L0; z = x; Goto _L1; _L0: z = y; _L1: z = z * z; z = z * z;
123 Flujo de control int x; int y; int z; if (x < y) z = x; else z = y; _t0 = x < y; IfZ _t0 Goto _L0; z = x; Goto _L1; _L0: z = y; _L1: z = z * z; z = z * z;
124 Etiquetas El C3D permite el uso de etiquetas, las que marcan puntos nombrados dentro del programa, a los cuales podemos saltar en la ejecución Tenemos 2 instrucciones para el control de flujo Goto LABEL IfZ value Goto LABEL IfZ siempre va asociado con un Goto
125 Flujo de control int x; int y; while (x < y) { x = x * 2; } y = x; _L0: _t0 = x < y; IfZ _t0 Goto _L1; x = x * 2; Goto _L0; _L1: y = x;
126 Un programa completo void main() { int x, y; int m2 = x * x + y * y; while (m2 > 5) { m2 = m2 x; } } main: BeginFunc 24; _t0 = x * x; _t1 = y * y; m2 = _t0 + _t1; _L0: _t2 = 5 < m2; IfZ _t2 Goto _L1; m2 = m2 x; Goto _L0; _L1: EndFunc;
127 Compilando funciones Una función consiste en Una etiqueta indicando el comienzo de la función Una instrucción BeginFunc N; reservando N bytes para almacenamiento local y temporal El cuerpo de la función Una instrucción EndFunc; marcando el final de la función Al llegar a esta instrucción, eliminamos el stack frame y retornamos
128 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales
129 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M
130 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1
131 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1...
132 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1
133 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales
134 Stack Frame para la invocación f(a1,a2,...,an) Stack Frame para la invocación g(b1,b2,...,bm) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales
135 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1
136 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales
137 Compilando llamadas a funciones void SimpleFn(int z) { int x, y; x = x * y * z; } void main() { SimpleFn(100); } _SimpleFn: BeginFunc 16; _t0 = x * y; _t1 = _t0 * z; x = _t1; EndFunc; main: BeginFunc 4; _t0 = 137; PushParam _t0; LCall _SimpleFn; PopParams 4; EndFunc;
138 Gestión del Stack BeginFunc N; solo reserva espacio para locales y temporales EndFunc; solo reclama el espacio reservado por el BeginFunc N; correspondiente Un parámetro se pushea en el stack usando la instrucción PushParam var; El espacio ocupado por los parámetros es reclamado por el llamador usando la instrucción PopParams N; N mide la cantidad de bytes, no una cantidad
139 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales
140 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M PushParam var;
141 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1 PushParam var; PushParam var;
142 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... PushParam var; PushParam var; PushParam var;
143 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 PushParam var; PushParam var; PushParam var; PushParam var;
144 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales PushParam var; PushParam var; PushParam var; PushParam var; BeginFunc N;
145 Stack Frame para la invocación f(a1,a2,...,an) Stack Frame para la invocación g(b1,b2,...,bm) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales PushParam var; PushParam var; PushParam var; PushParam var; BeginFunc N;
146 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales
147 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 Locales y Temporales EndFunc;
148 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1
149 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales Param M Param M-1... Param 1 PopParams K;
150 Stack Frame para la invocación f(a1,a2,...,an) Param N Param N-1... Param 1 Locales y Temporales
151 Storage El C3D no especifica donde las variables y los temporales son almacenados Esto generalmente es gestionado en la etapa de generación de código
152 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales
153 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer
154 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer Param N Param N-1... Param 1
155 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer Param N Param N-1... Param 1 Locales y Temporales
156 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer Param N Param N-1... Param 1 Locales y Temporales
157 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer Param N Param N-1... Param 1
158 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer
159 Frame Pointer Param N Param N-1... Param 1 Locales y Temporales Frame Pointer
160 Stack lógico vs Stack físico Param N Param N-1... Param 1 Locales y Temporales Param N Param N-1... Param 1 fp llamador Locales y Temporales Frame Pointer
161 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer
162 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1
163 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador
164 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador
165 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador Locales y Temporales
166 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador
167 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador
168 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer Param N... Param 1
169 Frame Pointer Param N... Param 1 fp llamador Locales y Temporales Frame Pointer
170 Dirección de retorno Internamente, el procesador tiene un registro especial denominado IP (Instruction Pointer), el cual almacena la dirección de la próxima instrucción a ejecutar Cuando una función retorna, debe restaurar el IP de forma de que la función llamadora pueda continuar desde donde se quedo Agregamos al stack físico la dirección de retorno
171 Return Address Param N... Param 1 fp llamador ra llamador Locales y Temporales Frame Pointer
172 Return Address Param N... Param 1 fp llamador ra llamador Locales y Temporales Frame Pointer Param N... Param 1
173 Return Address Param N... Param 1 fp llamador ra llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador
174 Return Address Param N... Param 1 fp llamador ra llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador ra llamador
175 Return Address Param N... Param 1 fp llamador ra llamador Locales y Temporales Frame Pointer Param N... Param 1 fp llamador ra llamador Locales y Temporales
176 Entonces En el generador de código, debemos asignar a cada temporal, variable local y parámetro su propia dirección Estas direcciones ocurren siempre en un stack frame especifico, y son siempre relativas al frame pointer (fp-relative)
177 Entonces Los parámetros comienzan siempre en la dirección fp + 4, creciendo hacia arriba en el stack (esto es una convención) Los locales y temporales comienzan en la dirección fp 8, creciendo hacia abajo en el stack (esto es una convención)
178 Entonces Frame Pointer Param N... Param 1 fp llamador ra llamador Local 0... Local M fp + 4N fp + 4 fp + 0 fp - 4 fp 8 fp 4 4M
179 Valor de retorno En forma análoga a los casos anteriores, debemos poder devolver un valor desde la función a la cual llamamos Debemos reservar espacio para el valor de retorno de la función Este valor debe ser colocado por la función llamadora
180 Valor de retorno Frame Pointer Param N... Param 1 fp llamador ra llamador Local 0... Local M fp + 4N + 4 fp + 8 Return Value fp + 4 fp + 0 fp - 4 fp 8 fp 4 4M
181 Global Pointer Existen lenguajes que soportan este tipo de construcciones: int globalvariable; int main() { globalvariable = 137; } Existe un registro especial, denominado Global Pointer, el cual permite indexar la información de las variables globales
182 Global Pointer Global Pointer Global Variable N... Global Variable 2 Global Variable 1 gp + 4N gp + 4 gp + 0
183 Objetos class A { void fn(int x) { int y; y = x; } } int main() { A a; a.fn(137); } _A.fn: BeginFunc 4; y = x; EndFunc; main: BeginFunc 8; _t0 = 137; PushParam _t0; PushParam a; LCall _A.fn; PopParams 8; EndFunc;
184 Objetos class A { int y; int z; void fn(int x) { y = x; x = z; } } int main() { A a; a.fn(100); } _A.fn: BeginFunc 4; *(this + 4) = x; x = *(this + 8); EndFunc; main: BeginFunc 8; _t0 = 137; PushParam _t0; PushParam a; LCall _A.fn; PopParams 8; EndFunc;
185 Objetos class A { int y; int z; void fn(int x) { y = x; x = z; } } int main() { A a; a.fn(100); } _A.fn: BeginFunc 4; *(this + 4) = x; x = *(this + 8); EndFunc; main: BeginFunc 8; _t0 = 137; PushParam _t0; PushParam a; LCall _A.fn; PopParams 8; EndFunc;
186 Instrucciones de memoria Agregamos estas operaciones de acceso var1 = *var2 var1 = *(var2 + constant) *var1 = var2 *(var1 + constant) = var2
187 GENERANDO C3D
188 Donde estamos? En este punto de la compilación, tenemos Un AST (Árbol Sintáctico) Anotado con información de scope Anotado con información de tipos Para generar el C3D, hacemos una recorrida recursiva de dicho árbol Generamos C3D para los nodos internos Componemos el resultado para armar C3D
189 C3D para expresiones Podemos generar el código de tres direcciones en forma recursiva Los casos base son las expresiones que no tienen hijos Estas, basta ponerlas en temporales Para expresiones que tienen hijos, lo que hacemos es generar recursivamente para estas el código de tres direcciones Vamos a necesitan una función para generar nombres de temporales
190 C3D para expresiones Supongamos una estructura de partida de la forma: Tipo: Operador Valor: + Tipo: Numero Valor: 20 Tipo: Numero Valor: 10
191
192 C3D para sentencias Podemos extender la función anterior para operar sobre sentencias A diferencia de la versión para expresiones, en este caso no retornamos el nombre del temporal usado, ya que una sentencia no genera un valor
193 Estructuras para representar C3D Al momento de representar C3D, necesitamos almacenar: El operador Los operandos Los argumentos para el operador El resultado de la operación Podemos utilizar triples y cuádruplos
194 Cuádruplos
195 Triples
GENERACIÓN DE CÓDIGO
GENERACIÓN DE CÓDIGO INTRODUCCION La generación de código es la fase más compleja de un compilador, puesto que no sólo depende de las características del lenguaje fuente sino también de contar con información
Más detallesIntroduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia
Introduccion al Lenguaje C Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia Introducción C es un lenguaje de programación creado en 1972 por
Más detallesRESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA
UNED Centro Asociado de Cádiz RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA 1. OBJETOS Cualquier elemento del programa es un objeto. Un programa es un conjunto de objetos que se comunican entre sí
Más detalles8. Sentencia return y métodos
92 A. García-Beltrán y J.M. Arranz 8. Sentencia return y métodos Objetivos: a) Describir el funcionamiento de la sentencia return b) Interpretar el resultado de una sentencia return en el código fuente
Más detallesEn cualquier caso, tampoco es demasiado importante el significado de la "B", si es que lo tiene, lo interesante realmente es el algoritmo.
Arboles-B Características Los árboles-b son árboles de búsqueda. La "B" probablemente se debe a que el algoritmo fue desarrollado por "Rudolf Bayer" y "Eduard M. McCreight", que trabajan para la empresa
Más detallesModulo 1 El lenguaje Java
Modulo 1 El lenguaje Java 13 - Codificación en Java Una de las grandes diferencias entre Java y Pascal en cuando a la codificación es que Java se trata de un lenguaje de los llamados case sensitive Esto
Más detallesIntroducción a la programación orientada a objetos
Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases 3. El tipo Struct 4. Diferencias entre Class y Struct 5. Pilares de la Programación
Más detallesElementos léxicos del lenguaje de programación Java
Elementos léxicos del lenguaje de programación Java Elementos léxicos del lenguaje de programación Java Palabras reservadas Identificadores Literales Operadores Delimitadores Comentarios Apéndices Operadores
Más detallesUso de excepciones en Java
Uso de excepciones en Java En Java, cuando se produce un error en un método, se lanza un objeto Throwable. Cualquier método que haya llamado al método puede capturar la excepción y tomar las medidas que
Más detallesJava Inicial (20 horas)
Java Inicial (20 horas) 1 Temario 1. Programación Orientada a Objetos 2. Introducción y Sintaxis Java 3. Sentencias Control Flujo 4. POO en Java 5. Relaciones entre Objetos 6. Polimorfismo, abstracción
Más detallesPART II: Moviendo al jugador
UNITY PART II: Moviendo al jugador El movimiento se lo vamos a dar a través de un programa Definición de programa: Un programa es una secuencia de instrucciones, escritas para realizar una tarea específica
Más detallesTema 2. El lenguaje de programación Java (Parte 1)
Programación en Java Tema 2. El lenguaje de programación Java (Parte 1) Luis Rodríguez Baena Facultad de Informática Elementos del lenguaje (I) El juego de caracteres. No utiliza ASCII, sino Unicode de
Más detallesProgramación Orientada a Objetos con Java
Programación Orientada a Objetos con Java M.C. Jorge Eduardo Ibarra Esquer jorgeeie@uabc.mx Sobrecarga de métodos Java permite la definición de dos o más métodos que tengan el mismo nombre, dentro de la
Más detallesContenidos. Gestión dinámica de memoria. Gestión dinámica de memoria. Introducción. 1. Introducción 2. El operador NEW 3. El operador DELETE
Contenidos 1. Introducción 2. El operador NEW 3. El operador DELETE 1 Introducción Hasta ahora hemos visto que cada vez que queremos usar una variable debemos reservarle un lugar de la memoria al comenzar
Más detallesEntre los más conocidos editores con interfaz de desarrollo tenemos:
Herramientas de programación Para poder programar en ensamblador se precisa de algunas herramientas básicas, como un editor para introducir el código, un ensamblador para traducir el código a lenguaje
Más detallesCapítulo 12: Indexación y asociación
Capítulo 12: Indexación y asociación Conceptos básicos Índices ordenados Archivos de índice de árbol B+ Archivos de índice de árbol B Asociación estática Asociación dinámica Comparación entre indexación
Más detallesIntroducción a la Programación 11 O. Humberto Cervantes Maceda
Introducción a la Programación 11 O Humberto Cervantes Maceda Recordando En la sesión anterior vimos que la información almacenada en la memoria, y por lo tanto aquella que procesa la unidad central de
Más detallesTiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.
ORGANIZACIÓN DE LA MEMORIA EN TIEMPO DE EJECUCIÓN Compilador Tiempo de Compilación Programa fuente Secuencia de caracteres Scanner Secuencia de símbolos Parser Árbol sintáctico Analizador semántico Generador
Más detallesTema 6. Reutilización de código. Programación 2015-2016. Programación - Tema 6: Reutilización de código
Tema 6 Reutilización de código Programación 2015-2016 Programación - Tema 6: Reutilización de código 1 Tema 6. Reutilización de código Modularidad. Implementación de métodos. Uso de métodos. Programación
Más detallesby Tim Tran: https://picasaweb.google.com/lh/photo/sdo00o8wa-czfov3nd0eoa?full-exif=true
by Tim Tran: https://picasaweb.google.com/lh/photo/sdo00o8wa-czfov3nd0eoa?full-exif=true I. FUNDAMENTOS 3. Representación de la información Introducción a la Informática Curso de Acceso a la Universidad
Más detallesPreliminares. Tipos de variables y Expresiones
Preliminares. Tipos de variables y Expresiones Felipe Osorio Instituto de Estadística Pontificia Universidad Católica de Valparaíso Marzo 5, 2015 1 / 20 Preliminares Computadoras desarrollan tareas a un
Más detallesSOLUCION PARCIAL TASK SCHEDULER. Task Scheduler
Task Scheduler Se necesita modelar una aplicación que permita definir tareas y ejecutarlas en forma programada. Las tareas pueden ser: La ejecución de programa cualquiera o comando del sistema operativo,
Más detallesIdentificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java
Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java Identificadores Las variables se utilizan en programación para almacenar temporalmente
Más detallesINSTITUTO TECNOLOGICO de la laguna Programación Orientada a Objetos en C++
5.- Herencia Múltiple. Un hecho natural es que una persona tenga más de un pariente mayor, esta situación también se puede dar en la herencia de clases, naturalmente este tipo de herencia involucra un
Más detallesNota 2. Luis Sierra. Marzo del 2010
Nota 2 Luis Sierra Marzo del 2010 Cada mecanismo de definición de conjuntos que hemos comentado sugiere mecanismos para definir funciones y probar propiedades. Recordemos brevemente qué son las funciones
Más detalles1. Manejo de memoria estática 2. Manejo de memoria dinámica
1. Manejo de memoria estática 2. Manejo de memoria dinámica *La administración de memoria de una computadora es una tarea fundamental debido a que la cantidad de memoria es limitada. *El sistema operativo
Más detallesEl lenguaje de Programación C. Fernando J. Pereda <ferdy@gentoo.org>
El lenguaje de Programación C Fernando J. Pereda Por qué aprender C? Portable y muy extendido Estándar (C89, C99) El lenguaje de los sistemas Un lenguaje fácil (no, no es broma) Por
Más detallesA continuación resolveremos parte de estas dudas, las no resueltas las trataremos adelante
Modulo 2. Inicio con Java Muchas veces encontramos en nuestro entorno referencias sobre Java, bien sea como lenguaje de programación o como plataforma, pero, que es en realidad Java?, cual es su historia?,
Más detallesCONCEPTOS BASICOS DEL LENGUAJE JAVA
CONCEPTOS BASICOS DEL LENGUAJE JAVA NOMENCLATURA GENERAL En Java se distinguen las letras mayúsculas y minúsculas. Las reglas del lenguaje respecto a los nombres de variables son muy amplias y permiten
Más detallesClases y Objetos. Informática II Ingeniería Electrónica
Clases y Objetos Informática II Ingeniería Electrónica Los Tipos de Datos Hasta ahora, en un programa podemos usar para representar variables a: Tipos fundamentales : enteros (int), caracteres (char),
Más detallesGuía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones
Universidad Simón Bolívar Departamento de Computación y Tecnología de la Información CI3641 Lenguajes de Programación I Guía Corta: Alcance y Asociaciones Esta guía presenta algunos conceptos básicos y
Más detallesEstructura de Datos [Tipos de datos concretos y tipos de datos abstractos]
Estructura de Datos [Tipos de datos concretos y tipos de datos abstractos] M. en C. Sergio Luis Pérez Pérez UAM CUAJIMALPA, MÉXICO, D. F. Trimestre 14-O Sergio Luis Pérez (UAM CUAJIMALPA) Curso de Estructura
Más detallesObjetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.
Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero. Uso de Ficheros Todas las estructuras de datos vistas hasta ahora utilizan la
Más detallesConceptos. ELO329: Diseño y Programación Orientados a Objetos. ELO 329: Diseño y Programación Orientados a Objetos
Conceptos ELO329: Diseño y Programación Orientados a Objetos 1 Paradigmas de Programación Historia: Los computadores parten cableados por hardware, Luego se introduce la programación en binario, Se desarrolla
Más detallesTecnólogo Informático- Estructuras de Datos y Algoritmos- 2009
Árboles Ejemplos de estructuras arborescentes: con forma de árbol Regla de Alcance: los objetos visibles en un procedimiento son aquellos declarados en él mismo o en cualquier ancestro de él (cualquier
Más detallesUnidad I. 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal)
Unidad I Sistemas numéricos 1.1 Sistemas numéricos (Binario, Octal, Decimal, Hexadecimal) Los computadores manipulan y almacenan los datos usando interruptores electrónicos que están ENCENDIDOS o APAGADOS.
Más detallesRepaso de las características más importantes de la programación Java y su adaptación a Android
Repaso de las características más importantes de la programación Java y su adaptación a Android 1. Entorno de programación en java 2. Variables y tipos de datos 3. Operaciones y operadores 4. Clases y
Más detallesIntroducción a Java LSUB. 15 de enero de 2015 GSYC
Introducción a LSUB GSYC 15 de enero de 2015 (cc) 2014 Laboratorio de Sistemas, Algunos derechos reservados. Este trabajo se entrega bajo la licencia Creative Commons Reconocimiento - NoComercial - SinObraDerivada
Más detallesObjetos y Clases en Java. ELO 329: Diseño y Programación Orientados a Objetos
Objetos y Clases en Java ELO 329: Diseño y Programación Orientados a Objetos 1 Elementos de Análisis y Diseño orientado a objetos Notación y relaciones entre clases: Las clases son abstracciones para los
Más detallesBase de datos en Excel
Base de datos en Excel Una base datos es un conjunto de información que ha sido organizado bajo un mismo contexto y se encuentra almacenada y lista para ser utilizada en cualquier momento. Las bases de
Más detallesTema 3 Elementos básicos de programación
Representación de Datos y Aplicaciones Tema 3 Elementos básicos de programación Natividad Martínez Madrid nati@it.uc3m.es Objetivos del tema 3 Conocer la estructura básica de un programa Java Comprender
Más detallesIntroducción al lenguaje de programación java
Introducción al lenguaje de programación java Algoritmia y Programación Slide 1 LENGUAJES DE PROGRAMACION Un lenguaje de programación es un idioma artificial diseñado y creado para expresar algoritmos
Más detallesModelo de Objetos Distribuidos
Remote Method Invocation Modelo de Objetos Distribuidos Un objeto remoto es un objeto cuyos métodos pueden ser invocados desde otra máquina virtual de java, potencialmente en un host diferente. Modelo
Más detallesPROGRAMACIÓN ORIENTADA A OBJETOS
PROGRAMACIÓN ORIENTADA A OBJETOS Clase 1. Introducción Profesor: Diego Sánchez Gómez Introducción a la programación orientada a objetos 1. Introducción a la programación orientada a objetos 2. Las clases
Más detallesPráctica 3: Programación con subrutinas
Práctica 3: Programación con subrutinas 3.1 Objetivos El objetivo de esta práctica es estudiar el soporte del ensamblador del ARM para la gestión de subrutinas, para lo que resulta necesario familiarizarse
Más detallesCurso de Java POO: Programación orientada a objetos
Curso de Java POO: Programación orientada a objetos Luis Guerra Velasco Curso INEM 02830. Programación en Java Marzo 2010 Índice 1 Introducción a la POO 2 Herencia y polimorfismo 3 Empaquetado de proyectos
Más detallesPrimera Escuela de la Red Temática SVO. Madrid, 27-28 Noviembre, 2006 JAVA BÁSICO. Raúl Gutiérrez Sánchez LAEFF - INTA raul@laeff.inta.
Primera Escuela de la Red Temática SVO. Madrid, 27-28 Noviembre, 2006 JAVA BÁSICO LAEFF - INTA raul@laeff.inta.es Qué es Java? Java es un lenguaje de programación orientado a objetos desarrollado por Sun
Más detallesÁrboles. Cursos Propedéuticos 2015. Dr. René Cumplido M. en C. Luis Rodríguez Flores
Árboles Cursos Propedéuticos 2015 Dr. René Cumplido M. en C. Luis Rodríguez Flores Contenido de la sección Introducción Árbol genérico Definición y representación Árboles binarios Definición, implementación,
Más detallesLABORATORIO Nº 2 GUÍA PARA REALIZAR FORMULAS EN EXCEL
OBJETIVO Mejorar el nivel de comprensión y el manejo de las destrezas del estudiante para utilizar formulas en Microsoft Excel 2010. 1) DEFINICIÓN Una fórmula de Excel es un código especial que introducimos
Más detallesVisual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario
Empleo de módulos y Procedimientos Procedimientos definidos por el usuario Según lo que hemos visto hasta ahora, Visual Basic, almacena el código en módulos. Hay tres clases de módulos: formularios (.frm),
Más detallesContenidos. Funciones (suplemento) Funciones. Justificación del uso de Funciones
Contenidos 1. Justificación del uso de funciones. 2. Declaración de funciones: prototipos. 3. Prototipos y ficheros de cabecera. 4. Polimorfismo (sobrecarga de funciones). 5. Argumentos formales y actuales.
Más detallesGeneración de código para funciones. Generación de código para funciones. Generación de código para funciones. Generación de código para funciones
Ejemplo introductorio: escritura de funciones en NASM Ejemplo introductorio: escritura de funciones en NASM En estas transparencias pondremos una subrutina ASPLE y la generación de código equivalente En
Más detallesIntroducción a PHP. * No es necesario declarar previamente las variables.
Introducción a PHP La programación de sitios web cada día está más orientada al desarrollo de páginas dinámicas y aplicaciones, o sea sitios donde el usuario pueda interactuar con la web. Dentro de los
Más detallesMovimiento a través de una. José San Martín
Movimiento a través de una curva José San Martín 1. Introducción Una vez definida la curva sobre la cual queremos movernos, el siguiente paso es definir ese movimiento. Este movimiento se realiza mediante
Más detallesCompiladores y Lenguajes de Programación. Maria de Guadalupe Cota Ortiz
Compiladores y Lenguajes de Programación Maria de Guadalupe Cota Ortiz Organizaciones que rigen las normas para estandarización de Lenguajes de Programación IEEE (Instituto de Ingenieros Eléctricos y Electrónicos)
Más detallesListas, Pilas, Colas y Punteros. Semana 3
Listas, Pilas, Colas y Punteros Semana 3 Dictado por Marco González Núñez 14 de Febrero de 2011 Estructuras de datos simples Hoy hablaremos de lo que sin duda me motivó a crear este curso que son los punteros,
Más detallesIntroducción al tipo de dato ARRAY
CONTENIDOS. Introducción al tipo de dato ARRAY. Definición, Características, Declaración, Acceso e Inicialización.. Arrays multidimensionales Definición, Declaración, Acceso e Inicialización. Introducción
Más detallesJavaScript como Orientación a Objetos
Gustavo Lacoste (gustavo@lacosox.org) October 2012 Resumen El objetivo de las siguientes notas es generar una estructura en JavaScript que nos permita reutilizar de manera limpia las funciones creadas
Más detallesDEFINICION. Ing. M.Sc. Fulbia Torres Asignatura: Estructuras de Datos Barquisimeto 2006
ARBOLES ESTRUCTURAS DE DATOS 2006 DEFINICION Un árbol (tree) es un conjunto finito de nodos. Es una estructura jerárquica aplicable sobre una colección de elementos u objetos llamados nodos; uno de los
Más detallesTRADUCTORES, COMPILADORES E INTÉRPRETES. EJERCICIOS TEMA 5, 6, 7 y 8.
TRADUCTORES, COMPILADORES E INTÉRPRETES. EJERCICIOS TEMA 5, 6, 7 y 8. 1.) (HOLUB). Escribir un traductor que reconozca definiciones de C siguiendo el estilo antiguo, tal como: prueba(uno, dos, tres, cuatro,
Más detallesProgramación Genética
Programación Genética Programación Genética consiste en la evolución automática de programas usando ideas basadas en la selección natural (Darwin). No sólo se ha utilizado para generar programas, sino
Más detallesTIPOS DE DATOS DEFINIDOS POR EL PROGRAMADOR: Estructuras CONTENIDOS
ESTRUCTURAS CONTENIDOS 1. Concepto de estructura 2. Definición del tipo de dato estructura 3. Declaración de variables de tipo estructura 4. Inicialización de variables de tipo estructura 5. Acceso a los
Más detallesPHP y MySQL. Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases
PHP y MySQL Inicio: - Herencia - Palabra clave Final - Polimorfismo - Type Hinting - Abstracción de clases Herencia de Objetos La herencia permite crear muchas clases que son similares entre si, sin tener
Más detallesLenguajes de Programación
Lenguajes de Programación Mediante los programas se indica a la computadora que tarea debe realizar y cómo efectuarla, pero para ello es preciso introducir estas órdenes en un lenguaje que el sistema pueda
Más detallesEstructuras de Datos y Algoritmos. Árboles de Expresión
Estructuras de Datos y Algoritmos Árboles de Expresión Año 2014 Introducción Los avances tecnológicos producen día a día una gran cantidad de información que debe ser almacenada y procesada en forma eficiente.
Más detallesTaller de Programación Estructurada en Java Tema 2. Fundamentos de la programación orientada a objetos
Taller de Programación Estructurada en Java Tema 2. Fundamentos de la programación orientada a objetos Ingeniero en Computación José Alfredo Cobián Campos josealfredocobian@gmail.com Facultad de Ciencias
Más detallesTema 2. Diseño del repertorio de instrucciones
Soluciones a los problemas impares Tema 2. Diseño del repertorio de instrucciones Arquitectura de Computadores Curso 2009-2010 Tema 2: Hoja: 2 / 16 Tema 2: Hoja: 3 / 16 Base teórica Al diseñar un computador,
Más detallesEl lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */
Principios de Programación El lenguaje C 1. Variables locales y globales 1.1. Variables locales Las funciones permiten al programador modularizar un programa. Todas las variables declaradas en las definiciones
Más detallesINTELIGENCIA ARTIFICIAL 2015 TALLER RÁPIDO DE PROGRAMACIÓN EN JAVA
INTELIGENCIA ARTIFICIAL 2015 TALLER RÁPIDO DE PROGRAMACIÓN EN JAVA Fuente: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html Por qué Java? TIOBE Index for March 2015 Fuente: http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
Más detallesDESARROLLO DE HABILIDADES DEL PENSAMIENTO LÓGICO
I. SISTEMAS NUMÉRICOS DESARROLLO DE HABILIDADES DEL PENSAMIENTO LÓGICO LIC. LEYDY ROXANA ZEPEDA RUIZ SEPTIEMBRE DICIEMBRE 2011 Ocosingo, Chis. 1.1Sistemas numéricos. Los números son los mismos en todos
Más detallesObjetivo de aprendizaje del tema
Computación II Tema 3. Identificadores, palabras clave y tipos de datos Objetivo de aprendizaje del tema Al finalizar el tema serás capaz de: Distinguir i entre modificadores d válidos y no válidos. Enumerar
Más detallesPROGRAMACIÓN BÁSICA DE LA COMPUTADORA. 1 Introducción. Tabla 1: Instrucciones MIPS
PROGRAMACIÓN BÁSICA DE LA COMPUTADORA 1 Introducción Un sistema de computadora total incluye tanto circuitería (hardware) como programación (software). El hardware consta de los componentes físicos y todo
Más detallesREDES INFORMATICAS: Protocolo IP
REDES INFORMATICAS: Protocolo IP 1. PRINCIPIOS BÁSICOS DE IP El protocolo IP se basa en tres principios básicos: Un direccionamiento de los ordenadores. Un tipo de dato: el datragrama IP. Un algoritmo
Más detallesTecnologías en la Educación Matemática. Expresiones. Datos. Expresiones Aritméticas. Expresiones Aritméticas 19/08/2014
Tecnologías en la Educación Matemática jac@cs.uns.edu.ar Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR 1 Datos Los algoritmos combinan datos con acciones. Los datos de entrada
Más detallesUNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos
2.1. Principios básicos del Modelado de Objetos UNIDAD 2: Abstracción del Mundo real Al Paradigma Orientado a Objetos Hoy en día muchos de los procesos que intervienen en un negocio o empresa y que resuelven
Más detallesUNIDADES FUNCIONALES DEL ORDENADOR TEMA 3
UNIDADES FUNCIONALES DEL ORDENADOR TEMA 3 INTRODUCCIÓN El elemento hardware de un sistema básico de proceso de datos se puede estructurar en tres partes claramente diferenciadas en cuanto a sus funciones:
Más detalles11. Algunas clases estándar de Java (II)
122 A. García-Beltrán y J.M. Arranz 11. Algunas clases estándar de Java (II) Objetivos: a) Presentar la clase predefinida en Java para trabajar con arrays b) Interpretar el código fuente de una aplicación
Más detallesExamen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1
Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1.1 Ejercicio 1: Máquina Expendedora (3.5 ptos.)... 1 1.2 Ejercicio 2: Clase Circulo (1.0 pto.)... 3 1.3 Ejercicio
Más detallesSERVICE ORIENTED ARCHITECTURE (SOA) CONTENIDO
SERVICE ORIENTED ARCHITECTURE (SOA) CONTENIDO Introducción:...1 Service Oriented Architecture...2 Elementos de una Service Oriented Architecture...2 Application frontends...2 Servicios...2 Contrato:...3
Más detallesEXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011
EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso 2010 2011. Cuatrimestre de otoño. 17 de Enero de 2011 1. (0,75 PUNTOS) Identificad a continuación las sentencias que son ciertas, descartando
Más detallesANÁLISIS SEMÁNTICO. Especificación formal: Semántica Operacional, semántica denotacional, semántica Axiomática, Gramáticas con Atributos.
ANÁLISIS SEMÁNTICO El análisis semántico dota de un significado coherente a lo que hemos hecho en el análisis sintáctico. El chequeo semántico se encarga de que los tipos que intervienen en las expresiones
Más detallesÁrboles AVL. Laboratorio de Programación II
Árboles AVL Laboratorio de Programación II Definición Un árbol AVL es un árbol binario de búsqueda que cumple con la condición de que la diferencia entre las alturas de los subárboles de cada uno de sus
Más detallesExamen Principios de Programación Febrero 2012
Por favor siga las siguientes indicaciones: Escriba con lápiz. Escriba su nombre y número de documento en todas las hojas que entregue. Numere las hojas e indique el total de hojas en la primera de ellas.
Más detallesCASO PRÁCTICO DISTRIBUCIÓN DE COSTES
CASO PRÁCTICO DISTRIBUCIÓN DE COSTES Nuestra empresa tiene centros de distribución en tres ciudades europeas: Zaragoza, Milán y Burdeos. Hemos solicitado a los responsables de cada uno de los centros que
Más detallesFunciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.
MIPS Funciones 1 Funciones Diseño de funciones. Uso de instrucción jal y retorno de subrutina. Se suelen denominar funciones, procedimientos, subrutinas, subprogramas a las estructuras que emplean los
Más detallesProf. Dr. Paul Bustamante
Carnet Nombre: Examen C++ Grupo A Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Pág.1 Índice 1. INTRODUCCIÓN... 1 2. EJERCICIO 1: AGENDA TELEFÓNICA (4.0 PTOS.)...1 3. EJERCICIO 2:
Más detallesCLASE # 5 TÉCNICAS DE CAJA BLANCA
CLASE # 5 TÉCNICAS DE CAJA BLANCA 750105M - TÉCNICAS DE PRUEBAS DE SOFTWARE INGENIERÍA DE SISTEMAS Y COMPUTACIÓN UNIVERSIDAD DEL VALLE SEMESTRE 2013A - DOCENTE BEATRIZ FLORIAN GAVIRIA Basado Parcialmente
Más detalles1 1 0 1 x 1 0 1 1 1 1 0 1 + 1 1 0 1 0 0 0 0 1 1 0 1 1 0 0 0 1 1 1 1
5.1.3 Multiplicación de números enteros. El algoritmo de la multiplicación tal y como se realizaría manualmente con operandos positivos de cuatro bits es el siguiente: 1 1 0 1 x 1 0 1 1 1 1 0 1 + 1 1 0
Más detallesSensor de Temperatura utilizando el Starter Kit Javelin Stamp. Realizado por: Bertha Palomeque A. Rodrigo Barzola J.
Sensor de Temperatura utilizando el Starter Kit Javelin Stamp Realizado por: Bertha Palomeque A. Rodrigo Barzola J. INTRODUCCION DIFERENCIAS EJEMPLOS JAVA Orientado a Objetos Multiplataforma Programar
Más detallesTema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle
Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle Contenido Tipos de herencia Herencia y niveles de visibilidad Herencia y creación Redefinición de métodos Conversión
Más detallesIntroducción. Ciclo de vida de los Sistemas de Información. Diseño Conceptual
Introducción Algunas de las personas que trabajan con SGBD relacionales parecen preguntarse porqué deberían preocuparse del diseño de las bases de datos que utilizan. Después de todo, la mayoría de los
Más detallesLenguaje de Programación: Go
Centro de Investigación y de Estudios Avanzados del I.P.N 9 de Noviembre de 2011 Go Es un lenguaje de programación de propósito general que es promovido por: Rob Pike, Robert Griesemer, Ken Thompson, Russ
Más detallesIngº CIP Fabian Guerrero Medina Master Web Developer-MWD
1 Java es un lenguaje de programación de Sun Microsystems originalmente llamado "Oak. James Gosling Bill Joy 2 Oak nació para programar pequeños dispositivos electrodomésticos, como los asistentes personales
Más detallesCiclo de vida y Metodologías para el desarrollo de SW Definición de la metodología
Ciclo de vida y Metodologías para el desarrollo de SW Definición de la metodología La metodología para el desarrollo de software es un modo sistemático de realizar, gestionar y administrar un proyecto
Más detalles3.1 INGENIERIA DE SOFTWARE ORIENTADO A OBJETOS OOSE (IVAR JACOBSON)
3.1 INGENIERIA DE SOFTWARE ORIENTADO A OBJETOS OOSE (IVAR JACOBSON) 3.1.1 Introducción Este método proporciona un soporte para el diseño creativo de productos de software, inclusive a escala industrial.
Más detalles19. Packages o paquetes
Programación orientada a objetos con Java 201 19. Packages o paquetes Objetivos: a) Definir el concepto de paquete b) Interpretar el código fuente de una aplicación Java donde se utilicen paquetes c) Construir
Más detallesDefinición de clases: Herencia, polimorfismo, ligadura dinámica
Tema 7 Definición de clases: Herencia, polimorfismo, ligadura dinámica Con alguna frecuencia es necesario definir clases de objetos entre las cuales hay elementos comunes. En una aplicación en la cual
Más detallesManual de NVU Capítulo 4: Los enlaces
Manual de NVU Capítulo 4: Los enlaces Pág. 1 Manual de NVU Capítulo 4: Los enlaces Reconocimiento-NoComercial-CompartirIgual 2.5 España Realizado por: Julio Ruiz Palmero (Universidad de Málaga) julioruiz@uma.es
Más detallesUso de Visual C++ Pre-Practica No. 3
Pre-Practica No. 3 Uso de Visual C++ Microsoft Visual C++ 2010 es una versión de Visual Studio específica para el lenguaje de programación C++. Es un entorno de desarrollo muy completo y profesional. Por
Más detallespicojava TM Características
picojava TM Introducción El principal objetivo de Sun al introducir Java era poder intercambiar programas ejecutables Java entre computadoras de Internet y ejecutarlos sin modificación. Para poder transportar
Más detalles