stringtranslate.com

Vinculación de nombres

En los lenguajes de programación , la vinculación de nombres es la asociación de entidades (datos y/o código) con identificadores . [1] Se dice que un identificador vinculado a un objeto hace referencia a ese objeto. Los lenguajes de máquina no tienen una noción incorporada de identificadores, pero los lenguajes de programación implementan vinculaciones de nombre-objeto como un servicio y una notación para el programador. La vinculación está íntimamente relacionada con el alcance , ya que el alcance determina qué nombres se vinculan a qué objetos, en qué ubicaciones en el código del programa ( léxicamente ) y en cuál de las posibles rutas de ejecución ( temporalmente ).

El uso de un identificador id en un contexto que establece un enlace para id se denomina ocurrencia de enlace (o de definición). En todas las demás ocurrencias (por ejemplo, en expresiones , asignaciones y llamadas de subprogramas ), un identificador representa aquello a lo que está enlazado; dichas ocurrencias se denominan ocurrencias aplicadas.

Tiempo de unión

Un ejemplo de enlace estático es una llamada directa a una función C : la función a la que hace referencia el identificador no puede cambiar en tiempo de ejecución.

Un ejemplo de enlace dinámico es el envío dinámico , como en una llamada a un método virtual de C++ . Dado que el tipo específico de un objeto polimórfico no se conoce antes del tiempo de ejecución (en general), la función ejecutada se enlaza dinámicamente. Tomemos, por ejemplo, el siguiente código Java :

public void foo ( java.util.List < String > lista ) { lista.add ( " bar " ) ; }     

Listes una interfaz , por lo que listdebe hacer referencia a un subtipo de la misma. listpuede hacer referencia a un LinkedList, un ArrayList, o algún otro subtipo de List. El método al que hace referencia addno se conoce hasta el tiempo de ejecución. En C, que no tiene enlace dinámico, se puede lograr un objetivo similar mediante una llamada a una función a la que apunta una variable o expresión de un tipo de puntero de función , cuyo valor se desconoce hasta que se evalúa en tiempo de ejecución.

Reenlace y mutación

La revinculación no debe confundirse con la mutación o la asignación.

Considere el siguiente código Java :

LinkedList < String > lista ; lista = new LinkedList < String > (); lista.add ( " foo" ) ; lista = null ; { LinkedList < Integer > lista = new LinkedList < Integer > ( ); lista.add ( Integer ( 2 ) ); }             

El identificador listse vincula a una variable en la primera línea; en la segunda, se asigna un objeto (una lista enlazada de cadenas) a la variable. Luego, se modifica la lista enlazada a la que hace referencia la variable, agregando una cadena a la lista. A continuación, se asigna a la variable la constante null. En la última línea, se vuelve a vincular el identificador para el ámbito del bloque. Las operaciones dentro del bloque acceden a una nueva variable y no a la variable previamente vinculada a list.

Estática tardía

La vinculación estática tardía es una variante de la vinculación que se encuentra entre la vinculación estática y la dinámica. Considere el siguiente ejemplo de PHP :

clase  A {  public  static  $word  =  "hola" ;  public  static  function  hola ()  {  print  self :: $word ;  } }la clase  B  extiende  A {  public  static  $word  =  "adiós" ; }B :: hola ();

En este ejemplo, el intérprete PHP vincula la palabra clave selfdentro A::hello()de la clase Ay, por lo tanto, la llamada a B::hello()produce la cadena "hola". Si la semántica de self::$wordse hubiera basado en la vinculación estática tardía, el resultado habría sido "adiós".

A partir de la versión 5.3 de PHP, se admite la vinculación estática tardía. [3] Específicamente, si self::$worden lo anterior se cambiara a static::$wordcomo se muestra en el siguiente bloque, donde la palabra clave staticsolo se vincularía en tiempo de ejecución, entonces el resultado de la llamada a B::hello()sería "bye":

clase  A {  public  static  $word  =  "hola" ;  public  static  function  hola ()  {  print  static :: $word ;  } }la clase  B  extiende  A {  public  static  $word  =  "adiós" ; }B :: hola ();

Véase también

Referencias

  1. ^ Microsoft (11 de mayo de 2007), Uso de enlace temprano y enlace tardío en automatización, Microsoft , consultado el 11 de mayo de 2009
  2. ^ ab Ingeniería de sistemas y software — Vocabulario ISO/IEC/IEEE 24765:2010(E) , IEEE, 15 de diciembre de 2010
  3. ^ "Enlaces estáticos tardíos" . Consultado el 3 de julio de 2013 .