Download El concepto de RValue y LValue

Document related concepts

Efecto secundario (informática) wikipedia , lookup

Transcript
El concepto de RValue y LValue- TAD
Carlos Montenegro
Programación Orientada a Objetos
Proyecto Curricular de Ingeniería de Sistemas
El concepto de RValue y LValue:
Cuando se declara una variable de cualquier tipo ya sea primitiva o
de un tipo abstracto de dato, esta posee las características de
identificación, tipo, clase de almacenamiento, dirección o LValue y
valor ó RValue.
La identificación hace referencia sencillamente al nombre de la
variable o tipo de dato que se declara, por ejemplo:
int num;
El tipo de dato hace referencia a 2 tipo de datos básicamente las
primitivas (int, double, flota, char) y los datos abstractos que son
aquellos creados por las necesidad propias del usuario (estructuras).
La clase de almacenamiento hace referencia al tiempo de
almacenamiento de un dato y el alcance del mismo (local, global).
Ahora si llegamos al concepto de dirección o LValue, es
sencillamente la dirección de memoria en donde esta localizada la
variable, pero es bueno aclara que el LValue solo aplica para
variables no a valores ya determinados por ejemplo.
num = 18 //num tiene un dirección a la cual se le asigna el valor de
18, pero 18 no tiene LValue, ya que no hay una dirección de
memoria que represente este valor.
El nombre de LValue nace de la expresión en ingles “left value” valor
a la izquierda como lo muestra el ejemplo.
El RValue es el valor de un dato, este puede ser una constante, una
variable ó una expresión. Es sencillamente la representación de una
valor que se puede asignar a un espacio de memoria como un
LValue, por ejemplo:
18 + 2; //este es una valor que puede ser asignado a una variable.
El nombre de LValue nace de la expresión en ingles “right value”
valor a la derecha.
TAD (Tipo Abstracto de Dato):
Tipo: agrupación de elementos con características similares.
Abstracto: no concreto, conceptual.
Dato: información que una computadora puede entender.
Una primera definición:
Un tipo abstracto de datos es un conjunto de valores cuya creación y
conocimiento de sus características sólo puede realizarse mediante
un conjunto de operaciones.
Más cerca de la programación:
Un tipo abstracto de datos es un tipo cuya representación como tipo
concreto ha sido abstraída y a cuyos datos sólo se puede acceder a
través de un conjunto de operaciones. [William R. Cook. A
comparison of objects and abstract data types, February
1994.]
Ejemplo de un TAD, una estructura que ordeno 10 numero enteros
ingresados aleatoria mente.
Trabajo: Realizar el TAD anteriormente definido.
Efectos colaterales y la propiedad de la transparencia
referencial
La propiedad fundamental de las funciones matemáticas que permite
la analogía con los bloques de construcción se llama transparencia
referencial. Intuitivamente esto quiere decir el valor de una
expresión, depende exclusivamente del valor de las sub expresiones
que lo componen, evitando así la presencia de efectos colaterales
propios de lenguajes que presentan opacidad referencial.
Una función con referencia transparente tiene como característica
que dados los mismos parámetros para su aplicación, obtendremos
siempre el mismo resultado. Mientras que en matemáticas todas las
funciones ofrecen transparencia referencial, ese no es el caso en los
lenguajes de programación.
Veamos otro ejemplo. Una persona evaluando la expresión (2ax+b)
(2ax+c) no se molestaría jamás por evaluar dos veces la sub
expresión 2ax. Una vez que determina que 2ax = 12, la persona
substituirá 12 por ambas ocurrencias de 2ax. Esto se debe a que una
expresión aritmética dada en un contexto fijo, producirá siempre el
mismo valor como resultado. Dados los valores a = 3 y x = 2, 2ax
será siempre igual a 12.
La trasparencia referencia resulta del hecho de que los operadores
aritméticos no tienen memoria, por lo que toda llamada al operador
con los mismos parámetros actuales, producirá la misma salida.
¿Porqué es importante una propiedad como la transparencia
referencial? Por las matemáticas sabemos lo importante de poder
substituir iguales por iguales. Esto nos permite derivar nuevas
ecuaciones, a partir de las ecuaciones dadas, transformar
expresiones en formas más útiles y probar propiedades acerca de
tales expresiones. En el contexto de los lenguajes de programación,
la transparencia referencia permite además optimizaciones tales
como la eliminación de subexpresiones comunes, como en el
ejemplo anterior 2ax.
Observemos ahora que pasa con lenguajes que no ofrecen
transparencia referencial.
Consideren la siguiente definición de una pseudofunción en C++:
int a=1;
int funcion (int numIn){
a = a+1;
int numFin = numIn * numIn;
return numFin;
}
Debido a que funcion guarda un registro en a del número de veces
que la función ha sido aplicada, no podríamos eliminar la
subexpresión común en la expresión:
(a+2 * funcion(b)) *(c+2 *funcion (b)). Esto debido a que al cambiar
el número de veces que funcion ha sido aplicada, cambia el
resultado de la expresión.