representaciones de codigo intermedio
Representación de código intermedio
La administración de la memoria se da en esta etapa.
Se debe considerar tanto la memoria estática como dinámica, y en esta se usan varias pilas.
Los idiomas intermedios suelen tener árboles de derivación más pequeños que su contraparte original.
Se puede representar un árbol sintáctico con un Grafo Dirigido Acíclico (GDA).
La notación postfija es una manera linealizada de representar un árbol sintáctico.
a: = b * -c + b * -c
abc - * bc - * + =
x: = y op z
x + y * z
t1: = y * z
t2: = x +
t1
Los idiomas intermedios nos sirven para representar la producción final de nuestro lenguaje fuente.
Existen muchos idiomas intermedios, la mayoría de ellos son una representación más simplificada del código original para facilitar la traducción hacia el código final.
Otros lenguajes intermedios sirven de base o como representación parcial de otros procesos.
Por ejemplo, compilar un programa en C en Windows o DOS, producir un código objeto con extensión .obj para que posteriormente el enlazador cree finalmente el código ejecutable .exe
En sistemas ubicados en Unix, también ocurre algo similar generando un archivo .oy el ejecutable a.out
Otros lenguajes intermedios famosos son los generados para la máquina virtual de Java el bytecode; y para la máquina virtual de .NET el MISL para luego ejecutarse en tiempo de ejecución JIT (Just in Time).
Notación polaca
La notación polaca es la originada por un Autómata con pila, en la que los operadores siempre preceden a los operandos sobre los que actúan, y que tiene la ventaja de no necesitar paréntesis:
- Se utiliza principalmente para la representación de expresiones aritméticas.
- Expresión a notación polaca inversa.
Algoritmo
- Representa la expresión en forma de árbol sintáctico.
- Recorrer el árbol en postorden
Ventajas y Desventajas de la notación polaca
- Generación de código: simple, no utiliza registros.
- Optimización: es difícil reordenar ya que hay que considerar el contenido de la pila
- Interpretación rápida: es muy fácil de interpretar ya que solo necesita una pila
- Transportable: si, ya que todos los procesadores implementan una pila.
Código P
El código P hace referencia a maquina que utiliza o se auxilian de pilas para generar código objeto. En muchos caso de la P se asociado a código portable el cual garantiza que el código compilado en una maquina se puedan ejecutar en otras.
Para garantizar la portabilidad del código se necesita que el lenguaje este estandarizado por algún instituto y que dicho código no tenga extensiones particulares. También se recomienda la no utilización de características especiales exclusivas de algún arquitectura de computadoras en particular.
Triplos
Las proposiciones de tres direcciones se parecen mucho al ensamblador, el cual es un lenguaje intermedio mas entendible para la maquina. Las estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto disfrazadas.
Generalmente el código que generan los triples recibe el nombre de código de dos direcciones, aunque en ocasiones puede variar. Cuando se utilizan triples se ocupan punteros a la misma estructura de los triples
*b t1 t2 //Cuádruplos
*b(0)//triple
Se debe tener en cuenta el proceso de asignación, de declaración, expresiones booleanas. Las expresiones lógicas también pueden pasarse a código de tres direcciones, utilizando para ello expresiones en corto circuito. La notación de tres direcciones es una forma abstracta de código intermedio. Esta notación se puede implementar como registros con campos para el operador y operadores.
Comentarios
Publicar un comentario