2.2 representaciones de codigo intermedio
La generación de código tiene como objetivo generar el ejecutable que después emplearía el usuario. Sin embargo, es habitual que el producto del compilador no sea directamente un fichero ejecutable. Es bastante más común que sea un fichero en lenguaje ensamblador. De esta manera, se evitan problemas como tener que medir el tamaño exacto de las instrucciones o llevar la cuenta de sus direcciones. Además, es muy probable que el código generado tenga referencias a objetos externos como funciones de biblioteca. Estas referencias externas serían resueltas por el enlazador o el cargador.
Existen diversos tipos de códigos intermedios que varían en cuanto a su sencillez, lo próximos que están a las maquinas reales y lo fácil que es trabajar con ellos. Nosotros nos centraremos en un tipo de código que se parece bastante al lenguaje ensamblador. Existen otros tipos de código intermedio que representan los programas como árboles o grafos. También existen representaciones mixtas que combinan grafos o árboles y representaciones lineales.
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 utilizan generalmente pilas.
• Los lenguajes intermedios generalmente tienen árboles de derivación más pequeños que su contraparte original.
• Se puede representar un árbol sintáctico con un Grafo Dirigdo 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
Comentarios
Publicar un comentario