Generación de Código Jorge Bernal Prassanna Ravishankar 4 de diciembre de 2013 Gemma Sánchez Capı́tulo 1 Introducción Este documento sirve de guı́a para enfocar la práctica final de la asignatura Compiladors I: Generación de Código. Los objetivos de esta práctica son: Afianzamiento de los conceptos presentados en las clases de teorı́a acerca de organización de memoria y generación de código. Planteamiento del impacto que tienen las ampliaciones de LS en cuanto a la generación de código, las cuales tendrán que ser implementados en CoSeL en la siguiente entrega. 1 Capı́tulo 2 Generación de Código 2.1. Objetivo de la práctica Dada la gramática que creamos en las sesiones anteriores del lenguaje LS+ y su análisis semántico el paso final es crear el generador de código del lenguaje LS+ para tener ası́ todo el compilador implementado. Para poder realizar este último paso contamos con el compilador del lenguaje LS que es la base del LS+. Las explicaciones relacionadas con el compilador del lenguaje LS han sido desarrolladas en las clases de teorı́a. Para poder desarrollar esta última práctica se plantea de nuevo una doble entrega: sesión de seguimiento y sesión de evaluación. El objetivo final de la práctica será añadir a la solución del análisis semántico consideraciones referentes a desplazamientos de las variables, medidas de los tipos y organización de memoria. Además el alumno deberá indicar que instrucciones de pseudoensamblador se han de generar y en qué puntos concretos de la gramática han de ir. 2.2. Consideraciones relacionadas con la generación de código de LS+ Consideraciones generales relativas al lenguaje simple (LS): El lenguaje LS es un lenguaje imperativo fuertemente tipado. Si hacemos la suma de un entero con un real se transformará primero el entero en real y luego se hará la suma de reales. Lo mismo para todas las operaciones de suma, resta, multiplicación ... El lenguaje LS permite la declaración de tipos de datos, variables, funciones y procedimientos anidados; por tanto tendremos display en el bloque de activación de las funciones. 2 El tipo de datos de las expresiones boleanas de if o while han de ser enteros: en estos casos se evalúan los enteros como valores lógicos. Consideraciones particulares de la práctica de generación de código: Sólo se ha de realizar la generación de código para las 10 ampliaciones de LS propuestas en la práctica: 1) Módulo, división entera y potencia; 2) Declaración simultánea de múltiples variables del mismo tipo; 3) Inicialización de variables; 4) Declaración de parámetros de entrada y salida; 5) Declaración simultánea de múltiples parámetros del mismo tipo; 6) Creación, acceso e inicialización de arrays multidimensionales; 7) Bucle for inspirado remotamente en el for de C; 8) Instrucción switch; 9) Declaración de records con creación de multiples campos de un mismo tipo e inicialización, y 10) Instrucción with-do. El resto de instrucciones ya vendrán dadas en el fichero .csl correspondiente. La instrucción with do ha de contener un elemento de tipo record. Dentro de esta función deberemos ser capaces de acceder a los campos del record y al salir de la instrucción han de quedar modificados tal y como corresponde. La instrucción for tiene tres partes en su cabecera: inicialización - sin permitir declaración de variables -, comprobación e actualización de la variable ı́ndice. Hemos de ver en que partes del código se han de realizar estas acciones. La instrucción switch es como una concatenación de if, if-else y else con las condiciones puestas a continuación de cada case. En cuanto a la declaración de listas de variables, parámetros o campos de un record de la forma: id, id, id: tipus hemos de vigilar cuáles son los desplazamientos o direcciones para poder acceder a ellas. También hemos de vigilar que los campos de un record definidos como tal continúen en el orden definido. Los arrays definidos como array [1,2,3] of integer se han de tratar como si fuesen array[1] of array[2] of array[3] of integer, tanto para reservar espacio como para acceder a las posiciones concretas. Las declaraciones con inicialización de variables y campos del estilo var a:integer=10; var b:array[5] of integer=[1,2,3,c+d,5]; var c:r1; c=r1(4,”jorge”,[1,2,3]); pueden y deben asignarse directamente en bloque en la zona de memoria reservada para la variable correspondiente. Recordad que si hay más de una variable en la definición y sólo una asignación el valor de esta última afecta a todas las variables. Referente a los parámetros de entrada y salida recordad que consideraremos los parámetros in como un paso de parámetros por valor y los parámetros out como un paso por referencia del siguiente modo: los parámetros 3 de entrada serán variables de cualquier tipo que deberán tener un valor al ser pasados en la función. En cambio los parámetros de salida serán direcciones de memoria en las que habrá que escribir información: pasarı́amos la dirección de la variable. Inicialización de Records: Con el fin de acotar lo que se ha de hacer en la práctica se ha realizado una simplificación de uno de los métodos para inicializar records. Con anterioridad una de las inicializaciones era la siguiente: Type rec=record c1:integer; c2:integer; end; Var a:rec; a = a(10,20); Para esta práctica se considerará como válida sólo la siguiente inicialización: Type rec=record c1:integer; c2:integer; end; Var a:rec; a = rec(10,20); El cambio consiste que al inicializar el record no ponemos a ambos lados de la igualación la variable a inicializar sino que obligamos a indicar el tipo del dato que se quiere inicializar. Este cambio no supone modificación alguna al análisis semántico. 4 Capı́tulo 3 Entregables 3.1. Sesión Seguimiento La evaluación relacionada con la entrega referida a la sesión de seguimiento tendrá lugar durante la semana del 16 de Diciembre y se llevará a cabo mediante el aplicativo PSG (neptu.uab.es). La entrega del fichero correspondiente a la entrega tiene como fecha y hora lı́mite el 17 de Diciembre a las 23h59. Dicha entrega consistirá en: Un informe (sin máximo de páginas) donde se planteará la solución para la generación de código de cada una de las 10 ampliaciones de la gramática de LS. Se sugiere a los alumnos que sigan el formato que se indica a continuación: Ejemplo: <DecVar> :: = Identificador <tipus(t)> @R1 [= <expressio> @R2]; R1: Reservar espacio en TS para variable del tipo t. R2: Si hay inicializacion poner el valor en la pila y luego guardarlo en la variable dentro del ambito que toque. Se recomienda asimismo a los alumnos que realicen esta práctica sobre la gramática final del análisis sintáctico - no sobre el semántico -, es decir, sobre el fichero que se entregó en el PSG la semana del 28 de Octubre. Aunque el código final se construirá a partir del análisis semántico final es mejor realizar la sesión de seguimiento sobre el semántico al facilitar ası́ la elaboración y corrección de la práctica. El informe tendrá que incluir también al final la generación de código de toda la gramática pero sólo modificando lo relativo a las 10 ampliaciones del LS+. 5 Dicho informe se podrá hacer mediante cualquier procesador de texto (Word, LaTeX) y deberá constar de secciones fijas de planteamiento del problema, recopilación de problemas encontrados durante la resolución de la práctica y, si ha sido el caso, una recopilación de las fuentes bibliográficas empleadas durante la resolución de la misma. La evaluación de la sesión de seguimiento será individual durante la sesión más la nota derivada de la corrección del informe. Las notas de la sesión de seguimiento se colgarán en la web de la asignatura durante la semana siguiente a la entrega. 3.2. Sesión Evaluación La entrega final de Generación de Código tendrá lugar la semana del 13 de Enero. En este caso la entrega consistirá en subir al PSG el fichero .csl con la generación de código realizada. Los alumnos deberán tener en cuenta lo siguiente: Para que la práctica sea corregida el fichero NO ha de contener errores que impidan su carga correcta. En el caso de que no se pueda cargar el archivo, los alumnos tendrán que corregir dicho error y entregarlo como práctica de recuperación ANTES de la sesión de seguimiento de la práctica siguiente. La práctica de los alumnos deberá pasar los test del autotest proporcionado en el fichero gencod.csl (se colgará la versión definitiva el 19 de Diciembre). Si añadı́s algún test propio, aseguráos de que sigue pasando los test que os proporcionamos. En la plantilla se deberá sustituir los valores de NIA y nombre y apellidos de los alumnos por los valores de los componentes del grupo. 6 Capı́tulo 4 Material disponible El material disponible (en la web de la asignatura) para realizar esta práctica es el siguiente: 1. Enunciado de la práctica de Generación de Código. 2. Transparencias de teorı́a. 3. CrossVisions 2.3. 4. Fichero Com.csm, semantic.csm y gencod.csm (A partir del 19 de Diciembre). El horario de tutorı́as del profesor de prácticas es el siguiente: Martes de 12 a 13h y de 15 a 16h en despacho QC1024. Tambien se puede usar la siguiente dirección de correo electrónica para dudas: [email protected]. Se recomienda a los alumnos indicar en el asunto del correo [CP1] e intentar en la medida de lo posible no mandar dudas muy especı́ficas de código. Se comunica a los alumnos que el profesor no contestará dudas durante las vacaciones de Navidad: todas las dudas serán contestadas a partir del 7 de Enero por orden de llegada ası́ que se recomienda que se envı́e un único mail de dudas una vez avanzada la práctica con el fin de logar una respuesta rápida y eficiente. 7