Décoration de nom

En construction de compilateur, la signature (aussi appelée décoration de nom) est une technique utilisée pour résoudre divers problèmes de résolution de noms uniques des entités informatiques avec plusieurs langages de programmation modernes.

Cette technique fournit un moyen d'encoder des informations supplémentaires dans le nom d'une structure, d'une classe ou d'un autre type de donnée afin que les compilateurs puissent communiquer davantage d'informations sémantiques aux lieurs.

Cette technique est utile lorsque le langage de programmation permet à différentes entités d'utiliser le même identifiant tant qu'ils occupent différents espaces de noms (un espace de noms est typiquement défini par un module, une classe ou une instruction explicite de déclaration d'espace de noms) ou qu'ils ont des signatures différentes (par exemple. avec la surcharge de fonction). Cette utilisation est nécessaire parce que chaque signature peut exiger une convention d'appel spécialisée dans le code machine.

Tout code objet produit par un compilateur est lié avec d'autres codes objets (produits par le même compilateur ou par un autre) par un programme appelé lieur (ou éditeur de liens) qui a besoin de nombreuses informations concernant chaque entité. Par exemple, pour lier correctement une routine, il faut son identifiant (nom) le nombre d'arguments, leurs types, etc.

Les langages de programmation simples des années 1970 (par exemple, le langage C) distinguent seulement les bouts de code par leur identifiant, ignorant les autres informations tels que les types des paramètres et le type de la valeur retournée. Les langage de programmation  plus récents (par exemple, le langage C++) définissent des exigences plus strictes pour les bouts de code afin de les considérer équivalents, tels que les types des paramètres, le type de la valeur retournée et la convention d'appel de la routine. Ces exigences permettent la surcharge de routine aussi bien que la détection de divers bogue (tel l'utilisation de différentes définitions de routine pour compiler différents fichiers sources). Ces exigences plus strictes doivent fonctionner avec les outils et les conventions existants, ce qui implique que les exigences supplémentaires doivent être encodées dans le nom du symbole puisque c'est la seule information qu'un lieur traditionnel dispose concernant un symbole. Cette façon d'encoder des informations supplémentaires dans l'identifiant, souvent appelée « obsession primaire », considéré comme un anti-modèle, a tout de même été établi comme la norme.

La décoration de nom permet aussi de détecter des modifications supplémentaires non reliées à la signature (tels que la pureté de la routine, la lever potentielle d'une exception ou le lancement du Ramasse-miettes)). Par exemple, le langage D fonctionne ainsi. 

La décoration de nom est davantage qu'une simple vérification d'erreur. Par exemple, la routine int f(); et la routine pure int g(int); peuvent être compilées dans des fichiers objets séparés, mais alors leurs signatures deviennent float f(); et int g(int), ces dernières sont utilisées pour compiler d'autres codes sources qui les appellent. Lors de l'édition des liens, le lieur détecte qu'il n'y a pas de routine f(int) et ne génère pas le code exécutable. De même, le lieur n'est pas en mesure de déterminer que le type de la valeur retournée de f est différent et qu'il ne faut pas générer le code exécutable (une convention d'appel non compatible sera utilisée et produira probablement un code défectueux résultat ou fera planter le programme). 

La décoration de nom ne contient pas tous les détails du processus d'appel. Ainsi, elle ne peut prévenir complètement les erreurs tel que la modification des membres données (propriétés) d'une structures de données ou d'une classe. Par exemple, struct S {}; void f(S) {} peut être compilé dans un même code objet, la déclaration de S devenant struct S { int x; }; qui sera utilisé pour la compilation de l'appel f(S()). Dans une telle situation, le compilateur utilise habituellement différentes conventions d'appel, mais f aura le même nom décoré dans ces deux cas, le lieur ne pourra donc détecter le problème, ce qui résultera en un plantage, une corruption des données ou de mémoire lors de l'exécution du programme.

Références 

Compilateur