lunes, 2 de marzo de 2020



2.3.1 Variables y constantes


Las 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.
Resultado de imagen para variables y constantes

Investigado por Dayanara Lizeth Cruz Mendez
Referencias:
Martin, J. C., & Blanco y Correa Magallanes, J. L. (2004). Introduction to languages and the theory of computation. Lenguajes formales y teoría de la computación.

2.3 Esquema 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.
Los esquemas de generación dependen de cada lenguaje. Tomaremos algunos esquemas de generación del lenguaje C.



Expresiones
Instrucciones de control
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, de tal forma que una expresión sea lo más mínimo posible
Son aquellas que asignan un valor a una variable o una expresión
ejemplo
X=23 ó Y=expresión
Instrucción de asignación

Las funciones son un grupo de instrucciones con un propósito en general las cuales pueden recibir parámetros, mientras que la estructura es un conjunto de datos elementales interrelaciones que realizan ciertas operaciones entre ellos variables y constantes
Las declaraciones de variables y constantes deben separarse de tal manera que queden las expresiones una por una de manera simple
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
Son aquellas que permiten modificar o varia el flujo de ejecución de un programa, existen 3 tipos los cuales son :

  • Instrucciones condicionales o alternativas
  • Instrucciones de salto
  • Instrucciones repetitivas

Investigado por Saul Santiago Hernández.
Referencia
E Jurado Málaga - 2008 - dehesa.unex.es

2.2.4Cuádruplos


Es una estructura tipo registro con cuatros campos que se llaman:
Operador
Operando1
Operando2
Resultado
Operador
Operando1
Operando2
Resultado
*
C
D
T1
+
B
T1
T2
=
T2
A
Donde operando1, operando2 y resultado pueden ser constantes, identificadores y variables temporales definidos por el compilador mientras que operador representa una operación arbitraria.

  

EJEMPLO:
A := B + C * D
Esquemas de generación.
¿Que son?
 Los esquemas de generación son las estrategias o acciones que deberán realizarse y tomarse en cuenta en el momento de generar código intermedio.
Declaración de variables y 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; intc; respectivamente.
Las variables utilizadas en los programas se clasifican en dos tipos:
variables locales y variables globales.
Variables locales:
Aquella que está declarada para el programa o algoritmo completo.
 Para definir variables locales, la definición debe hacerse inmediatamente después de una llave de inicio ({), y la variable deja de existir fuera de la llave de fin(}) que corresponde a la llave de inicio después del cuál fue definida la variable.
Ejemplo:
{
int a,b;
a=5;
b=a + 100;
}
Variables globales:
Aquella que está declarada y definida dentro de una función y sólo es válida dentro de la misma función y no podrá utilizarse en otra parte del programa.
 Una variable global se declara fuera de cualquier función y primero que cualquier función que requiera de ella. Una variable se declara de la siguiente forma:
 tipo identificador1, identificador2..ident n;

Investigado por: Jonathan Arturo Ramos Hernández
Referencia

P Wanke, L Julianelli - 2000 - Editora Atlas SA

2.2.3 Triplos



En la historia de los compiladores han sido utilizadas una amplia variedad de representaciones intermedias como lo es la siguiente clase de representación de código intermedio de un árbol de 3 direcciones,2 para los operandos y una para la ubicación del resultado. esta clase incluye un amplio numero de representaciones diferentes entre las cuales encontramos cuadruplos y triples. la principal diferencia entre estas notaciones y la notación postfija es que ellos incluyen referencias explicitas para los resultados de los cálculos intermedios, mientras que la notación posfija los resultados son implícitos al representarlos en una pila.
§     La diferencia entre triples y cuadruplos es que con los triples es referenciado el valor intermedio hacia el numero del triple que lo creo, pero en los cuádruplos requiere que ellos tengan nombre implícitos.
§     Los triples tienen una ventaja obvia de ser mas consistente, pero ellos dependen de su posición, y hacen que la optimización presente cambios de código mucho mas compleja.
Para evitar tener que introducir nombres temporales en la tabla de símbolos, se hace referencia a un valor temporal según la posición de la proposición que lo calcula. Las propias instrucciones representan el valor del nombre temporal. La implementación se hace mediante registros de solo tres campos (op, arg1, arg2).
§     En la notación de tripletes se necesita menor espacio y el compilador no necesita generar los nombres temporales. Sin embargo, en esta notación, trasladar una proposición que defina un valor temporal exige que se modifiquen todas las referencias a esa proposición. Lo cual supone un inconveniente a la hora de optimizar el código, pues a menudo es necesario cambiar proposiciones de lugar.
§     Una forma de solucionar esto consiste en listar las posiciones a las tripletas en lugar de listar las tripletas mismas. De esta manera, un optimizador podría mover una instrucción reordenando la lista, sin tener que mover las tripletas en si

• <Operador>, <operando1>, <operando2>
• 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,, 7
5. +, Y, 1
6. =, Z, (5)
Problema
La optimización supone mover tripletas y hay que recalcular las referencias.

Investigado por: José Armando Pérez Cruz
Referencia
P Wanke, L Julianelli - 2000 - Editora Atlas SA

2.2.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. Fue diseñado para código real para una máquina 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 intérprete de la maquina P para una plataforma, 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, la mayor parte para lenguaje tipo Pascal.

Como el código P fue diseñado para ser directamente ejecutable, contiene una descripción implícita de un ambiente de ejecución particular que incluye tamaños de datos, además de mucha información específica para la maquina P, que debe conocer si se desea que un programa de código P se comprensible. La máquina P está compuesta por una memoria de código, una memoria de datos no específica para variables nombre das y una pila para datos temporales, junto como cualquiera registro que sea necesario para mantener la pila y apoyar la ejecución.
Resultado de imagen para pila de datos
Investigador por Carlos Daniel Martinez Diaz
Referencia:
Cuadra, D., Castro, E., Iglesias, A., Martínez, P., Calle, J., de Pablo, C., ... & Moreno, L. (2007). Desarrollo de Bases de Datos: casos prácticos desde el análisis a la implementación (No. 001.6 C8.). Mención de responsabilidad secundaria (traductor.

2.2.1 Notación Polaca


La notación polaca es la originada por un Autómata con pila, en la que los operadores siempre preceden a los operandos sobre los que actúan, y que tiene la ventaja de no necesitar paréntesis:
  • Se utiliza principalmente para la representación de expresiones aritméticas. 
  • Expresión a notación polaca inversa. 

Algoritmo
  • Representa la expresión en forma de árbol sintáctico. 
  • Recorrer el árbol en postorden
Ventajas y desventajas de la notación polaca

  • 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. 
Investigado por Dayanara Lizeth Cruz Mendez
Referencias:
Wikipedians, P. Algoritmos y Estructura de Datos.

2.1.3 Postfija 


Como su nombre lo indica se refiere a que el operador ocupa la posición después de los operandos sus características principales son: 
El orden de los operandos se conserva igual que la expresión infija equivalente no utiliza paréntesis ya que no es una operación ambigua. 

La operación posfija no es exactamente lo inverso a la operación prefija equivalente. 
El orden es primer operando, segundo operando, operando. 

(A+B)*C
AB+C* 
Ejemplo: 
Si deseamos representar las expresiones (2+(3*4)) = x   y    ((2+3)*4) = x en las tres notaciones mencionadas, el resultado sería: 
(2+(3*4)) = x 
((2+3)*4) = x 
Notación postfija 
2 3 4 * + x = 
2 3 + 4 * x =

Investigado por: Jonathan Arturo Ramos Hernández
Referencia
López, E. G. (2002). Diseno de circuitos lógicos combinatorios utilizando programación genética postfija con adaptación en lınea (Doctoral dissertation, Master’s thesis, Facultad de Fısica e Inteligencia Artificial, Universidad Veracruzana).