Pourquoi le nom n’est-il pas normalisé?

Je me demande simplement pourquoi le nom mangling n’a jamais été normalisé par la norme C ++. Manifestement, le fait d’utiliser différents algorithmes de gestion des noms nuit à l’interopérabilité [1] et je ne vois aucun avantage à le définir.

C’est-à-dire que, contrairement aux conventions d’appel ou à la taille des primitives, la machine elle-même ne se soucie pas de savoir comment la fonction est appelée. Alors pourquoi n’a-t-il pas été normalisé et pourquoi n’est-il toujours pas normalisé? Les compilateurs ont changé les règles dans le passé de toute façon entre les versions.

[1] Toutes les personnes exportant des fonctions en tant extern "C" disent long.

La norme ne traite pas des détails de mise en œuvre. Il y a beaucoup, beaucoup de choses qui dépendent de l’implémentation et qui empêchent les programmes de fonctionner ensemble: la manière dont les classes sont agencées, la structure de la vtable , etc. En général, les compilateurs changeront le nom en changeant ces noms. . C’est intentionnel, car cela empêche le code de créer un lien qui ne fonctionnerait pas.

Il est possible pour une plate-forme donnée de définir un ABI C ++; tous les compilateurs qui y adhéreraient utiliseraient des implémentations compatibles et auraient un nom commun. Ceci est un problème pour les vendeurs de plate-forme, cependant; pour quelque raison que ce soit, très peu de fournisseurs ont défini une ABI C ++.

Et la raison pour laquelle extern "C" fonctionne, c’est parce que presque toutes les plateformes définissent une ABI en C.

En réalité, la norme n’exige pas de mutilation des noms. D’ailleurs, la norme n’exige pas de nombres à virgule flottante IEEE, ni d’entiers à deux compléments, ni aucun nombre d’autres choses.

Jusqu’à ce qu’il y ait une ABI répandue sur laquelle s’appuyer, GCC a en fait utilisé un système de nom différent pour ses concurrents:

G ++ ne traite pas les noms de la même manière que les autres compilateurs C ++. Cela signifie que les fichiers object compilés avec un compilateur ne peuvent pas être utilisés avec un autre.

Cet effet est intentionnel, pour vous protéger de problèmes plus subtils. Les compilateurs diffèrent par de nombreux détails internes de l’implémentation C ++, notamment: la manière dont les instances de classe sont disposées, comment plusieurs inheritances sont implémentés et comment les appels de fonctions virtuelles sont gérés. Si le codage des noms était identique, vos programmes seraient liés aux bibliothèques fournies par d’autres compilateurs – mais les programmes se bloqueraient ensuite lors de leur exécution. Les bibliothèques incompatibles sont ensuite détectées au moment de la liaison, plutôt qu’au moment de l’exécution.

La gestion des noms est également plus complexe que ne le réalisent beaucoup de programmeurs. Par exemple, comment la norme spécifierait-elle des conventions d’appel acceptables pour toutes les plates-formes sur lesquelles C ++ pourrait s’exécuter ? Un système RISC devrait-il être tenu de prendre en charge x86 stdcall même si les systèmes RISC transmettent généralement leurs arguments dans des registres plutôt que sur la stack?