automatas ii etapas de un traductor

79
Etapas finales de un traductor M.C. Juan Carlos Olivares Rojas Noviembre 2009

Upload: gabriel-sanchez

Post on 15-Oct-2015

194 views

Category:

Documents


1 download

DESCRIPTION

Lenguajes y automatas II generación de codigo intermedio, tipos de optimizacion,costos,

TRANSCRIPT

  • Etapas finales de un traductorM.C. Juan Carlos Olivares Rojas

  • AgendaGenerador de cdigo intermedio (opcional)

    Optimizador (puede ser opcional e ir en esta etapa o hasta despus de haber generado la traduccin)

    Generador de cdigo objeto.

  • Generacin de Cdigo IntermedioEtapas Finales de un Traductor

  • AgendaLenguajes intermedios.

    Notaciones. Infija. Postfija. Prefija.

    Representacin de cdigo intermedio. Notacin Polaca. Codigo P. Triplos y Cudruplos.

  • AgendaEsquemas de generacin. Expresiones. Declaracin de variables, constantes Estatuto de asignacin. Estatuto condicional. Estatuto de ciclos Arreglos. Funciones.

  • Cdigo IntermedioEs una etapa opcional en muchos casos que ayuda a simplificar la produccin de cdigo objeto

    La administracin de la memoria se da en esta etapa.

    Se debe considerar tanto la memoria esttica como dinmica, y en esta se utilizan generalmente pilas.

  • Generador de Cod. IntermedioLos lenguajes intermedios generalmente tienen rboles de derivacin ms pequeos que su contraparte original.

    Se puede representar un rbol sintctico con un Grafo Dirigido Acclico (GDA).

    La notacin postfija es una manera linealizada de representar un rbol sintctico.

  • Generador Cod. Intermedioa := b*-c+b*-c abc -*bc -*+=

    x := y op z x+y*z t1:=y*z t2:=x+t1

  • Lenguajes intermediosLos lenguajes intermedios nos sirven para representar la produccin final de nuestro lenguaje fuente.

    Existen muchos lenguajes intermedios, la mayora de ellos son una representacin ms simplificada del cdigo original para facilitar la traduccin hacia el cdigo final.

  • Lenguajes IntermediosOtros lenguajes intermedios sirven de base o como representacin parcial de otros procesos.

    Por ejemplo al compilar un programa en C en Windows o DOS, se produce un cdigo objeto con extensin .obj para que posteriormente el enlazador cree finalmente el cdigo executable .exe

  • Lenguajes IntermediosEn sistemas basados en Unix, tambin ocurre algo similar generndose un archivo .o y el executable a.out

    Otros lenguajes intermedios famosos son los generados para la mquina virtual de Java el bytecode; y para la mquina virtual de .NET el MISL para luego ejecutarse en tiempo de ejecucin JIT (Just in Time)

  • Lenguajes IntermediosOtros lenguajes intermedios se utilizan en sistemas distribuidos como RPC, CORBA y su IDL, etc.

    En este caso estos lenguajes intermedios se encargan de enmascarar toda la heterogeneidad de las comunicaciones distribuidas en una computadora

  • NotacionesLas notaciones sirven de base para expresar sentencias bien definidas.

    El uso ms extendido de las notaciones sirve para expresar operaciones aritmticas.

    Las expresiones aritmticas se pueden expresar de tres formas distintas: infija, prefija y postfija.

  • NotacionesLa diversidad de notaciones corresponde en que para algunos casos es ms sencillo un tipo de notacin.

    Las notaciones tambin dependen de cmo se recorrer el rbol sintctico, el cual puede ser en inorden, preorden o postorden; teniendo una relacin de uno a uno con la notacin de los operadores.

  • InfijaLa notacin infija es la ms utilizada por los humanos por que es la ms comprensible ya que ponen el operador entre los dos operandos. Por ejemplo a+b-5.

    No existe una estructura simple para representar este tipo de notacin en la computadora por esta razn se utilizan otras notaciones.

  • PostfijaLa notacin postfija pone el operador al final de los dos operandos, por lo que la expresin queda: ab+5-

    La notacin posftfija utiliza una estructura del tipo LIFO (Last In First Out) pila, la cual es la ms utilizada para la implementacin.

  • PrefijaLa notacin prefija pone el operador primero que los dos operandos, por lo que la expresin anterior queda: +ab-5.

    Esto se representa con una estructura del tipo FIFO (First In First Out) o cola.

    Las estructuras FIFO son ampliamente utilizadas pero tienen problemas con el anidamiento aritmtico.

  • Representacin Cod Int.Existen maneras formales para representar cdigo intermedio.

    Estas notaciones simplifican la traduccin de nuestro cdigo fuente a nuestro cdigo objeto ya que ahorran y acotan smbolos de la tabla de smbolos

  • Cdigo PEl cdigo P hace referencia a mquinas que utilizan o se auxilian de pilas para generar cdigo objeto.

    En muchos caso la P se asociado a cdigo portable el cual garantiza que el cdigo compilado en una mquina se pueda ejecutar en otras.

  • Cdigo PPara garantizar la portabilidad del cdigo se necesita que el lenguaje este estandarizado por algn instituto y que dicho cdigo no tenga extensiones particulares.

    Tambin se recomienda la no utilizacin de caractersticas especiales exclusivas de alguna arquitectura de computadoras en particular.

  • TriplosLas proposiciones de tres direcciones se parece mucho al ensamblador, el cual es un lenguaje intermedio ms entendible para la mquina.

    Las estructuras de control (if, switch, while, do-while, for) son realmente etiquetas goto disfrazadas.

  • TriplosEl problema de utilizar cudruplos radica en que se tienen que colocar los valores temporales en la tabla de smbolo.

    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

  • TriplosGeneralmente el cdigo que generan los triples recibe el nombre de cdigo 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 //cudruplos b (0) //triple

  • TriplosSe debe tener en cuenta el proceso de asignacin, de declaracin, expresiones booleanas.

    Las expresiones lgicas tambin pueden pasarse a cdigo de tres direcciones, utilizando para ello expresiones en corto circuito.

  • TriplosLa evaluacin de expresiones en corto circuito implica que se evalan condiciones revisando valores anteriores; por ejemplo, para el operador AND con una condicin que se detecte como falsa toda la expresin es falsa, en el caso del operador OR si se encuentra una condicin verdadera todo ser verdadera

    Cmo resuelven los compiladores las expresiones? Forma Normal disyuntiva

  • TriplosLa notacin de tres direcciones es una forma abstracta de cdigo intermedio.

    Esta notacin se puede implementar como registros con campos para el operador y operadores.

  • IntrpretesLos interpretes generalmente utilizan este triplos para generar el cdigo intermedio para ejecutarse una vez considerado la instruccin como vlido.

    En este sentido, un compilador es ms difcil de implementar ya que tendr que mantener todas las estructuras generadas que en muchas ocasiones sern cuadruplos.

  • CuadruplosEs una estructura tipo registro con cuatros campos que se llaman: op, arg1, arg2 y resultado. OP tiene un cdigo intermedio.

    Los operadores unarios como x:=-y no utilizan arg2. Generalmente arg1, arg2 y resultado son valores de tipo puntero y apuntan a una entrada en la tabla de smbolos.

  • Esquemas de GeneracinLos esquemas de generacin son las estrategias o acciones que se debern realizarse y tomarse en cuenta en el momento de generar cdigo intermedio.

    Los esquemas de generacin dependen de cada lenguaje. Tomaremos algunos esquemas de generacin del lenguaje C.

  • ExpresionesPara generar expresiones estas deben representarse de manera ms simple y ms literal para que su conversin sea ms rpida.

    Por ejemplo la traduccin de operaciones aritmticas debe especificarse una por una, de tal forma que una expresin sea lo ms mnimo posible.

  • Declaracin de variablesLas declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple.

    Por ejemplo int a,b,c; se descompone a int a; int b; intc; respectivamente.

  • Estatutos de AsignacinLas operaciones de asignacin deben quedar expresadas por una expresin 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.

  • Estatuto CondicionalLas condiciones deben expresarse de manera lo ms sencilla posible de tal forma que puedan evaluarse en cortocircuito. Por ejemplo una instruccin como: if (a == b && f!=5&& f%3==0) se evala primero x = (a==b && f!=5)y = x && f%3==0; if (y)

    Las instrucciones de decisin compleja como switch se reducen a una versin complejas de ifs

  • Estatuto de CiclosLos ciclos se descomponen en un ciclo genrico, por lo que ciclos while, for y do- while tienen la misma representacin interna. En el caso de C, todo queda en forma de while.

    Las condiciones lgicas tambin pueden ser evaluadas en cortocircuito y reducidas.

  • ArreglosLos arreglos se descomponen en estructuras bsicas 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;

  • FuncionesLas funciones pueden reducir a en lnea, lo que se hace es expander el cdigo original de la funcin.

    Las funciones se descomponen simplificando los parmetros de manera individual al igual que el valor de retorno.

  • OptimizacinEtapas Finales del Proceso de Traduccin

  • AgendaTipos de optimizacin. Locales. Bucles. Globales. De mirilla.

    Costos. Costo de ejecucin. Criterios para mejorar el cdigo.Herramientas para el anlisis del flujo de datos.

  • Tipos de OptimizacinLas optimizaciones pueden realizarse de diferentes formas. Las optimizaciones se realizan en base al alcance ofrecido por el compilador.

    La optimizacin va a depender del lenguaje de programacin y es directamente proporcional al tiempo de compilacin; es decir, entre ms optimizacin mayor tiempo de compilacin.

  • Tipos de OptimizacinComo el tiempo de optimizacin es gran consumidor de tiempo (dado que tiene que recorrer todo el rbol de posibles soluciones para el proceso de optimizacin) la optimizacin se deja hasta la fase de prueba final.

    Algunos editores ofrecen una versin de depuracin y otra de entrega o final.

  • Tipos de OptimizacinLa optimizacin es un proceso que tiene a minimizar o maximizar alguna variable de rendimiento, generalmente tiempo, espacio, procesador, etc.

    Desafortunamente no existen optimizador que hagan un programa ms rpido y que ocupe menor espacio.

  • Tipos de optimizacinLa optimizacin se realiza reestructurando el cdigo de tal forma que el nuevo cdigo generado tenga mayores beneficios.

    La mayora de los compiladores tienen una optimizacin baja, se necesita de compiladores especiales para realmente optimizar el cdigo.

  • Optimizacin LocalLa optimizacin local se realiza sobre mdulos del programa. En la mayora de las ocasiones a travs de funciones, mtodos, procedimientos, clases, etc.

    La caracterstica de las optimizaciones locales es que slo se ven reflejados en dichas secciones.

  • Optimizacin LocalLa optimizacin local sirve cuando un bloque de programa o seccin es crtico por ejemplo: la E/S, la concurrencia, la rapidez y confiabilidad de un conjunto de instrucciones.

    Como el espacio de soluciones es ms pequeo la optimizacin local es ms rpida

  • Optimizacin de CiclosLos ciclos son una de las partes ms esenciales en el rendimiento de un programa dado que realizan acciones repetitivas, y si dichas acciones estn mal realizadas, el problema se hace N veces ms grandes.

    La mayora de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben repetirse en un ciclo.

  • Optimizacin de CiclosSea el ejemplo:

    while(a == b) { int c = a; c = 5; ; }

    En este caso es mejor pasar el int c =a; fuera del ciclo de ser posible.

  • Optimizacin de ciclosEl problema de la optimizacin en ciclos y en general radica es que muy difcil saber el uso exacto de algunas instrucciones. As que no todo cdigo de proceso puede ser optimizado.

    Otros uso de la optimizacin pueden ser el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.)

  • Optimizacin GlobalLa optimizacin global se da con respecto a todo el cdigo.

    Este tipo de optimizacin es ms lenta pero mejora el desempeo general de todo programa.

    Las optimizaciones globales pueden depender de la arquitectura de la mquina.

  • Optimizacin GlobalEn algunos casos es mejor mantener variables globales para agilizar los procesos (el proceso de declarar variables y eliminarlas toma su tiempo) pero consume ms memoria.

    Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar instrucciones en ensamblador.

  • Optimizacin de MirillaLa optimizacin de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre todo en instrucciones de bifurcacin como son las decisiones, ciclos y saltos de rutinas.

    La idea es tener los saltos lo ms cerca de las llamadas, siendo el salto lo ms pequeo posible

  • CostosLos costos son el factor ms importante a tomar en cuenta a la hora de optimizar ya que en ocasiones la mejora obtenida puede verse no reflejada en el programa final pero si ser perjudicial para el equipo de desarrollo.

    La optimizacin de una pequea mejora tal vez tenga una pequea ganancia en tiempo o en espacio pero sale muy costosa en tiempo en generarla.

  • CostosPero en cambio si esa optimizacin se hace por ejemplo en un ciclo, la mejora obtenida puede ser N veces mayor por lo cual el costo se minimiza y es benfico la mejora.

    Por ejemplo: for(int i=0; i < 10000; i++); si la ganancia es de 30 ms 300s

  • Costos de EjecucinLos costos de ejecucin son aquellos que vienen implcitos al ejecutar el programa.

    En algunos programas se tiene un mnimo para ejecutar el programa, por lo que el espacio y la velocidad del microprocesadores son elementos que se deben optimizar para tener un mercado potencial ms amplio.

  • Costos de EjecucinLas aplicaciones multimedia como los videojuegos tienen un costo de ejecucin alto por lo cual la optimizacin de su desempeo es crtico, la gran mayora de las veces requieren de procesadores rpidos (e.g. tarjetas de video) o de mucha memoria.

    Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos mviles.

  • Costos de EjecucinLos dispositivos mviles tiene recursos ms limitados que un dispositivo de cmputo convencional razn por la cual, el mejor uso de memoria y otros recursos de hardware tiene mayor rendimiento.

    En algunos casos es preferible tener la lgica del negocio ms fuerte en otros dispositivos y hacer uso de arquitecturas descentralizadas como cliente/servidor o P2P.

  • Criterios Mejora de SoftwareLa mejor manera de optimizar el cdigo es hacer ver a los programadores que optimicen su cdigo desde el inicio, el problema radica en que el costo podra ser muy grande ya que tendra que codificar ms y/o hacer su cdigo mas legible.

    Los criterios de optimizacin siempre estn definidos por el compilador

  • Criterios de OptimizacinMuchos de estos criterios pueden modificarse con directivas del compilador desde el cdigo o de manera externa.

    Este proceso lo realizan algunas herramientas del sistema como los ofuscadores para cdigo mvil y cdigo para dispositivos mviles.

  • Htas. Anlisis Flujo DatosExisten algunas herramientas que permiten el anlisis de los flujos de datos, entre ellas tenemos los depuradores y desambladores.

    La optimizacin al igual que la programacin es un arte y no se ha podido sistematizar del todo.

  • Generacin de Cdigo ObjetoJuan Carlos Olivares Rojas

  • AgendaLenguaje mquina. Caractersticas. Direccionamiento.

    Lenguaje ensamblador. Caractersticas. Almacenamiento. Registros. Distribucin. Asignacin. Administracin de memoria.

  • Lenguaje MquinaEl lenguaje mquina slo es entendible por las computadoras. Se basa en una lgica binaria de 0 y 1, generalmente implementada por mecanismos elctricos.

    En general el lenguaje mquina es difcil de entender para los humanos por este motivo hacemos uso de lenguajes ms parecidos a los lenguajes naturales.

  • CaractersticasEl lenguaje mquina realiza un conjunto de operaciones predeterminadas llamadas microoperaciones.

    Las microoperaciones slo realizan operaciones del tipo aritmtica (+,-,*, /), lgicas (AND, OR, NOT) y de control (secuencial, decisin, repetitiva)

  • CaractersticasEl lenguaje mquina es dependiente del tipo de arquitectura. As un programa mquina para una arquitectura intel x86 no se ejecutar en una arquitectura Power PC de IBM (al menos de manera nativa).

    Algunos microprocesadores implementan ms funcionalidades llamado CISC, pero son ms lentos que los RISC ya que estos tienen registros ms grandes.

  • DireccionamientoEs la forma en como se accede a la memoria. Recordar que un programa no puede ejecutarse sino se encuentra en memoria principal.

    La forma de acceder a la memoria depende del microprocesador, pero en general existen dos tipos de direccionamiento: directo e indirecto.

  • DireccionamientoEl direccionamiento directo tambin recibe el nombre de direccionamiento absoluto y el acceso a las direcciones se hace de manera directa.

    El direccionamiento indirecto tambin recibe el nombre de direccionamiento relativo y se basa a partir de una direccin genrica, generalmente el inicio del programa.

  • DireccionamientoPara acceder a una direccin relativa se suma a la direccin base el nmero de espacios de memorias necesarias.

    El direccionamiento relativo hace a los programas relocalizables e independientes.

    Si la direccin base es el inicio de la memoria fija el direccionamiento pasa a ser un variante de direccionamiento absoluto.

  • Lenguaje EnsambladorEl ensamblador (del ingls assembler) es un traductor de un cdigo de bajo nivel a un cdigo, ejecutable directamente por la mquina para la que se ha generado.

    Fue la primera abstraccin de un lenguaje de programacin, posteriormente aparecieron los compiladores.

  • CaractersticasEl programa lee un archivo escrito en lenguaje ensamblador y sustituye cada uno de los cdigos mnemotcnicos por su equivalente cdigo mquina.

    Los programas se hacen fcilmente portables de mquina a mquina y el clculo de bifurcaciones se hace de manera fcil.

  • EnsambladoresEnsambladores bsicos. Son de muy bajo nivel, y su tarea consiste bsicamente en ofrecer nombres simblicos a las distintas instrucciones, parmetros y cosas tales como los modos de direccionamiento.

  • EnsambladoresEnsambladores modulares, o macro ensambladores. Descendientes de los ensambladores bsicos, fueron muy populares en las dcadas de los 50 y los 60, antes de la generalizacin de los lenguajes de alto nivel. Una macroinstruccin es el equivalente a una funcin en un lenguaje de alto nivel.

  • AlmacenamientoUna de las principales ventajas del uso del ensamblador, es que se encarga de administrar de manera transparente para el usuario la creacin de memoria, las bifurcaciones y el paso de parmetros. Adems nos permite acceder directamente a los recursos de la mquina para un mejor desempeo.

  • RegistrosLos registros son la memoria principal de la computadora. Existen diversos registros de propsito general y otros de uso exclusivo.

    Algunos registros de propsito general son utilizados para cierto tipo de funciones. Existen registros acumuladores, puntero de instruccin, de pila, etc.

  • DistribucinLa distribucin es el proceso en el que el programa generado puede ejecutarse en otras mquinas.

    Con respecto al ensamblador, la mayora del direccionamiento se hace relativo para que el programa sea relocalizable por un programa llamado cargador

  • DistribucinEn el caso de programas compilados se necesitan de las libreras, si son estticas se incluyen en el ejecutable por lo que el programa se hace grfico, si son dinmicas no pero el programa es ms pequeo.

    Debido a la complejidad del software actual se necesitan de asistentes para poder instalar y ejecutar un programa

  • AsignacinLa asignacin de valores a variables se hace a travs de un proceso de mover el contenido de memoria a registro, o de registro a memoria, pero nunca de memoria a memoria.

    Cuando se trata de memoria dinmica se debe seguir el rastro de los datos

  • Administracin memoriaLa administracin de la memoria e sun proceso hoy en da muy importante, de tal modo que su mal o buen uso tiene una accin directa sobre el desempeo de memoria.

    En general un ensamblador tiene un administrador de memoria ms limitado que un compilador.

  • Administracin de MemoriaEn la mayora de los lenguajes de programacin el uso de punteros no estaba vigilado por lo que se tienen muchos problemas con el uso de memoria. Los lenguajes ms recientes controlan el uso de punteros y tienen un programa denominado recolector de basura que se encarga de limpiar la memoria no utilizada mejorando el desempeo.

  • ReferenciasAho (2006), et. al. Compiladores: Principios y Tcnicas. Segunda Edicin.

  • Preguntas?