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.
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" ); }
List
Es una interfaz , por lo que list
debe hacer referencia a un subtipo de la misma. list
puede hacer referencia a LinkedList
, an ArrayList
o algún otro subtipo de List
. El método al que hace referencia add
no 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.
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 list
está 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
.
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 self
interna A::hello()
a class A
y, por lo tanto, la llamada B::hello()
produce la cadena "hola". Si la semántica de self::$word
se 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::$word
lo anterior se cambiara a static::$word
como se muestra en el siguiente bloque, donde la palabra clave static
solo 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 ();