Tema 6: Generación de código (parte 2)



Documentos relacionados
Constructores y Destructores

8. Sentencia return y métodos

Programación de Sistemas

Un puntero no es más que una variable estática cuyo contenido es una dirección de memoria.

Estructura de Computadores

El lenguaje C. #define MAX LINEA 1000 /* maximo tamanio de linea de entrada */

Funciones. Diseño de funciones. Uso de instrucción jal y retorno de subrutina.

Tema: FUNCIONES, PROCEDIMIENTOS Y RECURSIVIDAD.

Generació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

Tecnólogo Informático- Estructuras de Datos y Algoritmos- 2009

Tema 6. Reutilización de código. Programación Programación - Tema 6: Reutilización de código

Procesadores de lenguaje Tema 5 Comprobación de tipos

Tiempo de Compilación. Programa fuente. Secuencia. de caracteres. Scanner. Secuencia. de símbolos Parser. Compilador.

Programación Avanzada para Sistemas de Telecomunicación Arrays

Sistema de Gestión Portuaria Sistema de Gestión Portuaria Uso General del Sistema

Programación estructurada

Tema 3: Herencia en C++ Programación Orientada a Objetos Curso 2008/2009 Begoña Moros Valle

Curso de Excel Avanzado

1. Manejo de memoria estática 2. Manejo de memoria dinámica

Examen Principios de Programación Febrero 2012

Árboles. Cursos Propedéuticos Dr. René Cumplido M. en C. Luis Rodríguez Flores

1. Ejemplo de clase : La clase Cuenta 2. Uso de la clase Cuenta. 3. Métodos y objetos receptores de mensajes (Importante)

GENERACIÓN DE CÓDIGO

FUNDAMENTOS DE INFORMÁTICA

Herramientas computacionales para la matemática MATLAB: Funciones definidas por el usuario (parte II)

Modulo 1 El lenguaje Java

Práctica 3: Programación con subrutinas

Plantillas Office. Manual de usuario Versión 1.1

Partes de un programa en Java. A. Ejemplo de un Programa en Java /* Programa Ejemplo de Java: Muestra una Ventana Archivo: Ejemplo1.

Capítulo 4. Vectores y matrices. 4.1 Declaración de tablas. 4.2 Declaración estática de tablas

Guía Corta: Alcance y Asociaciones. 1. Preliminares: Nombres y Asociaciones

Introducción a la Programación Ingenieria en Informática Junio 2008

Visual Basic 1. Empleo de módulos y Procedimientos. Procedimientos definidos por el usuario

Herencia. 3.- Herencia. Declaración de una clase derivada en Delphi. Jerarquía de clases

Bloque 4. La descomposición funcional y el diseño descendente

Breve manual de Doxygen

Aplicaciones seguras con ClaseSeguridad

editor de HTML integrado en Moodle. El contenido se divide en distintas partes llamadas páginas, que se muestran individualmente.

SOLUCION EXAMEN junio 2006

Contenidos. 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. Funciones (suplemento) Funciones. Justificación del uso de Funciones

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Introducción a la programación orientada a objetos

Problema B Olonso y los laberintos

Agradecimiento: A Javier Lomelín Urrea por su dedicación y esmero en este proyecto. Manuel Fernando Guzmán Muñoz Presidente OMIJal

Conectar Flash con Access usando MDM Zinc

Escuela Politécnica Superior de Ingeniería Departamento de Ingeniería Informática

Ahora después de ver las múltiples herramientas de desarrollo de ABAP, podemos ver los detalles del lenguaje:

Introduccion al Lenguaje C. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

PROCEDIMIENTOS ALMACENADOS. CREATE PROCEDURE nombreprocedimiento tipodato [=valordefecto]][,...]

Uso de Visual C++ Pre-Practica No. 3

Una variable de clase escalar tiene un nivel de indirección igual a 1. Por ejemplo, las variables i, b y x definidas como se muestra a continuación.

Se guardan en archivos con extencion c y los cabezales con extension h

Mi primer proyecto en Dev-C++

BREVE MANUAL DE SOLVER

PASCAL. Repaso de Pascal Introducción a Python. Pascal. Pascal - introducción. Pascal Declaraciones: Variables. Pascal Declaraciones: Tipos 07/04/2015

MEJORAR EL RENDIMIENTO DEL EXPLORADOR DE INTERNET

TRADUCTORES, COMPILADORES E INTÉRPRETES. EJERCICIOS TEMA 5, 6, 7 y 8.

Programación Orientada a Objetos con Java

Base de datos Procedimientos Almacenados y Funciones

Ejercicio 1. Desarrollar un pequeño juego para practicar mecanografía.

Preliminares. Tipos de variables y Expresiones

Objetivos de la práctica: - Practicar uso de ficheros: abrir, cerrar y tratamiento de información contenida en el fichero.

Funciones Condicionales

Objetivo: Introducción conceptual y aplicación básica de los lenguajes del lado del servidor.

Introducción a la Computación TFA

Estructuras de Datos y Algoritmos Tecnólogo en Informática

Manual básico de Robomid

Programación Orientada a Objetos en Java

Listas, Pilas, Colas y Punteros. Semana 3

EXAMEN FINAL Metodología y Programación Orientada a Objetos. Curso Cuatrimestre de otoño. 17 de Enero de 2011

Examen Junio- Grupo A Lunes 17 de Junio - Programación en C++ Pág. 1

Instituto de Computación - Facultad de Ingeniería - Universidad de la República

Race Manager by Master Timing Guía del usuario GUIA RACE MANAGER. Eventronic, SL

1 (2 5 puntos) Responda con brevedad y precisión a las siguientes preguntas:

1. Programa de ejemplo

UNIDADES FUNCIONALES DEL ORDENADOR TEMA 3

Guía de Aprendizaje No. 1

Práctica 2 Gráficos Vectoriales con SVG (versión )

TUTORIAL PARA REDIMENSIONAR FOTOS

Pasos para Realizar un Programa de lenguaje C en modo Consola en Visual Studio 2008 INDICE

Fundamentos de la Programación

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

PROCEDIMIENTOS DE TÍTULOS. Para solicitar los títulos al finalizar determinadas enseñanzas es preciso seguir un proceso en la aplicación Plumier XXI.

11. Algunas clases estándar de Java (II)

UTILIZACIÓN DE RELOJES

CASO PRÁCTICO DISTRIBUCIÓN DE COSTES

MICQ. Trabajo Práctico Final Seminario de Ingeniería en Informática I Facultad de Ingeniería, UBA. Junio Cátedra: Pablo Cosso

Prof. Dr. Paul Bustamante

TEMA 8: ESTRUCTURAS DE DATOS COMPLEJAS 1 VECTORES ESTÁTICOS 2 2 CADENAS O VECTORES DE CARACTERES 6 3 PASO DE CADENAS Y ARRAYS A FUNCIONES 8

Lenguaje C Funciones. Omar Andrés Zapata Mesa Grupo de Fenomenología de Interacciones Fundamentales, (Gfif) Universidad de Antioquia

Manual de rol gestor de GAV para moodle 2.5

Tema: Clases y Objetos en C++.

- MANUAL INSTALACIÓN LINUX -

Análisis de los datos

GESTION DE LA BASE DE DATOS

Bases de Datos SQL 1 SQL. Jorge Pérez R. Universidad de Talca, II Semestre 2006

ARBOLES ARBOLES BINARIOS ORDENADOS. REPRESENTACIÓN Y OPERACIONES

Transcripción:

Tema 6: Generación de código (parte 2) Procesamiento de Lenguajes Dept de Lenguajes y Sistemas Informáticos Universidad de Alicante Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 1 / 13 Generación de código para funciones Caso simple: lenguajes sin recursividad Compilar un programa con funciones implica: Compilar el código de la función Compilar las llamadas a la función El código generado para una función tiene una etiqueta/dirección de comienzo Los argumentos tienen posiciones fijas de memoria (como las variables globales), y el valor de retorno (el que devuelve la función) también y las variables locales, y la dirección de retorno (posición del programa a la que vuelve cuando termina la función) Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 2 / 13

Registro de activación de una función Al conjunto de valores formado por: valor de retorno dirección de retorno argumentos variables locales variables temporales se le llama Registro de activación (Activation record, frame) En un lenguaje que no permita la recursividad, en un momento dado solamente hay una instancia de cada función ejecutándose, luego el registro de activación puede (y debe) tener una dirección de memoria fija y conocida por el compilador Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 3 / 13 Ejemplo 1 (sin recursividad) int incrementa(int a) int res; res = a + 1; return res; L1 mov dir(a) tmp1 mov #1 tmp2 mov tmp1 A addi tmp2 mov A tmp3 mov tmp3 dir(res) ; secuencia de retorno mov dir(res) tmp1 mov tmp1 valor_retorno mov direccion_retorno A jmp @A 87 valor de retorno 88 dirección de retorno 89 a 90 res 91 tmp1 92 tmp2 93 tmp3 Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 4 / 13

Ejemplo 1 (sin recursividad) int incrementa(int a) int res; res = a + 1; return res; L1 mov 89 91 mov #1 92 mov 91 A addi 92 mov A 93 mov 93 90 ; secuencia de retorno mov 90 91 mov 91 87 mov 88 A jmp @A 87 valor de retorno 88 dirección de retorno 89 a 90 res 91 tmp1 92 tmp2 93 tmp3 Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 4 / 13 Ejemplo 1 (sin recursividad) Código de la llamada n = 7; b = incrementa(n); mov #7 tmp1 mov tmp1 dir(n) ; secuencia de llamada mov dir(n) tmp1 ; cálculo de los parámetros mov tmp1 89 ; cargar el primer parámetro mvetq L7 88 ; guardar dirección de retorno jmp L1 L7 mov 87 tmp2 ; coger valor de retorno mov tmp2 dir(b) Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 5 / 13

Generación de código para funciones Caso general: lenguajes con recursividad Si el lenguaje permite la recursividad, un registro de activación estático (con dirección de memoria fija) no sirve Ejemplo: int factorial(int n) if (n<=1) return 1; else return factorial(n-1)*n; factorial(5) factorial(4)*5 factorial(3)*4 factorial(2)*3 factorial(1)*2 Cada instancia (llamada) debe tener su propio registro de activación las direcciones de memoria de argumentos, variables locales, etc, no son estáticas Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 6 / 13 Registro de activación en un lenguaje con recursividad B valor de retorno dirección de retorno B anterior parámetros variables locales temporales locales donde B es un registro del procesador que se utiliza para apuntar al registro de activación actual Cada vez que se hace una llamada hay que guardar el valor anterior de B, crear el nuevo registro y hacer que B apunte a ese nuevo registro Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 7 / 13

Ejemplo 1 (con recursividad) int incrementa(int a) int res; res = a + 1; return res; L1 mov @B+0 @B+2 ; tmp1 = a mov #1 @B+3 ; tmp2 = 1 mov @B+2 A addi @B+3 mov A @B+4 ; tmp3 = tmp1 + tmp2 mov @B+4 @B+1 ; res = tmp3 ; secuencia de retorno mov @B+1 @B+2 ; tmp1 = res mov @B+2 @B-3 ; valor de retorno = tmp1 mov @B-2 A ; dirección de retorno en A jmp @A B valor de retorno dirección de retorno B anterior a res tmp1 tmp2 tmp3 Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 8 / 13 Ejemplo 1 (con recursividad) Código de la llamada n = 7; b = incrementa(n); // suponemos dir(n) = @B+2, dir(b)=@b+3 mov #7 @B+5 ; tmp1 = 7 mov @B+5 @B+2 ; n = tmp1 ; secuencia de llamada: reservamos 5,6,7,8 para RA mov @B+2 @B+9 ; cálculo de los parámetros mov @B+9 @B+8 ; cargar el primer parámetro (n --> a) mov B @B+7 ; guardar B anterior mov B A addi #8 mov A B ; poner nueva B apuntando al primer argumento mvetq L7 @B-2 ; guardar dirección de retorno jmp L1 L7 mov @B-1 B ; restaurar valor de B mov @B+5 @B+3 ; b = valor de retorno Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 9 / 13

Compilación de funciones en lenguajes con recursividad En el código de la función: Direcciones de argumentos, variables locales y temporales relativas a B (@B+0, @B+1, ) Secuencia de retorno al compilar return Secuencia de retorno por defecto (por si no hay return) En la llamada: Reserva de espacio (temporales) para el RA Cálculo y carga de parámetros en RA Guardar B anterior Poner nuevo valor de B Guardar dirección de retorno y saltar Al volver, restaurar B (podría hacerse en la función) Usar el valor devuelto (es como una temporal más) Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 10 / 13 Generación de código para funciones Caso particular: lenguajes con subprogramas anidados En lenguajes como Pascal se permite declarar funciones locales a otras funciones: funcion abuelo:integer; var abu:real; function padre(a:integer;b:real):real; var pad:real; function hijo(c:real):real; begin hijo := c+pad+abu; (* return c+pad+abu *) end; function hermano(v:integer):real; var w:real; begin w := hijo(v/25); Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 11 / 13

Lenguajes con subprogramas anidados (ej Pascal) En los subprogramas (funciones o procedimientos) es posible utilizar las variables del padre, abuelo, etc Problema: dónde están esas variables? los RA del padre, abuelo, etc están situados debajo del actual, pero no se sabe exactamente dónde, y puede variar en función del código (puede ser que a un subprograma lo llame su padre o un hermano) Solución: guardar en todo momento un vector de punteros a RA de todos los niveles de anidamiento, conocido con el nombre de Display Puesto que un subprograma puede llamar a un tio (o tio abuelo), es necesario guardar el Display (todo o una parte) en el RA al hacer la llamada, y se debe restaurar al terminar la función Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 12 / 13 Registro de activación con subprogramas anidados B valor de retorno dirección de retorno Display B anterior parámetros variables locales temporales locales Procesamiento de Lenguajes Tema 6: Generación de código (parte 2) 13 / 13