Generacion de Codigo Intermedio Entregar
Short Description
Download Generacion de Codigo Intermedio Entregar...
Description
ITNL GENERACION DE CODIGO INTERMEDIO
INTRODUCCION Este documento trata las representaciones intermedias; el código intermedio es un código abstracto independiente de la máquina para la que se generará el código objeto, este código ha de cumplir dos requisitos importantes: Ser fácil de producir a partir del análisis sintáctico. Ser fácil traducir al lenguaje objeto. Hay muchos tipos y formas de códigos intermedios; como por ejemplo el árbol sintáctico, notación posfija y código de tres direcciones. Algunas ventajas de utilizar la forma intermedia son aumentar la portabilidad del compilador de una maquina a otra: Se puede utilizar el mismo analizador léxico para diferentes generadores. Se pueden utilizar optimizadores independientes de la maquina. Facilitar la división en fases del proyecto.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO 6.1 LENGUAJES INTERMEDIOS Un lenguaje intermedio es el lenguaje de una máquina abstracta diseñada para ayudar en el análisis de los programas de computadora. El término viene de su uso en los compiladores, donde un compilador primero traduce el código fuente de un programa, en una forma más apropiada para las transformaciones de mejora del código (forma usualmente llamada bytecode), como un paso intermedio antes de generar el archivo objeto o el código máquina para una máquina específica. Características destacadas: Su principal ventaja es la portabilidad, pues el mismo código puede ser ejecutado en diferentes plataformas y arquitecturas. Esta ventaja la tiene también los lenguajes interpretados, aunque generalmente con mejor rendimiento. Por esto, muchos lenguajes interpretados se compilan a bytecode y después son ejecutados por un intérprete de bytecode. En Java generalmente se transmite el bytecode a la máquina receptora y esta se encarga deutilizar un compilador just-in-time para traducirlo a código máquina antes de su ejecución. Tipos de lenguaje intermedio Hay tres tipos de lenguaje intermedio los cuales son: Tipo 1 Es una representación más abstracta y uniforme que un lenguaje máquina concreto. Su misión es descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples. Ventajas: Permite una fase de análisis independiente de la maquina.
(análisis
semántico)
*Bytecode: Código intermedio entre el código fuente y el código máquina. Suele tratárselo como un fichero binario que contiene un programa ejecutable similar a un módulo objeto.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO
Se pueden realizar optimizaciones sobre el código intermedio (Las complejas rutinas de optimización son independientes de la maquina.
Desventajas:
Perdida de eficiencia (no permite una compilación de una sola pasada). Introduce en el compilador una nueva fase de traducción.
Tipo Tipo
2 de lenguajes intermedios: Árbol sintáctico. Árbol sintáctico abstracto (todos los nodos del árbol representan símbolos terminales, los nodos hijos son operandos y los nodos internos son operadores). Grafo dirigido acíclico (GDA). Notación posfija.
Tipo 3 Tripelatas Ejemplo: d = a + b * c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) ,,
Cuartetos Ejemplo: d = a + b * c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, ², d)
6.2 NOTACIONES Dada una cierta expresión algebraica, existen básicamente tres formas diferentes de escribirla, notación prefija, notación infija y notación postfija, en función de la situación concreta en la que se pongan los operadores respecto de los operandos. Así la expresión algebraica que representa la suma entre un cierto valor A y otro B se podría poner de la siguiente forma:
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO +AB Notación prefija A+B Notación infija AB+ Notación postfija La notación utilizada habitualmente es la infija. Si observamos un ejemplo adicional de notación infija en la que se utilicen más de un operador podemos observar que para realizar correctamente la operación tenemos que conocer una información adicional acerca de los operadores que aparezcan: la prioridad. Dependiendo de la prioridad del operador la operación se realizara antes o después dando como consecuencia un resultado distinto si variamos la prioridad de los operadores así en A+B*C, se realizara primero la multiplicación y a continuación la suma. Si deseamos variar la prioridad y en consecuencia el orden de evaluación de las operaciones hay que añadir una información adicional que son paréntesis. Si en el ejemplo deseamos realizar primero la suma deberemos incluirla entre paréntesis (A+B)*C. Esta inclusión de paréntesis no es necesaria en notación prefija o postfija. En nuestro caso nos centraremos en las notaciones infija (la notación habitual) y la postfija ( mas conveniente para uso interno en el ordenador). 6.2.1 Notación Infija Es la notación común de fórmulas aritméticas y lógicas, en la cual se escriben los operadores entre los operandos en que están actuando (ej. 2 + 2) usando un estilo de infijo. No es tan simple de analizar (parser) por las computadoras, como la notación de prefijo (ej. + 2 2) o la notación de postfijo (ej. 2 2 +), aunque muchos lenguajes de programación la utilizan debido a su familiaridad. En la notación de infijo, a diferencia de las notaciones de prefijo o posfijo, es necesario rodear entre paréntesis a los grupos de operandos y operadores, para indicar el orden en el cual deben ser realizadas las operaciones. En la ausencia de paréntesis, ciertas reglas de prioridad determinan el orden de las operaciones.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO 6.2.2 Notación Posfija También llamada Notación Polaca Inversa (en ingles, Reverse polish notation, o RPN), es un método algebraico alternativo de introducción de datos. Su nombre viene por analogía con la relacionada notación polaca, una notación de prefijo introducida en 1920 por el matemático polaco Jan Lukasiewicz, en donde cada operador está antes de sus operandos. En la notación polaca inversa es al revés, primero están los operandos y después viene el operador que va a realizar los cálculos sobre ellos. Tanto la notación polaca como la notación polaca inversa no necesitan usar paréntesis para indicar el orden de las operaciones mientras la aridad del operador sea fija. En ciencias de la computación, la notación de postfijo es frecuentemente usada en lenguajes de programación concatenativos y basados en pila como PostScript, y es el principio de operación de ciertas calculadoras, notablemente las de Hewlett-Packard.También es común en sistemas basados en flujo de datos y tuberías, incluyendo las tuberías de Unix. Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos dentro de una estructura LIFO (Last In First Out), lo que optimiza los procesos a la hora de programar. Básicamente la diferencias con el método algebraico o notación de infijo es que, al evaluar los datos directamente al introducirlos, no es necesario ordenar la evaluación de los mismos, y que para ejecutar un comando, primero se deben introducir todos sus argumentos, así, para hacer una suma 'a+b=c' el RPN lo manejaría a b +, dejando el resultado 'c' directamente. 6.2.3 Notación Prefija También conocida como Notación Polaca, es una forma de notación para la lógica, la aritmética, y el álgebra. Su característica distintiva es que coloca los operadores a la izquierda de sus operandos (+34). Si la aridad de los operadores es fija, el resultado es una sintaxis que carece de paréntesis u otros signos de agrupación, y todavía puede ser analizada sin ambigüedad. El lógico polaco Jan Łukasiewicz inventó esta notación alrededor de 1920 para simplificar la lógica proposicional. La notación de prefijo ha visto una amplia aplicación con las Sexpressions de Lisp, donde son requeridos los paréntesis debido a los operadores aritméticos que tienen aridad variable. El lenguaje de PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO programación Ambi usa la notación polaca para operaciones aritméticas y la construcción del programa. Aunque sea obvio, es importante observar que el número de operandos en una expresión debe igualar al número de operadores más uno, de lo contrario la sentencia no tiene ningún sentido (asumiendo que solamente son usados operadores binarios en la expresión). Esto puede ser fácil de pasarlo por alto cuando se trata con expresiones más largas y más complicadas con varios operadores, así que se debe tener cuidado de comprobar con minuciosidad que una expresión tiene sentido al usar la notación de prefijo. 6.3 Representación de Código Intermedio Existen maneras formales para representar código intermedio; tales como:
Polaca Código P Triplos Cuádruplas
Estas notaciones simplifican la traducción de nuestro código fuente a nuestro código objeto ya que se ahorran y acotan símbolos de la tabla de símbolos. 6.3.1 Polaca Se utiliza principalmente aritméticas.
para
la
representación
de
expresiones
Simple No utiliza registros • Expresión a notación polaca inversa - Algoritmo o Representar la expresión en forma de árbol sintáctico. o Recorrer el árbol en postorden.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO - Ejemplo: a+b*c-d
Código: a b c * + d – 6.3.2 Código P El código P comenzó como un código ensamblador objetivo estándar producido por varios compiladores Pascal en la década de 1970 y principios de la de 1980. Fue diseñado para código real para una maquina de pila hipotética la idea era hacer que los compiladores de Pascal se transportaran fácilmente requiriendo solo que se volviera a escribir el interprete de la maquina P para una plataforma, el código P también a probado ser útil como código intermedio y sean utilizado varias extensiones y modificaciones del mismo en diverso compiladores de código nativo, la mayor parte para lenguaje tipo Pascal. Como el código P fue diseñado para ser directamente ejecutable, contiene una descripción implícita de un ambiente de ejecución particular que incluye tamaños de datos, además de mucha información específica para la maquina P, que debe conocer si se desea que un programa de código P se comprensible. La maquina P esta compuesta por una memoria de código, una memoria de datos no específica para variables nombre das y una pila para datos temporales, junto como cualquiera registro que sea necesario para mantener la pila y apoyar la ejecución.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO 6.3.3 Triplos Las proposiciones de tres direcciones se parecen mucho al ensamblador, el cual es un lenguaje intermedio más entendible para la máquina. Con una estructura de tres campos se pueden omitir los valores temporales, dicha estructura recibe el nombre de triples y tiene los siguientes campos: op, arg1 y arg2. 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. 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. 6.3.4 Cuádruplas Una cuádrupla es una estructura de tipo registro con cuatro campos: op, result, arg1 y arg2. – Por ejemplo, la proposición de tres direcciones x = y + z representaría como: (suma, x, y, z).
se
En general, las instrucciones que no requieren todos los campos dejan vacíos los que no utilizan: – Ej: Las proposiciones con operadores unarios no utilizan arg. Las cuádruplas facilitan la aplicación de muchas optimizaciones, pero hay que tener un algoritmo para la reutilización de las variables temporales (reutilización de registros del procesador). 6.4 Esquemas de Generación Los esquemas de generación son las estrategias o acciones que se deberán realizarse y tomarse en cuenta en el momento de generar código intermedio. Los esquemas de generación dependen de cada lenguaje.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO 6.4.1 Expresiones Para generar expresiones estas deben representarse de manera más simple y más literal para que su conversión sea más rápida. Por ejemplo la traducción de operaciones aritméticas debe especificarse una por una, de tal forma que una expresión sea lo más mínimo posible. 6.4.2 Declaraciones de Variables Constantes Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple. Por ejemplo int respectivamente.
a,b,c;
se
descompone
a
int
a;
int
b;
intc;
6.4.3 Estatuto de Asignación Las operaciones de asignación deben quedar expresadas por una expresión sencilla, si está es compleja se debe reducir hasta quedar un operador sencillo. Por ejemplo: x = a+b/5; debe quedar de la forma y = b/5; z = a+y; x=z. 6.4.4 Estatuto Condicional Las condiciones deben expresarse de manera lo más sencilla posible de tal forma que puedan evaluarse en cortocircuito. Por ejemplo una instrucción como: if (a == b && f!=5 && f%3==0) se evalúa primero x = (a==b && f!=5) y = x && f%3==0; if (y). Las instrucciones de decisión compleja como switch se reducen a una versión complejas de if‟s. 6.4.5 Estatuto Ciclos Los ciclos se descomponen en un ciclo genérico, por lo que ciclos while, for y dowhile tienen la misma representación interna. En el caso de C, todo queda en forma de while. Las condiciones lógicas también pueden ser evaluadas en cortocircuito y reducidas.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO 6.4.6 Arreglos Los arreglos se descomponen en estructuras básicas de manejo de manera simple, así por ejemplo: char *a=“Hola”; se reduce a: a[0]=„H‟; a[1]=„o‟; a[2]=„l‟; a[3]=„a‟; a[4]=„\0‟;. 6.4.7 Funciones Las funciones pueden reducir a en línea, lo que se hace es expander el código original de la función. Las funciones se descomponen simplificando los parámetros de manera individual al igual que el valor de retorno.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO
Conclusión Después de los análisis sintáctico y semántico, algunos compiladores generan una representación intermedia explícita del programa fuente. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. Esta representación intermedia debe tener dos propiedades importantes; debe ser fácil de producir y fácil de traducir al programa objeto. La representación intermedia puede tener diversas formas, como son La Polaca, el código P, Triplos y Cuádruplas. Los esquemas de generación son las estrategias o acciones que se deberán realizarse y tomarse en cuenta en el momento de generar código intermedio y es diferente en cada lenguaje.
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO
BIBLOGRAFIA http://www.mitecnologico.com/Main/GeneracionOptimizacionCodigoInte rmedio http://www.slideshare.net/blankardz/cdigo-intermedio5717987/download http://www.unse-prog2.comxa.com/downloads/Sesion-8.pdf http://es.scribd.com/doc/44986075/Lenguajes-Intermedios http://upsg01.foroactivo.com/t175-notaciones http://es.wikipedia.org/wiki/Notaci%C3%B3n_de_infijo http://es.wikipedia.org/wiki/Notaci%C3%B3n_de_postfijo http://es.wikipedia.org/wiki/Notaci%C3%B3n_de_prefijo http://pepperslina.over-blog.net/article-31437284.html http://antares.itmorelia.edu.mx/~jcolivar/courses/ps207a/ps2_u6.pdf http://www.cc.uah.es/ie/docencia/ProcesadoresDeLenguaje/Procesadore sDeLenguajeTema7_3xpagina.pdf
PROGRAMACION DE SISTEMAS 13
ITNL GENERACION DE CODIGO INTERMEDIO INDICE INTRODUCCION____________________________________________1 6.1 LENGUJES INTERMEDIOS _________________________________2 6.2 NOTACIONES___________________________________________3 6.2.1 NOTACION INFIJA ___________________________________4 6.2.2 NOTACION POSFIJA__________________________________5 6.2.3 NOTACION PREFIJA__________________________________5 6.3 REPRESENTACION DE CODIGO INTERMEDIO__________________6 6.3.1 POLACA ___________________________________________6 6.3.2 CODIGO P _________________________________________7 6.3.3 TRIPLOS___________________________________________8 6.3.4 CUADRUPLAS_______________________________________8 6.4 ESQUEMAS DE GENERACION ______________________________8 6.4.1 EXPRESIONES ______________________________________9 6.4.2 DECLARACIONES DE VARIABLES CONSTANTES____________9 6.4.3 ESTATUTO DE ASIGNACION ___________________________9 6.4.4 ESTATUTO CONDICIONAL_____________________________9 6.4.5 ESTATUTO CICLOS __________________________________9 6.4.6 ARREGLOS________________________________________10 6.4.7 FUNCIONES_______________________________________10 CONCLUCION_____________________________________________11 BIBLOGRAFIA ____________________________________________12
PROGRAMACION DE SISTEMAS 13
View more...
Comments