Système de type nominal - Nominal type system

En informatique , un système de type est un système de type nominal ou nominatif (ou système de type basé sur le nom ) si la compatibilité et l'équivalence des types de données sont déterminées par des déclarations explicites et / ou le nom des types. Les systèmes nominaux sont utilisés pour déterminer si les types sont équivalents, ainsi que si un type est un sous-type d'un autre. Les systèmes de type nominal contrastent avec les systèmes structurels , où les comparaisons sont basées sur la structure des types en question et ne nécessitent pas de déclarations explicites.

Typage nominal

Le typage nominal signifie que deux variables sont compatibles de type si et seulement si leurs déclarations nomment le même type. Par exemple, en C , deux struct types avec des noms différents dans la même unité de traduction ne sont jamais considérés comme compatibles, même s'ils ont des déclarations de champ identiques.

Cependant, C permet également une typedef déclaration, qui introduit un alias pour un type existant. Celles-ci sont simplement syntaxiques et ne différencient pas le type de son alias aux fins de la vérification de type. Cette fonctionnalité, présente dans de nombreux langages, peut entraîner une perte de sécurité de type lorsque (par exemple) le même type entier primitif est utilisé de deux manières sémantiquement distinctes. Haskell fournit l'alias syntaxique de style C sous la forme de la type déclaration, ainsi que la newtype déclaration qui introduit un nouveau type distinct, isomorphe à un type existant.

Sous-typage nominal

De la même manière, le sous-typage nominal signifie qu'un type est un sous-type d'un autre si et seulement s'il est explicitement déclaré comme tel dans sa définition. Les langages à typage nominal imposent généralement l'exigence selon laquelle les sous-types déclarés doivent être structurellement compatibles (bien qu'Eiffel autorise la déclaration des sous -types non compatibles). Cependant, les sous-types structurellement compatibles «par accident», mais non déclarés comme sous-types, ne sont pas considérés comme des sous-types.

C ++ , C # , Java , Objective-C , Delphi , Swift , Julia et Rust utilisent tous principalement le typage nominal et le sous-typage nominal.

Certains langages sous-typés nominalement, tels que Java et C #, permettent aux classes d'être déclarées finales (ou scellées dans la terminologie C #), indiquant qu'aucun autre sous-typage n'est autorisé.

Comparaison

Le typage nominal est utile pour empêcher l'équivalence de type accidentelle, ce qui permet une meilleure sécurité de type que le typage structurel. Le coût est une flexibilité réduite, car, par exemple, le typage nominal ne permet pas de créer de nouveaux super-types sans modification des sous-types existants.

Voir également

Les références

Sources

Liens externes