Vinculação de nomes (computação)

Origem: Wikipédia, a enciclopédia livre.
Ir para: navegação, pesquisa

Em linguagens de programação, vinculação de nomes (ou amarração de nomes) é a associação de objetos (dados e/ou código) com identificadores.[1] [2] [3] [4] Um identificador associado a um objeto é dito referênciar este objeto. Linguagens de máquina não tem nenhuma noção de identificadores embutida, mas vinculações nome-objeto como um serviço e notação para o programador são implementados por linguagens de programação. A vinculação está intimamente ligada com o escopo, pois o escopo determina quais nomes são vinculados a quais os objetos em um sentido lexical, bem como sobre o tempo de execução relativo.

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

Tempo de vinculação[editar | editar código-fonte]

A vinculação de nomes antes de o programa ser executado, ou seja, em tempo de compilação, é chamada de estática[5] (também chamada "antecipada" [6] ); ligações realizadas durante a execução do programa são chamadas de dinâmicas[5] ( também "tardias"[6] ou "virtuais").

Um exemplo de uma vinculação estática é uma chamada direta de função C: a função referenciada pelo identificador não pode mudar durante a execução.

Mas um exemplo de vinculação dinâmica é a resolução dinâmica (dynamic dispatch), como na chamada de um método virtual em C++. Uma vez que o tipo específico de um objeto polimórfico não é conhecido antes do tempo de execução (em geral), a função executada é vinculada dinamicamente. Tomemos, por exemplo, o seguinte código em Java:

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

É list uma referência a uma LinkedList, um ArrayList, ou algum outro subtipo de List? O método realmente referenciado por add não é conhecido até o momento da execução. Em uma linguagem como C, a função realmente referenciada é conhecida.

Vinculação em agregados de dados[editar | editar código-fonte]

A vinculação em objetos agregados de dados, como registros (records ou structs) é uma questão mais complexa. Um agregado de dados, embora vinculado a um único nome é amarrado a múltiplos locais. Os componentes individuais são objetos de dados com tipo, valor e vinculações próprias mas não são vinculados a um nome simples e sim, por um nome composto.[7]

Vinculação a múltiplos nomes[editar | editar código-fonte]

Algumas vezes é conveniente vincular múltiplos nomes a um único objeto de armazenamento. Isto é feito freqüentemente para associar um segundo tipo de dados a este objeto ou empacotar objetos logicamente independentes em um grupo para facilitar a sua manipulação.[8]

Exemplos de vinculação de múltiplos nomes são:

  • A declaração EQUIVALENCE da linguagem Fortran
  • O tipo União na linguagem C
  • A cláusula REDEFINES da linguagem COBOL

Revinculação e mutação[editar | editar código-fonte]

Revinculação não deve ser confundido com mutação - "revinculação" é uma alteração no identificador referenciado; "mutação" é uma mudança para o valor referenciado. Considere o seguinte código Java:

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

O identificador list inicialmente não referencia nada (estão não inicializado); É então revinculado para referenciar a um objeto (uma lista ligada de strings - "LinkedList"). A LinkedList (lista ligada) referenciada por list então é mutada, adicionando-se uma string para a lista. Finalmente, list é revinculada para null.

Vinculação estática tardia[editar | editar código-fonte]

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

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

Neste exemplo, o interpretador PHP liga a função hello() a uma classe A, e assim a chamada B::hello() produz a string "hello". Se a semântica de "self::$word" tivesse sido baseada em uma "vinculação estática tardia", então o resultado teria sido "bye".

A partir da versão 5.3 do PHP, a vinculação estática tardia passou a ser suportada [9] . Especificamente, se "self::$word" no exemplo acima for alteradas para "static::$word", como mostrado no bloco seguinte, o resultado da chamada para B::hello() seria "bye":

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

Referências

  1. Microsoft (2007-05-11). Using early binding and late binding in Automation (html). "Microsoft Support and Help" em Microsoft Help.
  2. Sebesta, Robert W.. Concepts of Programming Languages (em inglês). 7ª ed. Boston: Addison Wesley, 2006. 212-213 pp. ISBN 0-321-33025-0
  3. GUEZZI, Carlo; JAZAYERI, Mehdi. Programming Languages Concepts (em inglês). 3ª ed. New York: John Wiley & Sons, 1998. 49-50 pp. ISBN 0-471-10426-4
  4. TUCKER, Allen; NOONAN, Robert. Programming Languages: Principles and Paradigms (em inglês). 4ª ed. Boston: McGraw-Hill, 2002. 13-14 pp. ISBN 0-07-238111-6
  5. a b SCOTT, Michael L.. Programming Languages Pragmatics (em inglês). 1 ed. San Francisco: Morgan Kaufmann/Academic Press, 2000. 64 pp. ISBN 1-55860-442-1
  6. a b PRATT, Terrence W.; ZELKOWITZ, Marvin V.. Programming Languages: Design and Implementation (em inglês). 4ª ed. Upper Saddle River, New Jersey: Prentice hall, 2001. 64 pp. ISBN 0-13-027678-2
  7. Dershem, Herbert L.; Jipping, Michael J.. Programming Languages: Structures and models (em inglês). 2 ed. Boston: PWS Publishing Company, 1995. 432 pp. p. 54. ISBN 0-534-94740-9
  8. FISCHER, Alice E.; GRODZINSKY, Frances. The Anatomy of Programming Languages (em inglês). Englewood Cliffs, New Jersey: Prentice Hall, 1993. 174 pp. ISBN 0-13-035155-5
  9. vinculação estática tardia