Generación de Código - CVC

Anuncio
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: jbernal@cvc.uab.es. 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
Descargar