Você está na página 1de 17

INSTITUTO TECNOLOGICO SUPERIOR DE TANTOYUCA

UNIDAD 5, 6 Y 7
ALUMNOS: MIGUEL ANGEL RAMOS CRUZ FRANCISCO JAVIER REYES DE LA CRUZ EDGAR EUSEBIO MARTINEZ ANTONIO DOCENTE: ING. LLUVIA ERENDIDA PONCE MARTINEZ MATERIA: PROGRAMACION DE SISTEMAS GRUPO: S-51

Unidad 5 Anlisis semntico


5.1 Analizador semntico. 5.2 Verificacin de tipos de expresiones. 5.3 Conversin de tipos. 5.4 Acciones agregadas en un analizador sintctico descendente (top-down). 5.5 Pila semntica en un analizador sintctico ascendente (bottom-up). 5.6 Administracin de tabla de smbolos. 5.7 Manejo de errores semnticos.

PROGRAMACION DE SISTEMAS

Unidad 6 Generacin de Cdigo Intermedio


6.1 Lenguajes intermedios. 6.2 Notaciones. 6.2.1 Infija. 6.2.2 Postfija. 6.2.3 Prefija. 6.3 Representacin de cdigo intermedio. 6.3.1 Notacin Polaca. 6.3.2 Cdigo P. 6.3.3 Triplos. 6.3.4 Cudruplos. 6.4 Esquemas de generacin. 6.4.1 Expresiones. 6.4.2 Declaracin de variables, constantes 6.4.3 Estatuto de asignacin. 6.4.4 Estatuto condicional. 6.4.5 Estatuto de ciclos 6.4.6 Arreglos. 6.4.7 Funciones.

PROGRAMACION DE SISTEMAS

GENERACION DE CODIGO INTERMEDIO


Despus de los anlisis sintctico y semntico, algunos compiladores generan una representacin intermedia explcita del programa fuente. Se puede considerar esta representacin intermedia como un programa para una mquina abstracta. Esta representacin intermedia debe tener dos propiedades importantes; debe ser fcil de producir y fcil de traducir al programa objeto. La generacin de cdigo intermedio transforma un rbol de anlisis sintctico (semntico) en una representacin en un lenguaje intermedio, que suele ser cdigo suficientemente sencillo para poder luego generar cdigo mquina. Una forma de hacer esto es mediante el llamado cdigo de tres direcciones. Una sentencia en cdigo de tres direcciones es: A := B op C, donde A, B y C son operandos y op es un operador binario. Tambin permite condiciones simples y saltos. 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. Los 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). 6.1 Lenguajes Intermedios Los 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. Otros lenguajes intermedios sirven de base o como representacin parcial de otros procesos. Un lenguaje intermedio es el lenguaje de una mquina abstracta diseada para ayudar en el anlisis de los programas de computadora. El trmino viene de su uso en los compiladores, donde un compilador primero traduce el cdigo fuente de un programa, en una forma ms apropiada para las transformaciones de mejora del cdigo, forma usualmente llamada bytecode, como un paso intermedio antes de generar el archivo objeto o el cdigo mquina para una mquina especfica. 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 ejecutable .exe En sistemas basados en Unix, tambin ocurre algo similar generndose un archivo .o y el ejecutable a.out. Otros lenguajes intermedios famosos son los generados

PROGRAMACION DE SISTEMAS

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). Lenguaje intermedio tipo 1 Es una representacin ms abstracta y uniforme que un lenguaje mquina concreto. Su misin es descomponer las expresiones complejas en binarias y las sentencias complejas en sentencias simples. Ventajas: y Permite una fase de anlisis (anlisis semntico) independiente de la mquina. Se pueden realizar optimizaciones sobre el cdigo intermedio (Las complejas rutinas de optimizacin son independientes de la mquina).

Desventajas: y y Prdida de eficiencia (no permite una compilacin de una sola pasada). Introduce en el compilador una nueva fase de traduccin.

Lenguaje intermedio tipo 2 Tipos de lenguajes intermedios: y y rbol sintctico. rbol sintctico abstracto: Todos los nodos del rbol representan smbolos terminales. Los nodos hijos son operandos y los nodos internos son operadores. Grafo dirigido acclico (GDA). Notacin posfija. Definicin de una mquina abstracta.

y y y y

N-tupla: Cada sentencia del lenguaje intermedio consta de N elementos: (Operador, Operando1, Operando2,, Operando N?1). Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas), llamados tambin cdigo de tres direcciones. Lenguaje intermedio tipo 3

PROGRAMACION DE SISTEMAS

Tripletas: Ejemplo: d = a + b * c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) <operador>, <operando_1>, <operando_2> Cuartetos: Ejemplo: d = a + b * c (*, b, c, temp1) (+, a, temp1, temp2) (=, temp2, , d) 6.2 Notaciones Las 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. La 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. 6.1.2 Infija La 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. 6.2.2 Postfija La notacin postfija pone el operador al final de los dos operandos. Por ejemplo: ab+5La notacin postfija utiliza una estructura del tipo LIFO (Last In First Out) pila, la cual es la ms utilizada para la implementacin. 6.2.3 Prefija

PROGRAMACION DE SISTEMAS

La notacin prefija pone el operador primero que los dos operandos. Po ejemplo: +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. 6.3 Representacin de Cdigo Intermedio 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. La representacin intermedia puede tener diversas formas. Existe una forma intermedia llamada cdigo de tres direcciones que es como el lenguaje ensamblador de una mquina en la que cada posicin de memoria puede actuar como un registro. El cdigo de tres direcciones consiste en una secuencia de instrucciones, cada una de las cuales tiene como mximo tres operandos. Esta representacin intermedia tiene varias propiedades: Primera: Cada instruccin de tres direcciones tiene a lo sumo un operador, adems de la asignacin, por tanto, cuando se generan estas instrucciones, el traductor tiene que decidir el orden en que deben efectuarse las operaciones. Segunda: El traductor debe generar un nombre temporal para guardar los valores calculados por cada instruccin. Tercera: Algunas instrucciones de tres direcciones tienen menos de tres operandos, por ejemplo, la asignacin. 6.3.1 Notacin Polaca La notacin polaca es la originada por un Autmata con pila, en la que los operadores siempre preceden a los operandos sobre los que actan, y que tiene la ventaja de no necesitar parntesis:

PROGRAMACION DE SISTEMAS

Estndar Ejemplo 1: 2 * ( 3 + 5 ) Ejemplo 2: 2 * 3 + 5 Polaca Ejemplo 1: * 2 + 3 5 Ejemplo 2: + * 2 3 5 6.3.2 Cdigo P El 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. Para 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. 6.3.2 Triplos Las proposiciones de tres direcciones se parecen 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. El 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. Generalmente 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 Se 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. La evaluacin de expresiones en corto circuito implica que se evalan condiciones revisando valores anteriores;

PROGRAMACION DE SISTEMAS

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 verdadero. La 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. Los intrpretes 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 cudruplos. 6.3.4 Cudruplos Es 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. 6.4 Esquemas de Generacin Cuando el nmero de lenguaje fuente crece hasta un nmero grande M, y/o cuando el nmero de lenguajes objeto tambin crece hasta un nmero grande N, es necesario encontrar una tcnica para evitar tener que disear M x N compiladores. La solucin consiste en utilizar un lenguaje intermedio o una representacin intermedia; De esta forma slo hay que construir M programas que traduzcan de cada lenguaje fuente al lenguaje intermedio (los front ende), y N programas que traduzcan del lenguaje intermedio a cada lenguaje objeto (los back end). Los 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. La utilizacin de un lenguaje intermedio permite construir en, mucho menos tiempo un compilador para otra mquina y tambin permite construir compiladores para otros lenguajes fuente generando cdigos para la misma mquina. 6.4.1 Expresiones Para generar expresiones estas deben representarse de manera ms simple y ms literal para que su conversin sea ms rpida.

PROGRAMACION DE SISTEMAS

Por ejemplo la traduccin de operaciones aritmticas debe especificarse una por una, de tal forma que una expresin sea lo ms mnimo posible. Toda expresin es una sentencia: El operador de asignacin forma parte de una expresin. Deber comprobarse la validez semntica de la parte izquierda de una asignacin. Asignaciones de expresiones con tipos construidos por el usuario (registros y arrays).

Conversin de expresiones: Se realizarn implcitamente las conversiones de char a entero y real y las de entero a real. Conversiones explcitas entre tipos simples, realizadas por el programador mediante un ahormado (cast). Conversiones explcitas de expresiones a tipos definidos por el usuario typedef).

Operadores mnimos: Los operadores obligatorios que deber incluir el lenguaje son: Aritmticos: +, -, *, /, resto y menos unario. Comparacin: mayor, mayor o igual, menor, menor o igual, igual y distinto. Lgicos: And, Or y Not. Sentencias de control de flujo. Sentencia condicional IF ELSE. Sentencias iterativas WHILE, FOR. Sentencias condicional mltiple CASE

Entrada y Salida Sentencias de lectura y escritura mltiple por la entrada y salida estndar para todos los tipos primitivos con las instrucciones read y write. Debern permitirse la entrada y salida de mltiples valores (separndolos mediante comas).

10

PROGRAMACION DE SISTEMAS

Escritura de cadenas de caracteres para no tener que estar escribiendo carcter a carcter. Ejemplo: write Escriba un nmero; Expresiones de Tipos: Son un tipo bsico o se forma mediante la aplicacin de un operador llamado constructor de tipos a una expresin de tipos. Los conjuntos de tipos bsicos y los constructores dependen del lenguaje que se va a comprobar. Ejemplo: El tipo de arreglo int[2][3] puede leerse como arreglo de 2 arreglos, de 3 enteros cada uno y escribirse como una expresin de tipos arreglo(2, arreglo(3, integer)).

6.4.2 Declaracin 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 a, b, c; se descompone a int a; int b; int c; respectivamente. 6.4.3 Estatuto de Asignacin Las 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. 6.4.4 Estatuto Condicional Las condiciones deben expresarse de manera lo ms sencilla posible de tal forma que puedan evaluarse en cortocircuito.

11

PROGRAMACION DE SISTEMAS

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. 6.4.5 Estatuto de Ciclos Los 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. 6.4.6 Arreglos Los 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; 6.4.7 Funciones Las 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.

12

PROGRAMACION DE SISTEMAS

Unidad 7 Optimizacin
7.1 Notaciones. 7.1.1 Locales. 7.1.2 Bucles. 7.1.3 Globales. 7.1.4 De mirilla. 7.2 Costos. 7.2.1 Costos de ejecucin. 7.2.2 Criterios para mejorar el cdigo. 7.2.3 Herramientas para el anlisis del flujo de datos.

13

PROGRAMACION DE SISTEMAS

OPTIMIZACIN
Las optimizaciones pueden realizarse de diferentes formas. Las optimizaciones 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. Como 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. Como 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. La 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. La 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. 7.1 Tipos de optimizacin y y y y Locales Bucles Globales De mirilla

7.1.1 Locales La optimizacin local se realiza sobre mdulos de programa. En la mayora de las ocasiones a travs de funciones, mtodos, procedimientos, clases, etc. La caracterstica de las optimizaciones locales es que solo se ven reflejados en dichas secciones.

14

PROGRAMACION DE SISTEMAS

La optimizacin local sirve cuando un bloque del programa o seccin es crtico por ejemplo: la E/S, la concurrencia, la rapidez y la confiabilidad de un conjunto de instrucciones. Como el espacio de soluciones es ms pequeo la optimizacin local es ms rpida. 7.1.2 Bucles Los ciclos son una de las partes ms esenciales en el rendimiento de un programa dado que realizan acciones repetitivas, y si dicha acciones estn mal realizadas, el problema se hace N veces ms grande. La mayora de las optimizaciones sobre ciclos tratan de encontrar elementos que no deben repetirse en un ciclo. While (a==b) { Int c=a; c=5;; } En este ciclo es mejor pasar el int c=a; fuera del ciclo de ser posible. El problemas de la optimizacin en ciclos y en general radica es que es muy difcil saber el uso exacto de algunas instrucciones. As que no todo el cdigo de proceso puede ser optimizado. Otros usos de la optimizacin puede ser el mejoramiento de consultas en SQL o en aplicaciones remotas (sockets, E/S, etc.). 7.1.3 Globales La optimizacin global se da con respecto al todo el cdigo. Este tipo de optimizacin es mal lenta pero mejora el desempeo general de todo el programa. Las optimizaciones globales pueden depender de la arquitectura de las maquinas. En algunos casos es mejor mantener variables globales para agilizar los procesos (el proceso de declarar variables y eliminarlas toma su tiempo) paro consume ms memoria. Algunas optimizaciones incluyen utilizar como variables registros del CPU, utilizar instrucciones en ensamblador.

15

PROGRAMACION DE SISTEMAS

7.1.4 De mirilla La optimizacin de mirilla trata de estructurar de manera eficiente el flujo del programa, sobre todo en instrucciones bifurcacin como la son decisiones, ciclos y saltos de rutina. La idea es tener los saltos ms cerca de las llamadas siendo el salto lo ms pequeo posible. 7.2 Costos Los costos son el factor ms importante 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 el tiempo o el espacio pero sale muy costosa en tiempo en generarla. Pero 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 benfica la mejora. Por ejemplo for(int i=0; i<10000; i++); si la ganancia es de 30 ms 300s. 7.2.1 Costos de ejecucin Los 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 de los microprocesadores son elementos que se deben optimizar para tener un mercado potencial ms amplio. Las aplicaciones multimedia como los videojuegos tienen un costo de ejecucin alto por lo cual la optimizacin de su desempeo es crtica, la gran mayora de las veces requieren de procesos rpidos (e.g. tarjetas de video) o de mucha memoria. Otro tipo de aplicaciones que deben optimizarse son las aplicaciones para dispositivos mviles. Los dispositivos mviles tienen recursos ms limitados que un dispositivo de cmputo convencional razn por la cual, el mejor uso de memoria y otros recursos de hardware tienen 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. 7.2.2 Criterios para mejorar el cdigo

16

PROGRAMACION DE SISTEMAS

La 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 modificar mas y/o hacer su cdigo mas legible. Los criterios de optimizacin estn siempre definidos por el compilador. Muchos 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. 7.2.3 Herramienta para el anlisis de flujo de datos Existen algunas herramientas que permiten al anlisis de flujo 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.

17

PROGRAMACION DE SISTEMAS

Você também pode gostar