lunes, 30 de septiembre de 2019

2.3.3 Instrucción de asignación.

2.3.3 Instrucción de asignación.


La sintaxis general de la instrucción de asignación es:

nombre_de_la_variable = valor

El valor a la derecha del signo igual puede ser una constante, otra variable o una expresión que combine constantes y variables, pero siempre la variable y su valor deben ser del mismo tipo de dato.

Ejemplos:

edad% = 5
area! = 12.3
nombre$ = “Pedro”

 Instrucciones de asignación compuesta

Las instrucciones de asignación compuesta realizan primero una operación en una expresión antes de asignarla a un elemento de programación. En el siguiente ejemplo se muestra uno de estos operadores, +=, que incrementa el valor de la variable del lado izquierdo del operador con el valor de la expresión de la derecha.

Una instrucción de asignación asigna el valor de una expresión a una variable. En general, si la variable que se va a asignar es una propiedad, la propiedad debe ser de lectura y escritura o de sólo escritura; en caso contrario, se produce un error de compilación. Si la variable es una variable de sólo lectura, la asignación debe producirse en un constructor Shared o un constructor de instancia apropiado para el tipo de la variable; en caso contrario, se producirá un error de compilación.

2.3.2 Expresiones.

2.3.2 Expresiones.


En esta función recibe una cadena que representa una línea de código intermedio y toma las medidas oportunas para que ese código se utilice. Estas medidas pueden ser escribir la línea en un fichero adecuado, almacenar la instrucción en una lista que después se pasará a otros módulos, o cualquier otra que necesitemos en nuestro compilador.
Expresiones aritméticas
Son aquella donde los operadores que intervienen en ella son numéricos, el resultado es un número y los operadores son aritméticos. Los operadores aritméticos más comúnmente utilizados son: +, - , * , / y %.

Comenzamos el estudio por las expresiones aritméticas. Lo que tendremos que hacer es crear por cada tipo de nodo un método que genere el código para calcular la expresión y lo emita. Ese código dejará el resultado en un registro, cuyo nombre devolverá el método como resultado.

Para reservar estos registros temporales, utilizaremos una función, reserva. En principio bastar ‘a con que esta función devuelva un registro distinto cada vez que se la llame.

Cada nodo generará el código de la siguiente manera:
 Por cada uno de sus operandos, llamara al método correspondiente para que se evalúe la sub expresión. Si es necesario, reservara un registro para guardar su resultado.}
 Emitirá las instrucciones necesarias para realizar el cálculo a partir de los operandos.


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.

2.3.1 Variables y constantes.

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.

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;
Ejemplos:
 Algunos ejemplos de cómo definir variables son los siguientes:
 int alumnos, contador;
 float A,B,C;
 char Letra;
Declaracion de Constantes.
Para declarar constantes en el lenguaje C, sólo basta anteponer el calificador const seguido del tipo de dato que manejará esa constante (int,char,etc), y por último el valor que tomará esa variable.
Ejemplo:
const int k = 12

2.3 Esquema de generació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 exprecionejemplo
X=23 ó Y=expresion
Instruccion de asignacion



Las funciones son un grupo de instrucciones con un propocito en general las cuales pueden recibir parametros, mientras que la estructura es un conjunto de datos elementales interelacionados que realizan siertas 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 varial el flujo de ejecucion de un programa, existen 3 tipos los cuales son :
Instrucciones condicionales o alternativas
Instrucciones de salto
Instrucciones repetitivas

2.2.4 Cuádruplos

2.2.4 Cuádruplos


<operador>,<operando1>,<operando2>,<resultado>

Ejemplo:
(A+B)*(C+D)-E
+, A, B, T1
+, C, D, T2
*, T1, T2, T3
-, T3, E, T4

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)

2.2.3 Triplos.

2.2.3 Triplos.




<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.

2.2.2 Código P.

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 diversos 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.