Liaison de nom - Name binding

Dans les langages de programmation , la liaison de nom est l'association d'entités (données et/ou code) à des identifiants . On dit qu'un identifiant lié à un objet fait référence à cet objet. Les langages machine n'ont pas de notion intégrée d'identifiants, mais les liaisons nom-objet en tant que service et notation pour le programmeur sont implémentées par les langages de programmation. La liaison est intimement liée à la portée , car la portée détermine quels noms se lient à quels objets - à quels emplacements dans le code du programme ( lexicalement ) et dans quel chemin d'exécution possible ( temporellement ).

L'utilisation d'un identifiant iddans un contexte qui établit une liaison pour idest appelée occurrence de liaison (ou de définition). Dans toutes les autres occurrences (par exemple, dans les expressions, les affectations et les appels de sous-programme), un identificateur représente ce à quoi il est lié ; de telles occurrences sont appelées occurrences appliquées.

Temps de reliure

  • La liaison statique (ou early binding ) est une liaison de nom effectuée avant l'exécution du programme.
  • Liaison dynamique (ou la liaison tardive ou la liaison virtuelle ) est le nom de liaison réalisé que le programme est en cours.

Un exemple de liaison statique est un appel direct de fonction C : la fonction référencée par l'identifiant ne peut pas changer à l'exécution.

Mais un exemple de liaison dynamique est la répartition dynamique , comme dans un appel de méthode virtuelle C++ . Étant donné que le type spécifique d'un objet polymorphe n'est pas connu avant l'exécution (en général), la fonction exécutée est liée dynamiquement. Prenons, par exemple, le code Java suivant :

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

Listest une interface , listdoit donc faire référence à un sous - type de celle-ci. Est-ce une référence à un LinkedList, un ArrayList, ou un autre sous - type de List? La méthode réelle référencée par addn'est pas connue avant l'exécution. En C, une telle instance de liaison dynamique peut être un appel à une fonction pointée par une variable ou une expression d'un type de pointeur de fonction dont la valeur est inconnue jusqu'à ce qu'elle soit réellement évaluée au moment de l'exécution.

Reliure et mutation

La reliure ne doit pas être confondue avec la mutation.

  • La reliure est une modification de l' identifiant de référencement .
  • La mutation est une modification de l' entité référencée .

Considérez le code Java suivant :

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

L'identifiant listne référence initialement rien (il n'est pas initialisé ) ; il est ensuite rebondi pour référencer un objet (une liste chaînée de chaînes). La liste chaînée référencée par listest ensuite mutée, ajoutant une chaîne à la liste. Enfin, listest le rebond à null.

Statique tardive

La liaison statique tardive est une variante de la liaison quelque part entre la liaison statique et dynamique. Prenons l' exemple PHP suivant :

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

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

B::hello();

Dans cet exemple, l'interpréteur PHP lie le mot-clé selfinside A::hello()à class A, et donc l'appel à B::hello()produit la chaîne "hello". Si la sémantique de self::$wordavait été basée sur une liaison statique tardive, le résultat aurait été « bye ».

Depuis la version 5.3 de PHP, la liaison statique tardive est prise en charge. Plus précisément, si self::$worddans ce qui précède était modifié static::$wordcomme indiqué dans le bloc suivant, où le mot-clé staticne serait lié qu'à l'exécution, le résultat de l'appel à B::hello()serait "bye":

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

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

B::hello();

Voir également

Les références