Download El concepto de RValue y LValue
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.