Professional Documents
Culture Documents
Tipo 2.- son los lenguajes intermedios que utilizan: rbol sintctico. rbol sintctico abstracto. o Todos los nodos del rbol representan smbolos terminales. o Los nodos hijos son operandos y los nodos internos son operadores. Grafo dirigido acclico (GDA). Notacin posfija. Definicin de una mquina abstracta. N-tupla o Cada sentencia del lenguaje intermedio consta de N elementos (Operador, Operando1, Operando2, , Operando N1) o Los ms usuales son los tercetos (tripletas) y los cuartetos (cudruplas), llamados tambin cdigo de tres direcciones. Tipo 3.- se compone nicamente de tripletas y cuartetas. Tripletas: < operador> <operando_1> <operando_2> Ejemplo: d=a+b*c [1] (*, b, c) [2] (+, a, [1]) [3] (=, d, [2]) Cuartetos: Ejemplo:
6.2 Notaciones.
6.2.1 Infija. En esta notacin se escriben los operadores entre los operandos (por ejemplo a+b/c), en la notacin infija en ocasiones es necesario rodear entre parntesis a los grupos de operandos y operadores, para indicar el orden en el cual se deben realizar las operaciones (por ejemplo (a+b)/c). Si no se emplean los parntesis se emplean las reglas de prioridad de operadores que determinan el orden de las operaciones. No se tiene una estructura sencilla para representar esta notacin en la computadora por ello se utilizan otras notaciones. 6.2.2 Postfija. La Notacin Polaca Inversa o notacin postfija es un mtodo alternativo de introduccin de datos, en el que primero estn los operandos y despus viene el operador que va a realizar los clculos sobre ellos (infijo a+b/c postfija abc/+). No necesitan usar parntesis para indicar el orden de las operaciones mientras la aridad del operador sea fija. Esta notacin evala los datos cuando se introducen y los almacena en una estructura del tipo LIFO (Last In First Out), lo que optimiza los procesos de programacin ya que al evaluar los datos directamente al introducirlos no es necesario ordenar la evaluacin de los mismos como sucede en la notacin infija, as, para hacer una suma a+b=c se hara de la forma a b +, dejando el resultado en c directamente. 6.2.3 Prefija. La notacin polaca o notacin prefija, es una forma de notacin cuya caracterstica distintiva es que coloca los operadores a la izquierda de sus operandos (infijo a+b/c prefija +a/bc). Si la aridad de los operadores es fija, el resultado es una sintaxis que carece de parntesis u otros signos de agrupacin, y todava puede ser analizada sin ambigedad. La notacin de prefijo es utilizada en las operaciones basadas en pila, debido a que distingue fcilmente el orden de las operaciones sin usar parntesis para evaluar las operaciones, no necesita una jerarqua operacional como en la notacin infija.
Pgina 20
Las expresiones se leen de izquierda a derecha, primero se busca un operador y posteriormente se buscan dos operandos. Si se encuentra otro operador antes de que se localicen los dos operandos, el operador anterior colocado a un lado hasta que el nuevo operador sea resuelto. Este proceso se itera hasta que un operador sea resuelto.
6.3.2 Cdigo P. Se refiere al pre cdigo de la compilacin, es un lenguaje intermedio o cdigo portable que proporciona un formato alternativo binario para cdigo nativo de cualquier compilador binario. Que contenga una mquina virtual para ejecutar cdigo p. La implementacin ms famosa de este cdigo est hecha para cdigo en pascal, pero tambin est presente en los lenguajes desarrollados por Microsoft, en MATLAB, Java y muchos ms. En comparacin con una traduccin directa a cdigo mquina, la traduccin a cdigo p y su ejecucin ofrece ms ventajas. Por su portabilidad es ms fcil escribir un pequeo intrprete de cdigo p, de lo que es modificar un compilador para generar cdigo nativo para la misma mquina. El implementar la generacin de cdigo mquina es una de las partes ms complicadas de escribir un compilador. En comparacin, la generacin de cdigo p es mucho ms fcil. Tiene un tamao compacto debido a que el cdigo p se basa en una mquina virtual ideal, un programa de cdigo p es a menudo ms pequeo que el mismo programa traducido a cdigo mquina. Cuando la depuracin de cdigo p se ejecuta, el intrprete puede aplicar controles adicionales de tiempo de ejecucin que son difciles de implementar con cdigo nativo. En la dcada de 1990, la traduccin al cdigo p se convirti en una estrategia popular para las implementaciones de lenguajes como Python y Java. El lenguaje de estudio para estos apuntes es el Prolog, proveniente del francs Programation et Logique, es un lenguaje de programacin lgico e interpretado, bastante popular en el medio de investigacin en Inteligencia Artificial. Inicialmente se trataba de un lenguaje totalmente interpretado hasta que, a mediados de los 70 se desarroll un compilador capaz de traducir Prolog en un conjunto de instrucciones de una mquina abstracta denominada Warren Abstract Machine, o abreviadamente, WAM. Desde entonces Prolog es un lenguaje semi-interpretado. Prolog pertenece al paradigma de los lenguajes lgicos, lo que lo hace diferente de otros lenguajes ms populares tales como Fortran, Pascal, C, etc. En los cuales las instrucciones se ejecutan normalmente en orden secuencial, es decir, una a continuacin de otra, en el mismo orden en que estn escritas y slo vara cuando se alcanza una instruccin de control (un bucle o ciclo, una instruccin condicional o una transferencia).
Pgina 21
Los programas en Prolog se componen de clusulas que constituyen reglas del tipo si es verdad el antecedente, entonces es verdad el consecuente. Pero en Prolog primero se debe de escribir el consecuente y luego el antecedente, el antecedente puede ser una conjuncin de condiciones que se denomina secuencia de objetivos. Cada objetivo se separa con una coma y puede considerarse similar a una instruccin o llamada a procedimiento de los lenguajes imperativos. Por ejemplo: esmejorque(100, 70). Se lee de la siguiente manera: 100 es mejor que 70. Prolog utiliza tambin listas, estas son colecciones de elementos y se dividen en dos partes: a) Cabeza.- es el primer elemento de la lista y, b) Cola.- es una lista con el resto de los elementos de la lista. La cabeza y la cola de una lista se separan con el smbolo |, un % indica un comentario. Ejemplo de Cdigo Prolog % declaraciones fabrica(intel, pentium). % Intel fabrica pentium fabrica(intel, celeron). % Intel fabrica celeron fabrica(intel, centrino). % Intel fabrica centrino % dual core es posterior de pentium si pentium es anterior a dual core esposteriora(dual core, pentium):- esanteriora(pentium, dual core). % pentium es anterior a core duo si core dou es posterior de dual core y pentium es anterior a dual core esanteriora(pentium, core dou):- esposteriora(core dou, dual core), esanteriora(pentium, dual core). % celeron y centrino son de la misma familia si el fabricante de celeron es tambin de centrino y si celeron % no es lo mismo que centrino esfamiliade(celeron, centrino):- celeron \== centrino. % core dou es familiar de pentium si core dou pertenece a centrino o Intel fabrica core duo esfamiliarde(core duo, pentium):- pertenecea(core duo, centrino). esfamiliarde(core duo, pentium):- fabrica(intel, core duo). % consultas % celeron es familia de pentium ?- esfamiliade(celeron, pentium). si % core dou es posterior a pentium ?- esposteriora(core duo, pentium). si % dual core es anterior a core duo? ?- esanteriora(dual core, core duo). no % Ejemplo sobre Listas Prolog % las listas se encuentran entre []. % para determinar que una lista vaca es 0 se hace de la manera. longitud([], 0). % para lograr obtener la cantidad de elementos en una lista se hace de la manera. longitud([H|T], N):- longitud(T, N0), N is N0 + 1. ?- longitud([a,b,c], L). 3
L.I. Vctor Hernndez Rodrguez Pgina 22
?- longitud([a,b,c],4). No % un elemento pertenece a la lista si coincide con la cabeza o si se encuentra en la cola de la lista. pertenece(X, [X|_]). pertenece(X, [_|R]):- pertenece(X, R). ?- pertenece(1, [1, 2, 3]). si ?- pertenece(2, [1, [2, 3]]). no ?- pertenece([2, 3], [1, [2, 3]]). si 6.3.3 Triplos.
Es una notacin compuesta de 3 elementos: <operador>, <operando1>, <operando2> el resultado se asocia al nmero de tripleta. Por ejemplo: W*X+(Y+Z) quedara de la manera: [1] *, W, X [2] +, Y, Z [3] +, [1], [2] Observe que toda expresin o instruccin, se debe descomponer en partes ms pequeas, de manera que solo estn formadas por 3 componentes o elementos. Un ejemplo de una condicin seria: if a>10 THEN r=a else r=10+1 [1] >, a, 10 2. saltar si falso, [1], 5 3. =, r, a 4. saltar, , 7 [5] +, 10, 1 6. =, r, [5] 7. ... El problema de las tripletas radica en que la optimizacin supone mover tripletas y hay que recalcular las referencias. Esto sucede en las tripletas indirectas y la solucin al problema de la reordenacin se logra mediante la indireccin. Esto se puede observar en el siguiente ejemplo: A=B+C*D/E F=C*D sin optimizar [1] *, C, D [2] /, [1], E [3] +, B, [2] [4] =, A, [3] [5] *, C, D [6] =, F, [1] 6.3.4 Cudruplos. Las cudruplas se componen como su nombre lo dice de 4 elementos, <operacin>, <operando1>, <operando2>, <resultado> un ejemplo seria: (A+B)*(C+D)-E
L.I. Vctor Hernndez Rodrguez Pgina 23
optimizada [1] *, C, D [2] /, (1), E [3] +, B, [2] [4] =, A, [3] [5] =, F, [1]
(+, A, B, T1) (+, C, D, T2) (*, T1, T2, T3) (-, T3, E, T4) Donde T1, T2, T3, T4 son variables temporales. Las cudruplas facilitan la aplicacin de muchas optimizaciones, pero hay que tener un algoritmo para la reutilizacin de las variables temporales (reutilizacin de registros del procesador).
de de de de