“Preparación para la generación de código, generación de directivas para la tabla de símbolo”
Rusber Cuello SangamaMonografía23 de Agosto de 2017
3.275 Palabras (14 Páginas)364 Visitas
Universidad nacional de San Martín Facultad de ingeniería de Sistemas e Informática[pic 1][pic 2][pic 3][pic 4][pic 5]
[pic 6][pic 7]
[pic 8][pic 9]
“Preparación para la generación de código, generación
de directivas para la tabla de símbolo” Docente: Ing. Víctor Alejandro Ávila Tuesta. Curso: Compiladores.
Estudiantes:
1.- Ali Smith Carrero Flores.
2.- Rusber Cuello Sangama.
3.- Beell Evans Acuña Ushiñahua.
4.- Rene Arenas Santamaria.
5.-Andre Alonso Rengifo del Águila.
Ciclo: VII
Tarapoto-Perú
2017
Introducción
En este informe se realizará las acciones que uno debe tener en cuenta antes de generar códigos, esta fase del compilador puede resultar la parte más tediosa ya que uno tiene que estar seguro que los operadores estén correctos y sean compatibles con el compilador. Esta fase prepara el terreno que van a tomar los códigos y lanzar mensajes de error si encuentra alguno, es decir tiene que leer todo lo anterior para ver si no existe algún error. El siguiente tema a tratar en el informe es sobre cómo se estructura los datos para que el proceso de traducción de un compilador sea más eficaz, de esta forma las consultas, los almacenamientos de datos sean rápidos y seguro.
Cuando se escribe un programa empleando un determinado lenguaje de programación, la computadora es capaz de entenderlo, tal cual, debido a que los lenguajes de programación diseñados para que las personas los puedan leer y escribir fácilmente. Por eso, es necesario traducir dicho programa, escrito en un lenguaje de programación, a algo que la computadora pueda entender y ejecutar. A este proceso se le denomina compilación.
Pero lo que vamos a tener en cuenta a continuación es de mucha importancia para nosotros, ya que estaremos definiendo la preparación para la generación de código donde se clasifica en dos cuestiones: asignación de memoria y asignación de registros. También la generación de directivas para la tabla de símbolos.
Preparación para la generación de código
El compilador decide muchas de las cuestiones acerca de donde residirán los valores dos de las cuestiones en la preparación de la generación de código son: la asignación de memoria y la asignación de registros.
Asignación de memoria. La asignación y el mantenimiento del espacio de memoria para conservar los valores de las variables y expresiones se conoce como asignación de memoria.
Asignación de registros. Los registros se utilizan para conservar los valores de las variables y expresiones, y aunque rara vez hay suficientes para un programa completo, las arquitecturas más recientes basadas en RISC (Conjunto reducido de instrucciones de Cómputo) poseen más.
[pic 10]
ANÁLISIS LÉXICO
PREPARATIVOS
Los preparativos que se van a tomar son importaciones esto es en caso de lenguajes de programación como java, c++ etc, para la utilización de los tokens, se añaden las directivas adecuadas y se añaden métodos que sirven para devolver los tokens y para señalar que línea del código se está procesando actualmente y el token actual. Esto es necesario para que en caso de error, se señale dónde está. Se puede utilizar una clase que se puede llamar InformaciónCódigo que se encarga de guardar los códigos en campos estáticos la línea actual y token actual.
ANÁLISIS SINTÁCTICO
PREPARATIVOS
Este análisis es que guía todo el proceso de traducción. tanto el análisis sintáctico como semántico y la generación de código estas se incluyen en un solo archivo con extensión según el lenguaje de programación que usas, en caso de java es .cup.
En este análisis es necesario todas las importaciones de las librerías necesarias. Luego tenemos la sección que contendrá los métodos por defecto que contiene el manejo de errores, el método nos permitirá lanzar el proceso de análisis y para lanzarlo, y por último se encuentra la sección dónde situamos los terminales, los no terminales, las precedencias y las reglas de la gramáticas.
ANÁLISIS SEMÁNTICO Y GENERACIÓN DE CÓDIGO
PREPARATIVOS
El análisis semántico prácticamente no existe ya que el análisis sintáctico impide cometer errores semánticos.
Por ejemplo, como no hay que declarar las variable lógicas antes de ser usadas, no hay que comprobar al usar una variable lógica si antes había sido declarada o no, cuando aparece una variable lógica (Una variable lógica es una variable que sólo puede tener dos valores posibles de forma que un valor excluye al otro), si antes había sido declarada o no. Cuando aparece una variable lógica, se mira
en la tabla de símbolos y si no estaba, se añade con el valor que tenga. Y si estaba, solamente se pone con el valor que tenga.
Por lo tanto, lo único que hay que hacer es gestionar la tabla de símbolos y generar el código oportuno.
CÓDIGO INTERMEDIO
PREPARATIVOS
Una vez que ya hemos realizado las comprobaciones semánticas, enfocaremos la generación de código en ensamblador. pero sería algo absurdo hacerlo directamente. Y lo que se suele hacer es realizar un paso intermedio para reducir un poco su complejidad. Para resumir lo que hace está fase crea una serie de instrucciones en un pseudolenguaje que nos permita, a partir de él llegar al código final. El pseudolenguaje debe ser independiente de la plataforma en la que uno está realizando el compilador, es decir independiente del ensamblador de la máquina. Entonces decimos que nuestro compilador debe estar preparado para ambas cosas: para cualquier plataforma y por simplificar un poco el trabajo de crear directamente nuestro programa ensamblador.
Para realizar el código intermedio se utilizan técnicas como “el código en tres direcciones”.
Ya que el código de tres direcciones es usado como un lenguaje intermedio en los compiladores, los operandos normalmente no contendrán direcciones de memoria o registros concretos, sino que direcciones simbólicas que serán convertidas en direcciones reales durante la asignación de registros. Es también común que los nombres de los operandos sean numerados secuencialmente ya que el código de tres direcciones es típicamente generado por el compilador.
CÓDIGO FINAL
PREPARATIVOS
Bueno al tener ya todo lo anterior de forma correcta ahora es el momento de preparar todo para generar un archivo con el código final partiendo del código intermedio. El trabajo que se realizará es leer las instrucciones guardadas en un
objeto codigointermedio, procesarlos uno a uno e ir escribiendo el resultado en el archivo final.
Para la gestión del código final, se utiliza una clase que puede ser llamada
códigofinal .
Ejemplo:
[pic 11]
[pic 12]
Generación de Código
La generación de código es una de las fases mediante el cual un compilador convierte un programa sintácticamente correcto en una serie de instrucciones a ser interpretadas por una máquina. La entrada en esta fase viene representada, típicamente, por un Árbol Sintáctico, un Árbol de Sintaxis Abstracta, o una Representación Intermedia; la máquina destino puede ser un microprocesador o una máquina abstracta tal como una máquina virtual o un lenguaje intermedio, legible por un humano.
Compiladores más sofisticados realizan múltiples traducciones en cadena (pipelining) con el fin de poder construir código para múltiples plataformas y evitar tener que construir todas las capas del compilador.
La generación de código: es usada para construir programas de una manera automática evitando que los programadores tengan que escribir el código a mano. La generación de código puede realizarse en tiempo de ejecución, Tiempo de carga, o Tiempo de compilación.
Significa la traducción de la representación intermedia a lenguaje ensamblador, después de la optimización, y después que se han asignado los registros y la memoria.
...