SlideShare una empresa de Scribd logo
1 de 9
Descargar para leer sin conexión
Lenguajes de Programación I

                                  Asignaciones
                                             Ayud. Mezzanotte, Martín




Lenguajes de Programación I
       - Cursada 2006 -
    Ingeniería de Sistemas




 Facultad de Ciencias Exactas
Universidad Nacional del Centro
de la Provincia de Buenos Aires
Lenguajes de Programación I
                                                                 Apunte: Asignaciones



                      Lenguajes de Programación I
                               Asignaciones


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


Temario
Variables
  •   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-
Lenguajes de Programación I
                                                                          Apunte: Asignaciones




Variables

                                Concepto de Variable:
                             Valor, Referencia y Nombre


      En primer lugar, recordaremos algunos conceptos importantes con respecto al
manejo 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 de
la variable.
      Su nombre. Es decir, un identificador que permite referenciar en lenguaje natural
una 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-
Lenguajes de Programación I
                                                                       Apunte: Asignaciones



Asignaciones entre variables

                              Concepto de Asignación:
                        ¿Qué sucede en la sentencia "a:=b”?

      Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje de
una sentencia de asignación:
      En una asignación entre dos variables, el lenguaje realiza diferentes acciones al
manipular las variables del lado izquierdo y derecho de la sentencia. Con respecto al
lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria
que é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 en
b no tuvo ningún efecto sobre el valor de a.




                                            -3-
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 en
b no tuvo ningún efecto sobre el valor de a.




                                            -4-
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 observarse
que el comportamiento de la sentencia de asignación es diferente: en este caso no hubo
copia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia de
incremento de b no hubiese afectado el valor de a.



                                               -5-
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ón
tienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debe
a que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremos
a continuación.

     Asignaciones por copia

      El esquema de asignaciones entre variables por copia de valores funciona de la
siguiente manera:
      Sobre la variable del lado derecho de la sentencia se realiza una extracción del
valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de
memoria correspondiente a la variable del lado izquierdo de la sentencia.
      Como consecuencia, la única relación entre ambos datos es que –en este punto del
programa- contienen el mismo valor en sus respectivas celdas de memoria. Ambos
datos continúan siendo entidades completamente independientes, por lo cual cualquier
cambio 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 siguiente
manera:
      Sobre la variable del lado derecho de la sentencia se realiza una extracción de la
dirección de memoria (referencia) donde se halla almacenado su valor. Luego, este
valor de dirección es copiado en la referencia correspondiente a la variable del lado
izquierdo de la sentencia.
      Como consecuencia, ambos nombres de variables referencian a la misma
dirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a ser
realizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Esta
situació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 lado
izquierdo de la asignación? La respuesta es simple:
      Si no existe ninguna otra variable que lo referencie, se convierte en un bloque de
memoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación de
garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre
variables.
      Este esquema de asignación puede ser observado en el ejemplo número 3.




                                           -6-
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 de
asignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje de
Pará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 el
caso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copia
también es posible asignar referencias si así se desea. Esto debe hacerse de manera
explícita, utilizando punteros del lado izquierdo de la sentencia y por medio del
operador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, por
ejemplo, incorpora un mecanismo de generación de alias a través de la definición del
tipo de dato “referencia” (Ver fig. 4).
      Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar el
esquema de asignaciones entre variables por referencia. Esto se debe a que un objeto es
un dato bastante más complejo que una variable entera, pues no solo posee datos sino
tambié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-
Lenguajes de Programación I
                                                                          Apunte: Asignaciones



Otras asignaciones


                    Asignación de una expresión o una constante

      En este caso, no existe distinción alguna entre asignación por copia o referencia
ya que las expresiones no tienen referencias. La asignación consiste en calcular el valor
de la expresión situada del lado derecho de la sentencia y almacenarlo en la celda de
memoria 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ón
ubicada 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 el
valor resultado a la celda de memoria referenciada por la variable del lado izquierdo de
la 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 hacerse
en forma explícita hacia una variable de tipo puntero a función.




                                             -8-

Más contenido relacionado

Destacado

Representación gráfica de los algoritmos.
Representación gráfica de los algoritmos. Representación gráfica de los algoritmos.
Representación gráfica de los algoritmos. yoly1parra1
 
Introducción a los tipos de datos
Introducción a los tipos de datosIntroducción a los tipos de datos
Introducción a los tipos de datosCarlos Pes
 
Estructuras de decisión o selectivas
Estructuras de decisión o selectivasEstructuras de decisión o selectivas
Estructuras de decisión o selectivasDenisse C
 
Asignación, Salida y Entrada
Asignación, Salida y EntradaAsignación, Salida y Entrada
Asignación, Salida y EntradaCarlos Pes
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasCarlos Pes
 
Tipos de datos definidos por el programador
Tipos de datos definidos por el programadorTipos de datos definidos por el programador
Tipos de datos definidos por el programadorCarlos Pes
 
Estructuras de control en Java
Estructuras de control en JavaEstructuras de control en Java
Estructuras de control en Javaquesada_diego
 
Conectivos logicos
Conectivos logicosConectivos logicos
Conectivos logicosEdward Solis
 
Identificadores, variables y constantes
Identificadores, variables y constantesIdentificadores, variables y constantes
Identificadores, variables y constantesCarlos Pes
 
Agua fria y caliente 2011 araujo 11 04
Agua fria y caliente 2011 araujo 11 04Agua fria y caliente 2011 araujo 11 04
Agua fria y caliente 2011 araujo 11 04alujesflorencia
 
Variables y tipos de datos - fundamentos de la programación
Variables y tipos de datos -  fundamentos de la programaciónVariables y tipos de datos -  fundamentos de la programación
Variables y tipos de datos - fundamentos de la programaciónDesarrolloWeb.com
 
C.2. instalaciones sanitarias en edificios en altura (fc)
C.2.  instalaciones sanitarias en edificios en altura (fc)C.2.  instalaciones sanitarias en edificios en altura (fc)
C.2. instalaciones sanitarias en edificios en altura (fc)M Angel Luna O
 
Ejemplos de Algoritmos
Ejemplos de AlgoritmosEjemplos de Algoritmos
Ejemplos de AlgoritmosPepe Xdsasda
 

Destacado (18)

Funciones de entrada y salida
Funciones de entrada y salidaFunciones de entrada y salida
Funciones de entrada y salida
 
Representación gráfica de los algoritmos.
Representación gráfica de los algoritmos. Representación gráfica de los algoritmos.
Representación gráfica de los algoritmos.
 
Introducción a los tipos de datos
Introducción a los tipos de datosIntroducción a los tipos de datos
Introducción a los tipos de datos
 
Estructuras de decisión o selectivas
Estructuras de decisión o selectivasEstructuras de decisión o selectivas
Estructuras de decisión o selectivas
 
Asignación, Salida y Entrada
Asignación, Salida y EntradaAsignación, Salida y Entrada
Asignación, Salida y Entrada
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Tipos de datos definidos por el programador
Tipos de datos definidos por el programadorTipos de datos definidos por el programador
Tipos de datos definidos por el programador
 
Estructuras de control en Java
Estructuras de control en JavaEstructuras de control en Java
Estructuras de control en Java
 
Conectivos logicos
Conectivos logicosConectivos logicos
Conectivos logicos
 
Ciclos
CiclosCiclos
Ciclos
 
Identificadores, variables y constantes
Identificadores, variables y constantesIdentificadores, variables y constantes
Identificadores, variables y constantes
 
LibreríAs De Java
LibreríAs De JavaLibreríAs De Java
LibreríAs De Java
 
Agua fria y caliente 2011 araujo 11 04
Agua fria y caliente 2011 araujo 11 04Agua fria y caliente 2011 araujo 11 04
Agua fria y caliente 2011 araujo 11 04
 
Variables y tipos de datos - fundamentos de la programación
Variables y tipos de datos -  fundamentos de la programaciónVariables y tipos de datos -  fundamentos de la programación
Variables y tipos de datos - fundamentos de la programación
 
C.2. instalaciones sanitarias en edificios en altura (fc)
C.2.  instalaciones sanitarias en edificios en altura (fc)C.2.  instalaciones sanitarias en edificios en altura (fc)
C.2. instalaciones sanitarias en edificios en altura (fc)
 
Contadores y Acumuladores
Contadores y AcumuladoresContadores y Acumuladores
Contadores y Acumuladores
 
Pilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datosPilas, colas, y listas estructura de datos
Pilas, colas, y listas estructura de datos
 
Ejemplos de Algoritmos
Ejemplos de AlgoritmosEjemplos de Algoritmos
Ejemplos de Algoritmos
 

Similar a Asignaciones en java

Portafolio
PortafolioPortafolio
Portafoliomaggyyy
 
Portafolio
PortafolioPortafolio
Portafoliomaggyyy
 
Clipping Terra 10/11/11 @ IED Barcelona
Clipping Terra 10/11/11 @ IED BarcelonaClipping Terra 10/11/11 @ IED Barcelona
Clipping Terra 10/11/11 @ IED BarcelonaIED Barcelona
 
Derivada de una función
Derivada de una funciónDerivada de una función
Derivada de una funciónAmparo Salazar
 
Clipping EL Economista 10/11/11 @ IED Barcelona
Clipping EL Economista 10/11/11 @ IED BarcelonaClipping EL Economista 10/11/11 @ IED Barcelona
Clipping EL Economista 10/11/11 @ IED BarcelonaIED Barcelona
 
Clipping Noticias.com 10/11/11 @ IED Barcelona
Clipping Noticias.com 10/11/11 @ IED BarcelonaClipping Noticias.com 10/11/11 @ IED Barcelona
Clipping Noticias.com 10/11/11 @ IED BarcelonaIED Barcelona
 
Clipping Mujer.es 10/11/11 @ IED Barcelona
Clipping Mujer.es 10/11/11 @ IED BarcelonaClipping Mujer.es 10/11/11 @ IED Barcelona
Clipping Mujer.es 10/11/11 @ IED BarcelonaIED Barcelona
 
Clipping Viste la Calle 18/11/11 @ IED Barcelona
Clipping Viste la Calle 18/11/11 @ IED BarcelonaClipping Viste la Calle 18/11/11 @ IED Barcelona
Clipping Viste la Calle 18/11/11 @ IED BarcelonaIED Barcelona
 
Clipping Adn.es 10/11/11 @ IED Barcelona
Clipping Adn.es 10/11/11 @ IED BarcelonaClipping Adn.es 10/11/11 @ IED Barcelona
Clipping Adn.es 10/11/11 @ IED BarcelonaIED Barcelona
 
Clipping Ajuntament 10/11/11 @ IED Barcelona
Clipping Ajuntament 10/11/11 @ IED BarcelonaClipping Ajuntament 10/11/11 @ IED Barcelona
Clipping Ajuntament 10/11/11 @ IED BarcelonaIED Barcelona
 
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...EOI Escuela de Organización Industrial
 
Correccion del examen de m
Correccion del examen de mCorreccion del examen de m
Correccion del examen de mdomynicjorge
 
Guia semejanza triangulos
Guia semejanza triangulosGuia semejanza triangulos
Guia semejanza trianguloslilipeque
 
Guia semejanza triangulos
Guia semejanza triangulosGuia semejanza triangulos
Guia semejanza trianguloslilipeque
 
Elementos de la Composición
Elementos de la ComposiciónElementos de la Composición
Elementos de la Composiciónanacida
 
Clipping Europapress 10/11/11 @ IED Barcelona
Clipping Europapress 10/11/11 @ IED BarcelonaClipping Europapress 10/11/11 @ IED Barcelona
Clipping Europapress 10/11/11 @ IED BarcelonaIED Barcelona
 
Clipping El Observador Solitario 14/11/11 @ IED Barcelona
Clipping El Observador Solitario 14/11/11 @ IED BarcelonaClipping El Observador Solitario 14/11/11 @ IED Barcelona
Clipping El Observador Solitario 14/11/11 @ IED BarcelonaIED Barcelona
 

Similar a Asignaciones en java (20)

Portafolio
PortafolioPortafolio
Portafolio
 
Portafolio
PortafolioPortafolio
Portafolio
 
Clipping Terra 10/11/11 @ IED Barcelona
Clipping Terra 10/11/11 @ IED BarcelonaClipping Terra 10/11/11 @ IED Barcelona
Clipping Terra 10/11/11 @ IED Barcelona
 
Derivada de una función
Derivada de una funciónDerivada de una función
Derivada de una función
 
Clipping EL Economista 10/11/11 @ IED Barcelona
Clipping EL Economista 10/11/11 @ IED BarcelonaClipping EL Economista 10/11/11 @ IED Barcelona
Clipping EL Economista 10/11/11 @ IED Barcelona
 
Clipping Noticias.com 10/11/11 @ IED Barcelona
Clipping Noticias.com 10/11/11 @ IED BarcelonaClipping Noticias.com 10/11/11 @ IED Barcelona
Clipping Noticias.com 10/11/11 @ IED Barcelona
 
Clipping Mujer.es 10/11/11 @ IED Barcelona
Clipping Mujer.es 10/11/11 @ IED BarcelonaClipping Mujer.es 10/11/11 @ IED Barcelona
Clipping Mujer.es 10/11/11 @ IED Barcelona
 
8 4
8 48 4
8 4
 
Clipping Viste la Calle 18/11/11 @ IED Barcelona
Clipping Viste la Calle 18/11/11 @ IED BarcelonaClipping Viste la Calle 18/11/11 @ IED Barcelona
Clipping Viste la Calle 18/11/11 @ IED Barcelona
 
Clipping Adn.es 10/11/11 @ IED Barcelona
Clipping Adn.es 10/11/11 @ IED BarcelonaClipping Adn.es 10/11/11 @ IED Barcelona
Clipping Adn.es 10/11/11 @ IED Barcelona
 
Clipping Ajuntament 10/11/11 @ IED Barcelona
Clipping Ajuntament 10/11/11 @ IED BarcelonaClipping Ajuntament 10/11/11 @ IED Barcelona
Clipping Ajuntament 10/11/11 @ IED Barcelona
 
Deber
DeberDeber
Deber
 
Datawarehouse
DatawarehouseDatawarehouse
Datawarehouse
 
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...
Luis Imaz. Límites a la integración de energías renovables en el sistema eléc...
 
Correccion del examen de m
Correccion del examen de mCorreccion del examen de m
Correccion del examen de m
 
Guia semejanza triangulos
Guia semejanza triangulosGuia semejanza triangulos
Guia semejanza triangulos
 
Guia semejanza triangulos
Guia semejanza triangulosGuia semejanza triangulos
Guia semejanza triangulos
 
Elementos de la Composición
Elementos de la ComposiciónElementos de la Composición
Elementos de la Composición
 
Clipping Europapress 10/11/11 @ IED Barcelona
Clipping Europapress 10/11/11 @ IED BarcelonaClipping Europapress 10/11/11 @ IED Barcelona
Clipping Europapress 10/11/11 @ IED Barcelona
 
Clipping El Observador Solitario 14/11/11 @ IED Barcelona
Clipping El Observador Solitario 14/11/11 @ IED BarcelonaClipping El Observador Solitario 14/11/11 @ IED Barcelona
Clipping El Observador Solitario 14/11/11 @ IED Barcelona
 

Asignaciones en java

  • 1. Lenguajes de Programación I Asignaciones Ayud. Mezzanotte, Martín Lenguajes de Programación I - Cursada 2006 - Ingeniería de Sistemas Facultad de Ciencias Exactas Universidad Nacional del Centro de la Provincia de Buenos Aires
  • 2. Lenguajes de Programación I Apunte: Asignaciones Lenguajes de Programación I Asignaciones Objetivos • 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. Temario Variables • 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. Lenguajes de Programación I Apunte: Asignaciones Variables Concepto de Variable: Valor, Referencia y Nombre En primer lugar, recordaremos algunos conceptos importantes con respecto al manejo 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 de la variable. Su nombre. Es decir, un identificador que permite referenciar en lenguaje natural una 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. Lenguajes de Programación I Apunte: Asignaciones Asignaciones entre variables Concepto de Asignación: ¿Qué sucede en la sentencia "a:=b”? Es importante entender correctamente qué tratamiento lleva a cabo el lenguaje de una sentencia de asignación: En una asignación entre dos variables, el lenguaje realiza diferentes acciones al manipular las variables del lado izquierdo y derecho de la sentencia. Con respecto al lado izquierdo, se utiliza el nombre de la variable para acceder a la celda de la memoria que é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 en b no tuvo ningún efecto sobre el valor de a. -3-
  • 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 en b no tuvo ningún efecto sobre el valor de a. -4-
  • 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 observarse que el comportamiento de la sentencia de asignación es diferente: en este caso no hubo copia del valor de la variable sino de su referencia, ya que de lo contrario la sentencia de incremento de b no hubiese afectado el valor de a. -5-
  • 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ón tienen una semántica diferente entre los primeros dos ejemplos y el tercero. Esto se debe a que el mecanismo de asignación en cada caso es distinto. Punto que profundizaremos a continuación. Asignaciones por copia El esquema de asignaciones entre variables por copia de valores funciona de la siguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción del valor almacenado en la celda de memoria. Luego, este valor es copiado en la celda de memoria correspondiente a la variable del lado izquierdo de la sentencia. Como consecuencia, la única relación entre ambos datos es que –en este punto del programa- contienen el mismo valor en sus respectivas celdas de memoria. Ambos datos continúan siendo entidades completamente independientes, por lo cual cualquier cambio 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 siguiente manera: Sobre la variable del lado derecho de la sentencia se realiza una extracción de la dirección de memoria (referencia) donde se halla almacenado su valor. Luego, este valor de dirección es copiado en la referencia correspondiente a la variable del lado izquierdo de la sentencia. Como consecuencia, ambos nombres de variables referencian a la misma dirección de memoria y, por ende, al mismo dato. Con lo cual, cualquier cambio a ser realizado a este dato puede efectuarse por medio de cualquiera de los dos nombres. Esta situació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 lado izquierdo de la asignación? La respuesta es simple: Si no existe ninguna otra variable que lo referencie, se convierte en un bloque de memoria utilizado pero inaccesible, es decir “garbage”. Por lo tanto, la generación de garbage es un riesgo que se corre cuando se utiliza este esquema de asignaciones entre variables. Este esquema de asignación puede ser observado en el ejemplo número 3. -6-
  • 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 de asignaciones entre variables y dos tipos de pasajes de parámetros. A saber: Pasaje de Pará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 el caso del lenguaje C que, como vimos, utiliza un esquema de asignaciones por copia también es posible asignar referencias si así se desea. Esto debe hacerse de manera explícita, utilizando punteros del lado izquierdo de la sentencia y por medio del operador de extracción de referencias (&) en el lado derecho (Ver fig. 3). C++, por ejemplo, incorpora un mecanismo de generación de alias a través de la definición del tipo de dato “referencia” (Ver fig. 4). Generalmente, los lenguajes dinámicos orientados a objetos tienden a utilizar el esquema de asignaciones entre variables por referencia. Esto se debe a que un objeto es un dato bastante más complejo que una variable entera, pues no solo posee datos sino tambié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. Lenguajes de Programación I Apunte: Asignaciones Otras asignaciones Asignación de una expresión o una constante En este caso, no existe distinción alguna entre asignación por copia o referencia ya que las expresiones no tienen referencias. La asignación consiste en calcular el valor de la expresión situada del lado derecho de la sentencia y almacenarlo en la celda de memoria 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ón ubicada 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 el valor resultado a la celda de memoria referenciada por la variable del lado izquierdo de la 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 hacerse en forma explícita hacia una variable de tipo puntero a función. -8-