Lenguajes de Programación I                                  Asignaciones                                             Ayud...
Lenguajes de Programación I                                                                 Apunte: Asignaciones          ...
Lenguajes de Programación I                                                                          Apunte: AsignacionesV...
Lenguajes de Programación I                                                                       Apunte: AsignacionesAsig...
Lenguajes de Programación I                                                                    Apunte: Asignaciones     Ve...
Lenguajes de Programación I                                                                        Apunte: Asignaciones   ...
Lenguajes de Programación I                                                                     Apunte: Asignaciones      ...
Lenguajes de Programación I                                                                           Apunte: Asignaciones...
Lenguajes de Programación I                                                                          Apunte: AsignacionesO...
Próxima SlideShare
Cargando en…5
×

Creacion2.

511 visualizaciones

Publicado el

0 comentarios
0 recomendaciones
Estadísticas
Notas
  • Sé el primero en comentar

  • Sé el primero en recomendar esto

Sin descargas
Visualizaciones
Visualizaciones totales
511
En SlideShare
0
De insertados
0
Número de insertados
15
Acciones
Compartido
0
Descargas
1
Comentarios
0
Recomendaciones
0
Insertados 0
No insertados

No hay notas en la diapositiva.

Creacion2.

  1. 1. Lenguajes de Programación I Asignaciones Ayud. Mezzanotte, MartínLenguajes de Programación I - Cursada 2006 - Ingeniería de Sistemas Facultad de Ciencias ExactasUniversidad Nacional del Centrode la Provincia de Buenos Aires
  2. 2. Lenguajes de Programación I Apunte: Asignaciones Lenguajes de Programación I AsignacionesObjetivos • Ejemplificar situaciones de asignación en esquemas de asignación por copia de valores. • Ejemplificar situaciones de asignación en esquemas de asignación por copia de referencias. • Analizar situaciones análogas entre asignaciones y pasajes de parámetros. • Exponer relaciones conceptuales importantes entre las asignaciones y otros temas relevantes de la materia, como por ejemplo: Administración de memoria, diferencias y similitudes entre lenguajes dinámicos orientados a objetos y lenguajes tipo Algol, entre otros.TemarioVariables • Distinción entre Valor, Referencia y Nombre.Asignaciones entre variables • Concepto: ¿Qué sucede en la sentencia “a:=b”? • Ejemplificación en lenguaje C: Orientado a asignación por copia. • Ejemplificación en lenguaje Java: Orientado a asignación por referencia. • Comparación entre ambos esquemas de asignación: o Existencia de ambos datos en asignaciones por copia. o Creación de alias y generación de garbage en asignaciones por referencia. o Similitud con los esquemas de pasajes de parámetros • Asignación por referencia explícita (Lenguaje C) e implícita (Lenguajes dinámicos orientados a objetos).Otras Asignaciones • Asignaciones con expresiones. • Asignaciones con funciones. • Asignaciones con constantes. -1-
  3. 3. Lenguajes de Programación I Apunte: AsignacionesVariables Concepto de Variable: Valor, Referencia y Nombre En primer lugar, recordaremos algunos conceptos importantes con respecto almanejo de variables. De cada variable es posible distinguir: Su valor. Es decir, el dato que se almacena en la variable. Su referencia. O sea, la dirección de memoria donde está almacenado el valor dela variable. Su nombre. Es decir, un identificador que permite referenciar en lenguaje naturaluna dirección de almacenamiento. De esta forma, podemos entender las variables como ternas de la siguiente forma: VALOR Dirección Nombre Fig. 1: Representación de una variable. Por ejemplo: void main(){ 14 int a=14; a 26h […] } EE ED -2-
  4. 4. Lenguajes de Programación I Apunte: AsignacionesAsignaciones entre variables Concepto de Asignación: ¿Qué sucede en la sentencia "a:=b”? Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje deuna sentencia de asignación: En una asignación entre dos variables, el lenguaje realiza diferentes acciones almanipular las variables del lado izquierdo y derecho de la sentencia. Con respecto allado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoriaque éste referencia, con el objetivo de almacenar el dato obtenido desde el lado derecho.Para esto, la variable del lado derecho debe sufrir una extracción de valor(Desreferencing). Veamos un ejemplo de un programa simple, codificado en lenguaje C: Ejemplo 1 void main(){ 14 int a=14; a 26h int b=10; 10 a=b; b 22h b++; EE ED printf("nEl valor de a es %d",a); printf("nEl valor de b es %d",b); } 10 a 26h 10 b 22h EE ED 10 El valor de a es 10 a 26h El valor de b es 11 11 b 22h EE ED Puede observarse la existencia de los datos, ya que la sentencia de incremento enb no tuvo ningún efecto sobre el valor de a. -3-
  5. 5. Lenguajes de Programación I Apunte: Asignaciones Veamos ahora dos ejemplos similares codificados en lenguaje Java: Ejemplo 2 public class Main { public Main() { } 14 public static void main(String[] args) { a 48h 10 int a=14; int b=10; b 40h a=b; b++; 10 JOptionPane.showMessageDialog(null, "El valor de a es "+a+ a 48h "nEl valor de b es “+b,"Asignaciones”, 10 JOptionPane.PLAIN_MESSAGE); b 40h System.exit(0); } 10 a 48h 11 b 40hº Puede observarse la existencia de los datos, ya que la sentencia de incremento enb no tuvo ningún efecto sobre el valor de a. -4-
  6. 6. Lenguajes de Programación I Apunte: Asignaciones Ejemplo 3 public class Entero { private int numero; public Entero(int n) { public void inc(){ numero=n; numero++; } } public int valor(){ public void dec(){ return numero; numero--; } } }//Fin clase Entero public class Main { Numero=14 public Main() { } a 48h 1 public static void main(String[] args) { Entero a=new Entero(14); Numero=10 Entero b=new Entero(10); b 40h 1 a=b; b.inc(); Numero=14 JOptionPane.showMessageDialog(null, a 48h 0 "El valor de a es "+a.valor()+ "nEl valor de b es Numero=10 “+b.valor(),"Asignaciones”, JOptionPane.PLAIN_MESSAGE); b 40h 2 System.exit(0); } Numero=14 GARBAGE 48h 0 COLECTOR Numero=11 b 40h 2 a En el segundo caso, cuando se utilizó objetos de tipo “Entero”, puede observarseque el comportamiento de la sentencia de asignación es diferente: en este caso no hubocopia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia deincremento de b no hubiese afectado el valor de a. -5-
  7. 7. Lenguajes de Programación I Apunte: Asignaciones Esquemas de Asignación: Asignaciones por copia y Asignaciones por referencia De los ejemplos precedentes puede concluirse que las sentencias de asignacióntienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debea que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremosa continuación. Asignaciones por copia El esquema de asignaciones entre variables por copia de valores funciona de lasiguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción delvalor almacenado en la celda de memoria. Luego, este valor es copiado en la celda dememoria correspondiente a la variable del lado izquierdo de la sentencia. Como consecuencia, la única relación entre ambos datos es que –en este punto delprograma- contienen el mismo valor en sus respectivas celdas de memoria. Ambosdatos continúan siendo entidades completamente independientes, por lo cual cualquiercambio en uno de ellos NO produce ningún efecto sobre el otro. Este esquema de asignación puede ser observado en los primeros dos ejemplos. Asignaciones por referencia El esquema de asignaciones entre variables por referencia funciona de la siguientemanera: Sobre la variable del lado derecho de la sentencia se realiza una extracción de ladirección de memoria (referencia) donde se halla almacenado su valor. Luego, estevalor de dirección es copiado en la referencia correspondiente a la variable del ladoizquierdo de la sentencia. Como consecuencia, ambos nombres de variables referencian a la mismadirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a serrealizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Estasituación es conocida como “generación de alias”. Existe otra consecuencia importante que debemos analizar: ¿Qué sucede con el dato que referenciaba originalmente la variable del ladoizquierdo de la asignación? La respuesta es simple: Si no existe ninguna otra variable que lo referencie, se convierte en un bloque dememoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación degarbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entrevariables. Este esquema de asignación puede ser observado en el ejemplo número 3. -6-
  8. 8. Lenguajes de Programación I Apunte: Asignaciones Analogía con esquemas de pasaje de parámetros Resulta claro apreciar que existe una fuerte similitud entre estos esquemas deasignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje deParámetros por Copia-Valor y Pasaje de Parámetros por Referencia, respectivamente. Asignaciones Pasaje de entre variables parámetros Pasaje de parámetros Asignaciones por copia por copia Asignaciones por Pasaje de parámetros referencia por referencia Fig. 2: Relación análoga entre pasaje de parámetros y asignaciones entre variables. Conclusiones Es posible concluir que ambos esquemas poseen beneficios y perjuicios. En elcaso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copiatambién es posible asignar referencias si así se desea. Esto debe hacerse de maneraexplícita, utilizando punteros del lado izquierdo de la sentencia y por medio deloperador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, porejemplo, incorpora un mecanismo de generación de alias a través de la definición deltipo de dato “referencia” (Ver fig. 4). Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar elesquema de asignaciones entre variables por referencia. Esto se debe a que un objeto esun dato bastante más complejo que una variable entera, pues no solo posee datos sinotambién métodos. Con lo cual, utilizar este esquema resulta más flexible. […] int a=10; int *pun; pun= &a; //Asignación de la dirección de ‘a’ en ‘pun’. […] Fig. 3: Asignación de referencias explícita en C. […] int a=10; int &ref_a=a; //Declaración e inicialización de la referencia ‘ref_a’ a ‘a’. […] Fig. 4: Declaración de un alias en C++. -7-
  9. 9. Lenguajes de Programación I Apunte: AsignacionesOtras asignaciones Asignación de una expresión o una constante En este caso, no existe distinción alguna entre asignación por copia o referenciaya que las expresiones no tienen referencias. La asignación consiste en calcular el valorde la expresión situada del lado derecho de la sentencia y almacenarlo en la celda dememoria referenciada por la variable del lado izquierdo. Por ejemplo: […] int a; a = 3 * 4; […] Fig. 5: Asignación de expresiones en C. El caso de asignación de una constante es análogo. Asignación de una función En este caso, si se asignara a la variable del lado izquierdo el puntero a la funciónubicada en el lado derecho, la variable se comportaría como un puntero a la función.Esto no es un uso común. Lo que se hace es ejecutar la función y, luego, se asigna elvalor resultado a la celda de memoria referenciada por la variable del lado izquierdo dela sentencia (Asignación por copia). Por ejemplo: […] int a; a = maximo(3,6); […] Fig. 5: Asignación del valor de una función en C. En C, por ejemplo, es posible copiar el puntero de una función pero debe hacerseen forma explícita hacia una variable de tipo puntero a función. -8-

×