Avant d'exécuter un programme, on doit établir le lien entre chaque identificateur rencontré et sa valeur (ou son code): il s'agit du problème de la liaison d'identificateurs. Si le lien est établit au moment de la compilation on parle de liaison statique (ou précoce, early-binding), et lorsqu'il est retardé jusqu'à l'exécution du programme on parle de liaison tardive (ou dynamique, late-binding). Dans les dialectes ML (et dans une grande majorité de langages) la liaison des identificateurs est statique. Dans les dialectes Lisp, celle-ci est dynamique. Considérons l'exemple suivant en ML:
# let x = 3;; val x : int = 3 # let f (y) = x+y;; val f : int -> int = <fun> f (2);; - : int = 5 let x = 7;; val x : int = 7 f (2) - : int = 5
L'identificateur x dans le corps de f est lié
statiquement à la valeur de x au moment de la définition
de f, c.a.d., à la valeur 3. La redéfinition ultérieure de x
ne change pas le comportément
de f.
Dans les langages à objets, la liaison tardive concerne le lien entre
une méthode et son code:
un même identificateur de méthode peut être
lié à un code différent au sein de chaque objet,
et ainsi, c'est seulement à travers l'objet receveur qu'il est
possible d'activer le code appropié.
Dans les langages objet, la liaison retardée est un moyen de plus au service de la re-utilisation. Comme nous l'avon vu, re-utilisation et polymorphisme des objets sont intimement liés. Nous retrouverons ces notions dans les deux cas étudiés par la suite. Ils correspondent aux deux schémas typiques de re-utilisation via la liaison tardive.