Representación intermedia (IR) , como sugiere el nombre, es cualquier representación de un programa entre los idiomas de origen y de destino. La forma intermedia del programa que se está compilando es la estructura de datos central en un compilador. Un compilador puede tener un solo IR o una serie de IR. Las decisiones que se toman durante el diseño de IR afectan la eficiencia y la velocidad del compilador.
Propiedades de los IR:
Las prioridades de las diferentes propiedades en todos los compiladores no son uniformes.
Las siguientes cinco son las propiedades de los IR:
- Facilidad de generación
- Facilidad de manipulación
- Libertad de expresión
- Tamaño del procedimiento
- Nivel de abstracción
Nivel de abstracción:
- La cantidad de detalles expuestos en el IR influye en la viabilidad y rentabilidad de las diferentes optimizaciones.
- En general, se puede resumir en tres niveles.
(i) Nivel alto: es casi similar al idioma de origen. Es bueno para la desambiguación de la memoria. Aquí, un IR implica una operación de máquina de destino. Un solo IR puede incluir el acceso a la array o una llamada a un procedimiento. Incluye llamadas a procedimientos y objetos estructurados como estructuras y arrays.
(ii) Nivel medio: aquí, no involucra ningún objeto estructurado, pero aún así es independiente del idioma de destino. Puede estar orientado a la fuente o al destino.
(iii) Nivel bajo: es extremadamente cercano al idioma de destino. Un solo IR puede incluir una operación en el procedimiento. Aquí, varios IR implementan una optimización de máquina de destino.
Razones para usar Representaciones Intermedias (IRs):
- Traducir el código dado de una forma a otra requiere síntesis y análisis.
- Para realizar optimizaciones independientes de la máquina.
- Para simplificar la traducción.
Tipos de IR:
Hay tres categorías principales de Representación Intermedia (IR).
1. IR gráfico:
- Tiene una orientación gráfica y tiende a ser grande. Este tipo de IR se usa mucho en traductores de fuente a fuente.
- El código subyacente se representa como un gráfico.
- Ejemplos: gráficos acíclicos dirigidos (DAG), árboles
- Se divide además en dos tipos:
(i) Árboles relacionados con la sintaxis
(ii) Gráficos - Ejemplos de árboles relacionados con la sintaxis: árboles de análisis, árboles de sintaxis abstracta (AST), gráficos acíclicos dirigidos (DAG)
- Ejemplos de gráficos: gráficos de flujo de control, gráficos de dependencia y gráficos de llamadas
- Aunque todos contienen Nodes y aristas, difieren en
(i) Estructura del grafo
(ii) Nivel de abstracción
(iii) Relación entre el grafo y el código subyacente
2. IR lineal:
- Es el pseudocódigo de una máquina abstracta. Este tipo de IR contiene estructuras de datos simples y compactas. Es más fácil de reorganizar. El nivel de abstracción no es uniforme, varía en consecuencia.
- Ejemplos: código de máquina de pila, código de tres direcciones
3. IR híbrido:
- Como sugiere el nombre, IR híbrido es la combinación de IR gráfico e IR lineal.
Disciplina de nomenclatura en los RI:
- Al traducir el código fuente a un código de nivel inferior, el compilador debe elegir los nombres para una amplia variedad de valores distintos.
- Ejemplo: Considere la expresión: x+5*y
- La secuencia de operaciones seguidas para evaluar la expresión es:
(i) t1<– y
(ii) t2<– 5*t1
(iii) t3<–x
(iv) t4<–t3+t2 - Aquí los nombres usados son t1, t2, t3 y t4.
- También podemos reducir el uso de la cantidad de nombres reutilizando la ocurrencia de t2 y t4 con t1.
- Esta operación reduce a la mitad el número de variables utilizadas.
- El esquema de nombres también tiene un impacto en el tiempo de compilación porque determina los tamaños de muchas estructuras de datos en tiempo de compilación.
Publicación traducida automáticamente
Artículo escrito por patibandalp01 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA