Ne sous-estimez pas Dennis Ritchie. Chaque langage statiquement typé devrait avoir un moyen de créer un fichier de type type d'abstraction qu'il est impossible pour un utilisateur de falsifier. Pour cela, il faut une construction de type ou une construction de déclaration qui est générative c'est-à-dire que chaque instance de la construction génère un nouveau type, distinct de tout autre. Une telle construction est essentielle si vous voulez éviter que d'autres personnes ne mettent la main sur vos données. (Pour de nombreux exemples, voir le livre de Dave Hanson, intitulé C Interfaces et implémentations .)
Voici donc les valeurs p1
y p2
ont des types différents mais la même représentation :
struct { float x, y } p1;
struct { float x, y } p2;
Pourquoi choisir struct
d'être générative ? Parce qu'il est suffisamment général pour permettre un large éventail de représentations pratiques. union
est un peu exagéré, mais je soupçonne qu'il s'agit d'une "conception collatérale" ; dans le système de type du C, union
se comporte comme une liste struct
autant que possible, ce qui simplifie le compilateur.
Soit dit en passant, l'"équivalence de déclaration" est un terme que je n'avais jamais entendu auparavant. Il y a 25 ans, des termes comme "équivalence de nom", "équivalence structurelle" et "équivalence d'occurrence" étaient populaires. Aujourd'hui, les systèmes de types sont beaucoup plus formels, et l'équivalence est généralement définie par des règles logiques plutôt que par un anglais informel. Lorsqu'il est utile de recourir à l'anglais informel, je trouve généralement que l'idée de "générativité" est plus explicative que l'invention d'un nouveau nom pour les règles d'équivalence de chaque nouveau langage.