Compiladores II (96-97 18/07/2015 13:06)- 1.1 - Compiladores II Tema 1. Código Intermedio Lecciones 1 y 2.

Slides:



Advertisements
Presentaciones similares
Ejemplo Práctico de un Compilador Pequeño
Advertisements

Compiladores e intérpretes
Compiladores e intérpretes Generación de código intermedio II
Scripting en el lado del Cliente
Prototipo de compilador didáctico del lenguaje LC99
Curso de JAVA. Iniciando con las Técnologias Java.
Fundamentos de programación
Lenguajes de programación
OPTIMIZACION DE CODIGO
Estructura General de Un Programa Programación Estructurada
Combinadores SK.
Procesadores de Lenguajes I
1.2 Sintaxis del lenguaje Java.
ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática
Teoría de lenguajes y compiladores
Estructuras de control
ÁRBOLES DE EXPRESION.
Tema 3. Optimización de Código
APLICACIONES DE PILAS Estructuras de Datos.
TRAMPAS EN EL DISEÑO DE LENGUAJES CON RELACIÓN A LOS NOMBRES - REGLAS DE ALCANCE - COMPILACIÓN POR SEPARADO CONTROL DE FLUJO - EVALUACIÓN DE EXPRESIONES.
Compiladores II ( /04/ :03) Tema 2. Generación de Código para Estructuras Complejas Lecciones 3 y 4.
Al término de la clase, el alumno reconoce las ventajas de usar JAVASCRIPT para un proyecto web.
Tema 4: Sentencias de control
Arboles Binarios de expresiones
Lenguaje C.
Práctica 7 AOC. Gestión de la pila Una pila es una estructura de datos caracterizada por que el último dato que se almacena es el primero que se obtiene.
1 LENGUAJES LOGICOS IMPLEMENTACION CALCULO DE PREDICADOS PROLOG.
M.C. Meliza Contreras González
Programación en Matlab
Unidad III Elementos del lenguaje C++
Etapas finales de un traductor
Sintaxis.
Estructura de Datos y Algoritmos
Capítulo 1 “Elementos de Programación”
Resumen de Compilación Preparado por Manuel E. Bermúdez, Ph.D. Associate Professor University of Florida Traducido por Christian Torres Universidad Ricardo.
Secciones y Segmentos STARTUP
FORMA INTERNA DE REPRESENTAR
FUNDAMENTOS DE PROGRAMACIÓN ISC. GABRIEL ZEPEDA MARTÍNEZ EST. ABRAHAM F. MACHUCA VAZQUEZ.
Procesadores de Lenguajes
Informática Ingeniería en Electrónica y Automática Industrial
Resumen Fundamentos de Programación/ Programación I
NVA-LNG1 3. SENTENCIAS. NVA-LNG2 Asignación Es una sentencia que almacena: el valor del argumento ubicado a la derecha del símbolo que la representa En.
EXPRESIONES Y SENTENCIAS
Programación de Sistemas
Estructuras de Control.
1 TEMA IMPLEMENTACION DE LENGUAJES FUNCIONALES. Lecciónes.
REPETITIVAS (CÍCLICAS)
Control de Flujo.
Tema 1. Introducción y Conceptos Básicos
Operaciones con números naturales
Unidad 1. Introducción a los Compiladores.
Objetivo Mostrar los fundamentos de la programación a través de ejemplos y prácticas utilizadas cotidianamente en el desarrollo de aplicaciones.
PEDRO ALBERTO ARIAS QUINTERO. El shell es un intérprete de órdenes, los intérpretes de órdenes de Linux son auténticos lenguajes de programación. Como.
Ing. Lionel Hendryk. Sistemas Embebidos Un sistema embebido es un sistema de computación diseñado para realizar una o algunas pocas funciones dedicadas.
Teoría de lenguajes y compiladores
Práctica Profesional PHP.
Es un tipo especial de software que nos permite *Crear *Desarrollar *Programar otras aplicaciones. Haciendo uso de sus conocimientos lógicos y lenguajes.
Estructuras de Decisión
Estructuras de Control
Programación Java y Desarrollo de Aplicaciones Modulo 1 Arquitectura de ordenadores Tema 3 Programas.
75.41 Algoritmos y Programación II Cátedra Ing. Patricia Calvo Complejidad algorítmica.
Programación de Sistemas
Cobol C Pascal Fortran 2. OBJETOS DE DATOS SmallTalk Java C++
LE, EI, Profesor Ramón Castro Liceaga UNIVERSIDAD LATINA (UNILA) V. GESTIÓN DE TIPOS Y GENERACIÓN DE CÓDIGOS.
PROGRAMACION DE APLICACIONES EN MEMORIA DEL COMPUTADOR = ALGORITMOS Y ESTRUCTURAS DE DATOS.
Factorías e Iterables Introducción del concepto de patrón de diseño Construcción de tipos para recorridos con for extendido Fundamentos de Programación.
Tema 8: Programación estructurada Introducción La importancia del conocimiento de programación es mucho mayor de lo que se piensa. Aprender a programar.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Katty Evangelina Hipólito Chi.   Aunque cada maquina tiene un lenguaje ensamblador distinto, el proceso de ensamblador tiene suficiente similitudes.
Programación en Java Introducción a Java. Reseña histórica Surge en 1991 por Sun Microsystems Desarrollado para electrodomésticos Se buscaba un código.
Transcripción de la presentación:

Compiladores II ( /07/ :06) Compiladores II Tema 1. Código Intermedio Lecciones 1 y 2

Compiladores II ( /07/ :06) Usos del Código Intermedio n+m módulos -> n*m compiladores –Múltiples lenguajes y compiladores Optimización –Representación de fácil modificación Modelos de generación de código o Máquinas abstractas –FAM –G-machine Compiladores transportables –PASCAL /P-Code –JAVA Interpretación rápida –OAKLisp –CLISP Debug –Intérpretes de C

Compiladores II ( /07/ :06) Notación polaca Inversa (postfija) Se utiliza principalmente para la representación de expresiones aritméticas Expresión a notación polaca inversa –Algoritmo Representar la expresión en forma de árbol sintáctico Recorrer el árbol en postorden –Ejemplo: a+b*c-d - + d a * b c Código: a b c * + d -

Compiladores II ( /07/ :06) Extensión a instrucciones de control de flujo Ejemplo: –Fuente if then else –No se puede traducir a If ya que solo se ha de evaluar una de las instrucciones –Código generado etiqueta1 Salta si falso etiqueta2 Salta etiqueta1: etiqueta2:

Compiladores II ( /07/ :06) Pros y Contras de la Notación Polaca Inversa Generación de código: –Simple –No utiliza registros Optimización –Es difícil de 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.

Compiladores II ( /07/ :06) n-tuplas En la notación de n-tuplas cada instrucción es una n-tupla. Tripletas:,, el resultado se asocia al número de tripleta –Ejemplo: W*X+(Y+Z) 1. *, W, X 2. +, Y, Z 3. +, (1), (2) –Control de flujo: IF X>Y THEN Z=X ELSE Z=Y+1 1. >, X, Y 2. Saltar si falso, (1), 5 3. =, Z, X 4. Saltar,, , Y, 1 6. =, Z, (5) –Problema: La optimización supone mover tripletas y hay que recalcular las referencias

Compiladores II ( /07/ :06) Tripletas Indirectas Tripletas indirectas. Solucionan el problemas de la reordenación mediante indirección Ejemplo: –Fuente: A=B+C*D/E F=C*D –Operaciones Tripletas 1. (1)(1) *, C, D 2. (2)(2) /, (1), E 3. (3)(3) +, B (2) 4. (4)(4) =, A, (3) 5. (1)(5) =, F, (1) 6. (5)

Compiladores II ( /07/ :06) Cuádruplas Cuádrupla:,,, Ejemplo: (A+B)*(C+D)-E +, A, B, T1 +, C, D, T2 *, T1, T2, T3 -, T3, E, T4 T1, T2, T3, T4 son variables temporales. 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).

Compiladores II ( /07/ :06) Árboles sintácticos abstractos Fácil creación: –Se crea a partir del árbol sintáctico. Se elimina la información innecesaria. –Ejemplo: (a*b)/(c+d) / * + a b c d Fácil optimización: –El árbol representa directamente la estructura del lenguaje fuente, y por tanto, las modificaciones que haríamos en el fuente son fáciles de realizar en el árbol. –Como el árbol representa la estructura del lenguaje es fácil aplicarle las propiedades de este para optimizar. Propiedad conmutativa. Propiedad asociativa. etc.

Compiladores II ( /07/ :06) Ejemplos de Árbol en CoSeL Un árbol sintáctico esta formado por las estructuras apply con el contenido: –Función: operador raíz –Arg(0), Arg(1)... Argumentos del operador –Ejemplo: VerArbol(`( Fun f(n)=> if (n<=2) 1 else f(n-2)+f(n-1) )) Fun +- [] +- => +- f | +- n +- If_Else +- <= | +- n | f | +- - | +- n | f n +- 1

Compiladores II ( /07/ :06) Buscar las Variables en un Árbol Buscar todas las variables Fun Variables(arbol)=> { if (TypeP(Symbol,arbol)) [arbol] else if (TypeP(Apply,arbol)) { Var lv=[]; // lista de variables for (i<-arbol:Index) lv=lv | Variables(arbol.arg(i)); lv } else [] } variables(`( a=b+c; d=a*2; )) [d,a,c,b]

Compiladores II ( /07/ :06) Buscar las Variables en un Árbol Variables modificadas Fun VariablesModificadas(arbol)=> { if (ApplyFunP(arbol,`\=,2) && TypeP(Symbol,arbol.arg(0))) { [arbol.Arg(0)] } else if (TypeP(Apply,arbol)) { Var lv=[]; for (i<-arbol:Index) lv=lv | VariablesModificadas(arbol.arg(i)); lv } else [] } VariablesModificadas(`( a=b+c; d=a*2; )) [d,a]

Compiladores II ( /07/ :06) Eliminar Expresiones Redundantes (NO FUNCIONA CORRECTAMENTE) Type Redundante(variable,expresion); Fun EliminarRedundantes(arbol)=> { Var ExpR=[]; Fun Eliminar(a)=> { Search (r<-ExpR,r.expresion==a) r.variable else { if (TypeP(apply,a)) { Var na=newapply(a.function,a.nargs); for (i<-a:index) na.arg(i)=Eliminar(a.arg(i)); na; } else a; } Fun Buscar(a)=> { if (ApplyFunP(a,`\=,2)) { Var ne=Eliminar(a.arg(1)); ExpR=Redundante(a.Arg(0),ne)::ExpR; = >> } else if (TypeP(Apply,a)) { Var na=newapply(a.function,a.nargs); for (i<-a:index) na.arg(i)=Buscar(a.arg(i)); na; } else a } Buscar(arbol); }

Compiladores II ( /07/ :06) Eliminar Expresiones Redundantes Ejemplo EliminarRedundantes(`( a=b+c; d=(b+c)*5; e=c+b; ))) Resultado a=b+c; d=a*5; e=c+b; Árbol del resultado ; +- = | +- a | +- + | +- b | +- c +- ; +- = | +- d | +- * | +- a | = +- e c +- b Árbol de la entrada ; +- = | +- a | +- + | +- b | +- c +- ; +- = | +- d | +- * | +- + | | +- b | | +- c | = +- e c +- b

Compiladores II ( /07/ :06) Listas en CoSeL Tipo de datos Type Cons(Head,Tail) Type List=Cons | [] Construcciones equivalentes [1,2,3]==cons(1,cons(2,cons(3,[]))) Cons(h,t)==h::t [1,2,3]==1::2::3::[] [h1,h2...|t]==h1::h2::...::t Operaciones [1,2,3].Head==1 [1,2,3].Tail==[2,3] [1,2,3].Head(0)==1 [1,2,3].Head(1)==2 [1,2]++[2,3]==[1,2,2,3] (append) [1,2] | [2,3]==[1,2,3] (unión) [1,2] & [2,3]==[2] (intersección) [1,2] - [2,3]==[1] (resta) Listas por comprensión [x|x<-1..5]==[1,2,3,4,5] [x|x<-[1,2,3,4,5],x%2==0]==[2,4]

Compiladores II ( /07/ :06) Árboles Estructura –Nodo del arbol Type apply(function,arg...) –Hoja Cualquier tipo de datos que no sea apply Construcción –Árbol en forma de literal `(1+2+A)  apply(\+,apply(\+,1,2),A) == 1+2+A –Árbol en forma de patrón Var a=10; >>  apply(\+,apply(\+,1,A),10) == 1+A+10 –Árbol construido directamente Var a=10; apply(`\+,apply(`\+,1,`A),A)  apply(\+,apply(\+,1,A),10) == 1+A+10

Compiladores II ( /07/ :06) Estructuras de Control Instrucciones de control de flujo –Típicas if ( condición ) instrucción if ( condición ) sentencia else sentencia switch ( selector ) { casos } while ( condición ) instrucción do instrucción while ( condición ) Break [ condición ] Continue [ condición ] –No típicas for ( generadores ) instrucción Search ( generadores ) instrucción Search ( generadores ) sentencia else sentencia Found ( generadores ) sentencia Generadores variable <- lista variable <- vector : Index variable <- apply : Index variable <- mínimo.. máximo variable <-~ mínimo.. máximo

Compiladores II ( /07/ :06) Código Enhebrado Es una representación útil para la interpretación independiente de máquina. Código enhebrado directo: El código es una secuencia de direcciones de rutinas que implementan las instrucciones. –Algunas rutinas son estándar (Add), pero otras las ha de generar el compilador para que puedan tratar los operandos (Push). Estas últimas limitan la transportabilidad. Contador de programa virtual Push B Push C Add Pop B código funciones Bucle de interpretación For (;;) (*pc++)();

Compiladores II ( /07/ :06) Código Enhebrado con Parámetros Código enhebrado indirecto: El código es una secuencia de apuntadores a funciones seguidos de los argumentos que pueda necesitar la función. push c add pop c Contador de programa virtual b argumento Bucle de interpretación For (;;) (*PC)(); Función void pushLiteral() { *--SP=PC[1]; PC=PC+2; }

Compiladores II ( /07/ :06) Código para máquinas abstractas Un objetivo de los compiladores es ser adaptables y portables a nuevas máquinas. Una de las formas de conseguirlo es con la generación de código para máquinas abstractas. Aplicaciónes: –Modelos de compilación WAM modelo de compilación de PROLOG G-machine modelo de compilación de lenguajes funcionales con evaluación perezosa. FAM modelo de compilación de lenguajes funcionales con evaluación estricta. –Compiladores portables Compilador ha código intermédio + intérprete. Compilador ha código intermedio + compilador de código intermedio a código máquina n+m módulos -> n*m compiladores

Compiladores II ( /07/ :06) Resumen Códigos para la ejecución –Notación polaca inversa –Código enhebrado Códigos para la optimización –Árbol sintáctico abstracto –Tuplas Tripletas Tripletas indirectas Cuadruplas Códigos para la explicación –Códigos de máquinas abstractas