Implementación de un lenguaje imperativo simplificado
Enviado por JMAG • 31 de Mayo de 2023 • Trabajo • 914 Palabras (4 Páginas) • 243 Visitas
Tema 4. Implementación de un lenguaje imperativo simplificado
Los compiladores de un pasada permiten la generación de código al mismo tiempo que se realiza la construcción del árbol sintáctico y se comprueban las restricciones contextuales
Compiladores de un solo paso: Fase de análisis
- Una misma representación intermedia del árbol sintáctico y tabla de símbolos se puede traducir a distintos códigos objeto intermedios en función de las características del tipo de máquina abstracta que vaya a evaluar las instrucciones
- La mayoría de los compiladores transforman el programa fuente en algún tipo de representación intermedia, para luego convertir esa representación en otra mas eficiente o en el código final
- Representaciones intermedias
Ventajas:
- Independizar el front-end del back-end, con lo que eso supone en cuanto a modularidad y a posibilidades para compilaciones cruzadas
- Mayor nivel de abstracción
- Posibilidad de realizar optimizaciones
- Las representaciones intermedias afectan tanto a la velocidad como la eficiencia del compilador
Traducido quiere decir:
- Mayor modularidad, ya que aísla elementos de más alto nivel de los dependientes de la máquina
- Facilita optimización y generación de código
- Elimina/simplifica características específicas de la máquina objetivo
- Permite optimizaciones independientes de la máquina
- Ofrece representación simple y uniforme fácil .
- Ofrece una mayor portabilidad
- Independencia de la máquina objetivo y del lenguaje fuente
- Análisis no depende de arquitectura destino
- Generación de código no depende del lenguaje original
- Crear un compilador para otra máquina basta con crear una nueva etapa final de generación
Inconvenientes
- Necesidad de una fase extra para traducir a código máquina
- Mayor coste computacional
- Dificultad para definir un lenguaje intermedio adecuado
- Compromiso entre la representación de elementos código fuente y del código máquina
Tabla de símbolos. Restricciones contextuales
La tabla de símbolos es una estructura fundamental durante todas las etapas del compilador. Sirve como base de datos temporal y almacena todos los atributos asociados a los lexemas del código de entrada,los cuales harán falta durante la compilación
La incorporación de atributos a la tabla de símbolos es realizada por las distintas fases del compilador ( léxica, sintáctica y semántica ).
Los atributos asociados a clases de tokens diferentes pueden ser distintos puesto que el propósito y semántica de ellos también lo son.
Las tablas de símbolos generalmente se manejan como estructuras globales disponibles en cualquier fase del compilador
Representaciones intermedias: tipos
Las representaciones intermedias se diferencian en lo más o menos cercanas que estén del código máquina o del lenguaje fuente
- RI de alto nivel: Preservan información como la de los bucles y las sentencias if-then-else. Reflejan el lenguaje fuente que están compilando
- RI de nivel medio: Son independientes tanto de la estructura del lenguaje. Fuente como del micro para el que se están compilando
- RI de bajo nivel: Se acercan a la arquitectura “objetivo”: dependen mucho de la máquina, aunque no llegan a ser código ensamblador
Lo normal es que un compilador comience generando una RI de alto nivel, optimice, traduzca esa RI en otra de nivel medio, optimice de nuevo, y finalmente genere otra RI de bajo nivel para una última ronda de optimizaciones. Todo esto se realiza antes de generar el código final.
Representación intermedia
Es una estructura de datos que representa al programa fuente durante el proceso de su traducción a código objeto. Este tipo de código abstracto y virtual debería reunir las siguientes características:
...