stringtranslate.com

Enlace de nombre

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 enlaces de nombre-objeto como un servicio y 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 del 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 vinculante (o definitoria). En todos los demás casos (por ejemplo, en expresiones , asignaciones y llamadas a subprogramas ), un identificador representa aquello a lo que está vinculado; tales sucesos se denominan sucesos aplicados.

tiempo de encuadernació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 está vinculada dinámicamente. Tomemos, por ejemplo, el siguiente código Java :

public void foo ( java . util . Lista < Cadena > lista ) { lista . agregar ( "barra" ); }     

ListEs una interfaz , por lo que listdebe hacer referencia a un subtipo de la misma. listpuede hacer referencia a LinkedList, an ArrayListo 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 apuntada por 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.

Reunión y mutación

La nueva vinculación no debe confundirse con mutación o asignación.

Considere el siguiente código Java :

lista LinkedList <cadena> ; _ _ lista = nueva ListaEnlazada <Cadena> ( ) ; lista . agregar ( "foo" ); lista = nulo ; { ListaEnlazada <Entero> lista = nueva ListaEnlazada <Entero> ( ) ; _ _ lista . agregar ( Entero ( 2 )); }             

El identificador listestá vinculado a una variable en la primera línea; en el segundo, se asigna una referencia a un objeto (una lista enlazada de cadenas) a la variable. Luego, la lista vinculada a la que hace referencia la variable se muta y se agrega una cadena a la lista. A continuación, a la variable se le asigna la constante null. En la última línea, el identificador se reenvía para el alcance del bloque. Las operaciones dentro del bloque acceden a una nueva variable y no a la variable previamente vinculada list.

estática tardía

La vinculación estática tardía es una variante de vinculación en algún lugar entre la vinculación estática y dinámica. Considere el siguiente ejemplo de PHP :

clase  A {  public  static  $palabra  =  "hola" ;  función estática pública  hola () { print self :: $palabra ; } }      la clase  B  extiende  A {  public  static  $word  =  "adiós" ; }B :: hola ();

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

A partir de la versión 5.3 de PHP, se admite el enlace estático tardío. [3] Específicamente, si self::$wordlo anterior se cambiara a static::$wordcomo se muestra en el siguiente bloque, donde la palabra clave staticsolo estaría vinculada en tiempo de ejecución, entonces el resultado de la llamada a B::hello()sería "adiós":

clase  A {  public  static  $palabra  =  "hola" ;  función estática pública  hola () { print static :: $palabra ; } }      la clase  B  extiende  A {  public  static  $word  =  "adiós" ; }B :: hola ();

Ver también

Referencias

  1. ^ Microsoft (11 de mayo de 2007), Uso del enlace anticipado y del enlace tardío en automatización, Microsoft , consultado el 11 de mayo de 2009
  2. ^ ab Ingeniería de software y sistemas - 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 .