Vinculação de nome - Name binding

Em linguagens de programação , a vinculação de nomes é a associação de entidades (dados e / ou código) com identificadores . Diz-se que um identificador vinculado a um objeto faz referência a esse objeto. As linguagens de máquina não têm nenhuma noção embutida de identificadores, mas as ligações nome-objeto como um serviço e notação para o programador são implementadas por linguagens de programação. A vinculação está intimamente ligada ao escopo , pois o escopo determina quais nomes se ligam a quais objetos - em quais locais no código do programa ( lexicamente ) e em qual dos caminhos de execução possíveis ( temporariamente ).

O uso de um identificador idem um contexto que estabelece uma ligação para idé chamado de ocorrência de ligação (ou definição). Em todas as outras ocorrências (por exemplo, em expressões, atribuições e chamadas de subprograma), um identificador representa a que está vinculado; tais ocorrências são chamadas de ocorrências aplicadas.

Tempo de encadernação

  • A vinculação estática (ou vinculação inicial ) é a vinculação de nome executada antes de o programa ser executado.
  • Ligação dinâmica (ou ligação tardia ou de ligação virtual ) é o nome de ligação realizado como o programa está sendo executado.

Um exemplo de ligação estática é uma chamada direta de função C : a função referenciada pelo identificador não pode ser alterada em tempo de execução.

Mas um exemplo de vinculação dinâmica é o despacho dinâmico , como em uma chamada de método virtual C ++ . Como o tipo específico de um objeto polimórfico não é conhecido antes do tempo de execução (em geral), a função executada é dinamicamente vinculada. Veja, por exemplo, o seguinte código Java :

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

Listé uma interface , portanto, listdeve se referir a um subtipo dela. É uma referência a um LinkedList, um ArrayListou algum outro subtipo de List? O método real referenciado por addnão é conhecido até o tempo de execução. Em C, tal instância de vinculação dinâmica pode ser uma chamada para uma função apontada por uma variável ou expressão de um tipo de ponteiro de função cujo valor é desconhecido até que seja realmente avaliado em tempo de execução.

Religação e mutação

A religação não deve ser confundida com mutação.

  • A religação é uma mudança no identificador de referência .
  • Mutação é uma mudança na entidade referenciada .

Considere o seguinte código Java :

LinkedList<String> list;
list = new LinkedList<String>();
list.add("foo");
list = null;

O identificador listinicialmente não faz referência a nada (não foi inicializado ); é então religado para fazer referência a um objeto (uma lista vinculada de strings). A lista vinculada referenciada por listé então modificada, adicionando uma string à lista. Por último, listé rebote para null.

Estática tardia

A vinculação estática tardia é uma variante da vinculação em algum lugar entre a vinculação estática e dinâmica. Considere o seguinte exemplo de PHP :

class A
{
    public static $word = "hello";
    public static function hello() { print self::$word; }
}

class B extends A
{
    public static $word = "bye";
}

B::hello();

Neste exemplo, o interpretador PHP vincula a palavra-chave selfdentro A::hello()de classe Ae, portanto, a chamada para B::hello()produz a string "hello". Se a semântica de self::$wordtivesse sido baseada em vinculação estática tardia, o resultado teria sido "tchau".

A partir do PHP versão 5.3, a vinculação estática tardia é suportada. Especificamente, se self::$wordno item anterior fosse alterado para static::$wordconforme mostrado no bloco a seguir, onde a palavra-chave staticseria associada apenas em tempo de execução, o resultado da chamada para B::hello()seria "tchau":

class A
{
    public static $word = "hello";
    public static function hello() { print static::$word; }
}

class B extends A
{
    public static $word = "bye";
}

B::hello();

Veja também

Referências