You are on page 1of 13

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

como un paso intermedio antes de generar el archivo objeto o el código máquina para una máquina específica. Ventajas:  Permite una fase de análisis independiente de la maquina. donde un compilador primero traduce el código fuente de un programa. Su misión es descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples. (análisis semántico) *Bytecode: Código intermedio entre el código fuente y el código máquina. pues el mismo código puede ser ejecutado en diferentes plataformas y arquitecturas. muchos lenguajes interpretados se compilan a bytecode y después son ejecutados por un intérprete de bytecode.  Características destacadas: Su principal ventaja es la portabilidad.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. Suele tratárselo como un fichero binario que contiene un programa ejecutable similar a un módulo objeto. en una forma más apropiada para las transformaciones de mejora del código (forma usualmente llamada bytecode).  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.ITNL GENERACION DE CODIGO INTERMEDIO 6. Esta ventaja la tiene también los lenguajes interpretados. PROGRAMACION DE SISTEMAS 13 . El término viene de su uso en los compiladores. aunque generalmente con mejor rendimiento. Por esto. 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.

d) 6. a. los nodos hijos son operandos y los nodos internos son operadores). [2]) <operador>. Árbol sintáctico abstracto (todos los nodos del árbol representan símbolos terminales.  Tipo 3  Tripelatas Ejemplo: d = a + b * c [1] (*. temp1) (+. b. a.  Notación posfija. Desventajas:    Tipo Tipo   Perdida de eficiencia (no permite una compilación de una sola pasada). notación prefija.  Grafo dirigido acíclico (GDA). 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 . existen básicamente tres formas diferentes de escribirla. temp2) (=. [1]) [3] (=. ². 2 de lenguajes intermedios: Árbol sintáctico. temp1. c) [2] (+.<operando_1>.2 NOTACIONES Dada una cierta expresión algebraica. d. temp2. notación infija y notación postfija. c.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. <operando_2>  Cuartetos Ejemplo: d = a + b * c (*. b. Introduce en el compilador una nueva fase de traducción. en función de la situación concreta en la que se pongan los operadores respecto de los operandos.

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. 2 + 2) usando un estilo de infijo. aunque muchos lenguajes de programación la utilizan debido a su familiaridad. En la ausencia de paréntesis. PROGRAMACION DE SISTEMAS 13 . 2 2 +). 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. No es tan simple de analizar (parser) por las computadoras. + 2 2) o la notación de postfijo (ej. 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. en la cual se escriben los operadores entre los operandos en que están actuando (ej. Si en el ejemplo deseamos realizar primero la suma deberemos incluirla entre paréntesis (A+B)*C. como la notación de prefijo (ej.  6. En nuestro caso nos centraremos en las notaciones infija (la notación habitual) y la postfija ( mas conveniente para uso interno en el ordenador). ciertas reglas de prioridad determinan el orden de las operaciones. En la notación de infijo. a diferencia de las notaciones de prefijo o posfijo. Esta inclusión de paréntesis no es necesaria en notación prefija o postfija.2. se realizara primero la multiplicación y a continuación la suma. es necesario rodear entre paréntesis a los grupos de operandos y operadores.1 Notación Infija Es la notación común de fórmulas aritméticas y lógicas. 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. para indicar el orden en el cual deben ser realizadas las operaciones.

dejando el resultado 'c' directamente.2.3 Notación Prefija También conocida como Notación Polaca. en donde cada operador está antes de sus operandos. y el álgebra. es un método algebraico alternativo de introducción de datos. El lógico polaco Jan Łukasiewicz inventó esta notación alrededor de 1920 para simplificar la lógica proposicional. y que para ejecutar un comando. Reverse polish notation.2. Su principio es el de evaluar los datos directamente cuando se introducen y manejarlos dentro de una estructura LIFO (Last In First Out).ITNL GENERACION DE CODIGO INTERMEDIO  6. la notación de postfijo es frecuentemente usada en lenguajes de programación concatenativos y basados en pila como PostScript. primero se deben introducir todos sus argumentos. al evaluar los datos directamente al introducirlos. 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.También es común en sistemas basados en flujo de datos y tuberías. el resultado es una sintaxis que carece de paréntesis u otros signos de agrupación. El lenguaje de PROGRAMACION DE SISTEMAS 13 . Si la aridad de los operadores es fija. la aritmética. 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. una notación de prefijo introducida en 1920 por el matemático polaco Jan Lukasiewicz. y todavía puede ser analizada sin ambigüedad. En ciencias de la computación. y es el principio de operación de ciertas calculadoras. no es necesario ordenar la evaluación de los mismos. así.  6. Su nombre viene por analogía con la relacionada notación polaca. para hacer una suma 'a+b=c' el RPN lo manejaría a b +. lo que optimiza los procesos a la hora de programar. o RPN). En la notación polaca inversa es al revés. Básicamente la diferencias con el método algebraico o notación de infijo es que. notablemente las de Hewlett-Packard. incluyendo las tuberías de Unix. es una forma de notación para la lógica.2 Notación Posfija También llamada Notación Polaca Inversa (en ingles. Su característica distintiva es que coloca los operadores a la izquierda de sus operandos (+34).

para la representación de expresiones 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.3 Representación de Código Intermedio Existen maneras formales para representar código intermedio. Aunque sea obvio. de lo contrario la sentencia no tiene ningún sentido (asumiendo que solamente son usados operadores binarios en la expresión). 6.3. es importante observar que el número de operandos en una expresión debe igualar al número de operadores más uno.  6. así que se debe tener cuidado de comprobar con minuciosidad que una expresión tiene sentido al usar la notación de prefijo.1 Polaca Se utiliza principalmente aritméticas. Esto puede ser fácil de pasarlo por alto cuando se trata con expresiones más largas y más complicadas con varios operadores. o Recorrer el árbol en postorden. 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.Algoritmo o Representar la expresión en forma de árbol sintáctico.  Simple  No utiliza registros • Expresión a notación polaca inversa .

PROGRAMACION DE SISTEMAS 13 . junto como cualquiera registro que sea necesario para mantener la pila y apoyar la ejecución.ITNL GENERACION DE CODIGO INTERMEDIO . La maquina P esta compuesta por una memoria de código. la mayor parte para lenguaje tipo Pascal. 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. 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. Como el código P fue diseñado para ser directamente ejecutable.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. que debe conocer si se desea que un programa de código P se comprensible.Ejemplo: a+b*c-d Código: a b c * + d –  6.3. una memoria de datos no específica para variables nombre das y una pila para datos temporales. además de mucha información específica para la maquina P. contiene una descripción implícita de un ambiente de ejecución particular que incluye tamaños de datos.

La notación de tres direcciones es una forma abstracta de código intermedio. las instrucciones que no requieren todos los campos dejan vacíos los que no utilizan: – Ej: Las proposiciones con operadores unarios no utilizan arg. Los esquemas de generación dependen de cada lenguaje. pero hay que tener un algoritmo para la reutilización de las variables temporales (reutilización de registros del procesador). aunque en ocasiones puede variar. arg1 y arg2. el cual es un lenguaje intermedio más entendible para la máquina. dicha estructura recibe el nombre de triples y tiene los siguientes campos: op.ITNL GENERACION DE CODIGO INTERMEDIO  6.3. z). 6. – Por ejemplo. Con una estructura de tres campos se pueden omitir los valores temporales. Las expresiones lógicas también pueden pasarse a código de tres direcciones. PROGRAMACION DE SISTEMAS 13 . Cuando se utilizan triples se ocupan punteros a la misma estructura. se En general. utilizando para ello expresiones en corto circuito. Las cuádruplas facilitan la aplicación de muchas optimizaciones.3 Triplos Las proposiciones de tres direcciones se parecen mucho al ensamblador. Esta notación se puede implementar como registros con campos para el operador y operadores. la proposición de tres direcciones x = y + z representaría como: (suma. result. arg1 y arg2.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. x. y.4 Cuádruplas Una cuádrupla es una estructura de tipo registro con cuatro campos: op.  6.3. Generalmente el código que generan los triples recibe el nombre de código de dos direcciones.

PROGRAMACION DE SISTEMAS 13 .  6.b.  6.ITNL GENERACION DE CODIGO INTERMEDIO  6. int b. si está es compleja se debe reducir hasta quedar un operador sencillo. x=z.c. En el caso de C. debe quedar de la forma y = b/5. Por ejemplo: x = a+b/5.4. de tal forma que una expresión sea lo más mínimo posible. Las instrucciones de decisión compleja como switch se reducen a una versión complejas de if‟s. por lo que ciclos while. z = a+y.  6.4.4. Las condiciones lógicas también pueden ser evaluadas en cortocircuito y reducidas. Por ejemplo int respectivamente.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.  6. if (y). intc. todo queda en forma de while. 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. a.4. for y dowhile tienen la misma representación interna.5 Estatuto Ciclos Los ciclos se descomponen en un ciclo genérico. se descompone a int a.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.3 Estatuto de Asignación Las operaciones de asignación deben quedar expresadas por una expresión sencilla.4 Estatuto Condicional Las condiciones deben expresarse de manera lo más sencilla posible de tal forma que puedan evaluarse en cortocircuito.

a[3]=„a‟..  6. PROGRAMACION DE SISTEMAS 13 .4.7 Funciones Las funciones pueden reducir a en línea. así por ejemplo: char *a=“Hola”. lo que se hace es expander el código original de la función. a[4]=„\0‟.ITNL GENERACION DE CODIGO INTERMEDIO  6.6 Arreglos Los arreglos se descomponen en estructuras básicas de manejo de manera simple. se reduce a: a[0]=„H‟. a[2]=„l‟. a[1]=„o‟. Las funciones se descomponen simplificando los parámetros de manera individual al igual que el valor de retorno.4.

La representación intermedia puede tener diversas formas.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. como son La Polaca. Esta representación intermedia debe tener dos propiedades importantes. 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. Se puede considerar esta representación intermedia como un programa para una máquina abstracta. debe ser fácil de producir y fácil de traducir al programa objeto. Triplos y Cuádruplas. el código P. PROGRAMACION DE SISTEMAS 13 .

pdf http://es.net/article-31437284.pdf PROGRAMACION DE SISTEMAS 13 .net/blankardz/cdigo-intermedio5717987/download http://www.com/doc/44986075/Lenguajes-Intermedios http://upsg01.com/t175-notaciones http://es.uah.foroactivo.mitecnologico.org/wiki/Notaci%C3%B3n_de_infijo http://es.comxa.es/ie/docencia/ProcesadoresDeLenguaje/Procesadore sDeLenguajeTema7_3xpagina.org/wiki/Notaci%C3%B3n_de_prefijo http://pepperslina.com/Main/GeneracionOptimizacionCodigoInte rmedio http://www.html http://antares.wikipedia.itmorelia.com/downloads/Sesion-8.pdf http://www.scribd.edu.wikipedia.org/wiki/Notaci%C3%B3n_de_postfijo http://es.ITNL GENERACION DE CODIGO INTERMEDIO BIBLOGRAFIA http://www.mx/~jcolivar/courses/ps207a/ps2_u6.over-blog.slideshare.wikipedia.cc.unse-prog2.

2.3.ITNL GENERACION DE CODIGO INTERMEDIO INDICE INTRODUCCION____________________________________________1 6.3.3 NOTACION PREFIJA__________________________________5 6.4 ESQUEMAS DE GENERACION ______________________________8 6.3.4 CUADRUPLAS_______________________________________8 6.4.4.1 POLACA ___________________________________________6 6.2.1 EXPRESIONES ______________________________________9 6.4.4.1 LENGUJES INTERMEDIOS _________________________________2 6.3.4.3 REPRESENTACION DE CODIGO INTERMEDIO__________________6 6.2 CODIGO P _________________________________________7 6.4 ESTATUTO CONDICIONAL_____________________________9 6.2 DECLARACIONES DE VARIABLES CONSTANTES____________9 6.2 NOTACIONES___________________________________________3 6.4.1 NOTACION INFIJA ___________________________________4 6.6 ARREGLOS________________________________________10 6.4.2.3 ESTATUTO DE ASIGNACION ___________________________9 6.2 NOTACION POSFIJA__________________________________5 6.7 FUNCIONES_______________________________________10 CONCLUCION_____________________________________________11 BIBLOGRAFIA ____________________________________________12 PROGRAMACION DE SISTEMAS 13 .3 TRIPLOS___________________________________________8 6.5 ESTATUTO CICLOS __________________________________9 6.

% #   %#     # 995.

.

4 .42. 290.344.

.3.

.43 592.0307..434/4390 720/4 995.

.

70 309. 8/08.

-.7/.3.

./4 390720/4 .

/434./ 995.

.

 :380 574 .42.42. .

/8./434.

$0843  5/1 995.

.

7-/ .42.08 8.

/4.

 .

08 390720/48 995.03:.

.

4 ..:58  1474.42.9.

.4308 995.9 349.

.

08 50/. 47.

.

3*/0*314 995..49.

.

08 50/. 47.

.

49.3*/0*548914 995..

.

47.08 50/.

.

49..3*/0*57014 995.

.

50550783. 4.07 -4 309.

0  92 995.79..

.

708 92470.. 0/: 2.39.

4.7.=..

.4:7808.

58 .

58*: 5/1 995.

.

 . :.. 08.

0.

03./4..

0./4708003:.!74.08.

*5.0%02.!74.3./470 8003:.08. 5/1          !# # $$%$   .

% #   %#    %# & ********************************************  &$%# $*********************************   % $*******************************************    % ***********************************    % ! $**********************************    % !#**********************************  #!#$%   %# ******************   ! *******************************************     !*****************************************   %#! $*******************************************   &#&!$***************************************  $"&$# ******************************   !#$ $**************************************   # $'#$ $%%$************   $%%&% $ ***************************   $%%&%   *****************************   $%%&%  $**********************************   ## $****************************************    & $***************************************   & *********************************************  #******************************************** !# # $$%$   .