Il existe deux approches au contrôle de typage qui est effectué par un compilateur pour un langage fortement typé lorsque deux objets différents sont mis en correspondance (lors d'une affectation, d'une comparaison ou d'un passage de paramètre) : l'équivalence de nom et l'équivalence de structure.
Avec l'équivalence de nom, il faut que deux variables (ou paramètres) aient été déclarées en utilisant le même identificateur de type pour qu'elles puissent être considérées comme compatibles.
Exemple
type T = record PeuImporte: Quelconque; end; { T } var X, Y: T; Z: record PeuImporte: Quelconque; end; { Z }
X et Y sont compatibles, mais Z n'est compatible ni avec X, ni avec Y. De
même, si l'on a :
type T = ...; MemeT = T; var U: T; V: MemeT;
U et V sont incompatibles.
Un problème lié à l'équivalence de nom est qu'il devient plus difficile d'écrire des sous-programmes d'utilité générale. Par exemple, un sous-programme qui aurait comme paramètre formel un entier ne pourrait pas être utilisé avec un paramètre effectif de type intervalle d'entier.
Avec l'équivalence de structure, pour considérer deux variables comme compatibles, il suffit que l'on ait identité des déclarations de type où l'on aurait remplacé tout identificateur de type déclaré par l'utilisateur par la déclaration de type correspondante.
Dans les exemples vus plus haut, X, Y et Z sont compatibles. Il en est de même pour U et V.
Les problèmes liés à l'équivalence de structure sont une plus grande complexité de contrôle du typage à la compilation et une ambiguïté possible des déclarations. Par exemple, avec les déclarations suivantes :
type Complex1 = record PartieReelle, PartieImaginaire: real; end; { Complex1 } Complex2 = record PartieImaginaire, PartieReelle: real; end; { Complex2 }
Complex1 et Complex2 sont compatibles. Toutefois, lors d'une affectation impliquant les deux types, la correspondance des champs de vrait-elle se faire en fonction de leurs positions relatives ou en fonction de leur nom ? Le mécanisme devant fonctionner même si les noms des champs sont différents, c'est une correspondance positionnelle qui est utilisée.
Dans sa spécification du langage Pascal, Wirth reste assez vague sur le sujet. Dans son manuel du Pascal, il dit que, pour l'affectation, l'expression doit être de même type que la variable. Il dit aussi qu'un type de donnée est spécifié soit par la déclaration de variable, soit par un identificateur. Ceci est suffisamment ambigu pour être sujet à interprétation. Dans un grand nombre d'implantations, c'est l'équivalence de structure qui est utilisée. Le type de chaque composante d'une des structures doit être le même que la composante correspondante de l'autre structure.
En Ada, c'est une variante de l'équivalence de nom qui est utilisée. Ada fait, en effet, la distinction entre type de base, type dérivé et sous-type. Un type de base correspond soit à une déclaration de type utilisant un constructeur (enregistrement, tableau, énumération), soit à un type prédéfini du langage (integer, boolean, . . .).
Un type dérivé fait référence à un type de base en y apportant une restriction éventuelle. Un type dérivé bénéficie des mêmes primitives (opérations prédéfinies, sous-programmes utilisant le type de base en paramètre) que le type de base, mais est incompatible avec ce type de base.
Un sous-type fait lui aussi référence à un type de base en y apportant une restriction éventuelle. Ce sous-type reste toutefois compatible avec le type de base pour autant que l'opération impliquant le type de base et son sous-type ne transgresse pas la restriction du sous-type.
La distinction entre ces trois cas se fait dans la déclaration :
type <NomDuTypeDeBase> is <TypePredefiniOuConstructeur>; type <NomDuTypeDerive> is new <NomDuTypeDeBase> <RestrictionEventuelle>; subtype <NomDuSousType> is <TypeDeBase> <RestrictionEventuelle>;
Modula-2 utilise une variante de l'équivalence de nom plus laxiste qu'Ada. Si l'on reprend les exemples vus dans le paragraphe sur l'équivalence de nom, comme pour Ada, X et Y sont considérés comme compatibles, mais Z n'est compatible ni avec X, ni avec Y. Par contre, contrairement à Ada, U et V sont considérés comme compatibles.
Site Hosting: Bronco