Citoyen de première classe - First-class citizen
Dans la conception d' un langage de programmation , un citoyen de première classe (également type , objet , entité ou valeur ) dans un langage de programmation donné est une entité qui prend en charge toutes les opérations généralement disponibles pour les autres entités. Ces opérations incluent généralement le fait d'être passé en tant qu'argument, renvoyé à partir d'une fonction, modifié et affecté à une variable.
Histoire
Le concept d'objets de première et de deuxième classe a été introduit par Christopher Strachey dans les années 1960. En fait, il n'a pas défini le terme strictement, mais a contrasté les nombres réels et les procédures dans ALGOL :
Objets de première et deuxième classe. Dans ALGOL, un nombre réel peut apparaître dans une expression ou être affecté à une variable, et l'un ou l'autre peut apparaître comme un paramètre réel dans un appel de procédure. Une procédure, en revanche, peut n'apparaître que dans un autre appel de procédure, soit comme opérateur (cas le plus courant), soit comme l'un des paramètres réels. Il n'y a pas d'autres expressions impliquant des procédures ou dont les résultats sont des procédures. Ainsi, dans un sens, les procédures dans ALGOL sont des citoyens de seconde classe - elles doivent toujours apparaître en personne et ne peuvent jamais être représentées par une variable ou une expression (sauf dans le cas d'un paramètre formel)...
Robin Popplestone a donné la définition suivante : Tous les articles ont certains droits fondamentaux.
- Tous les éléments peuvent être les paramètres réels des fonctions
- Tous les articles peuvent être retournés en tant que résultats de fonctions
- Tous les éléments peuvent faire l'objet d'énoncés d'affectation
- Tous les éléments peuvent être testés pour l'égalité.
Au cours des années 1990, Raphael Finkel a proposé des définitions des valeurs de deuxième et troisième classe, mais ces définitions n'ont pas été largement adoptées.
Exemples
Les types de données scalaires les plus simples , tels que les nombres entiers et à virgule flottante, sont presque toujours de première classe.
Dans de nombreux langages plus anciens, les tableaux et les chaînes ne sont pas de première classe : ils ne peuvent pas être affectés en tant qu'objets ou passés en tant que paramètres à un sous-programme. Par exemple, ni Fortran IV ni C ne prennent en charge l'affectation de tableaux, et lorsqu'ils sont passés en paramètres, seule la position de leur premier élément est réellement transmise - leur taille est perdue. C semble prendre en charge l'affectation de pointeurs de tableau , mais en fait ce sont simplement des pointeurs vers le premier élément du tableau, et encore une fois ne portent pas la taille du tableau.
Dans la plupart des langages, les types de données ne sont pas des objets de première classe, bien que dans certains langages orientés objet, les classes soient des objets de première classe et des instances de métaclasses .
Peu de langages prennent en charge les continuations et les étiquettes GOTO en tant qu'objets, et encore moins en tant qu'objets de première classe.
| Concept | La description | Langues |
|---|---|---|
| fonction de première classe | fermetures et fonctions anonymes | Dart , Scheme , ML , Haskell , F# , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust |
| contrôle de première classe | suite | Schéma , ML , F# |
| type de première classe | types dépendants | Coq , Idris , Agda |
| type de données de première classe | Haskell générique , C++11 | |
| polymorphisme de première classe | polymorphisme imprédicatif | |
| message de première classe | messages dynamiques (appels de méthode) | Smalltalk , Objectif-C |
| classe de première classe | métaclasse | Smalltalk , Objective-C , Ruby , Python , Delphi |
| preuves de premier ordre | objet de preuve | Coq , Agda |
Les fonctions
De nombreux langages de programmation prennent en charge le passage et le retour de valeurs de fonction, qui peuvent être appliquées aux arguments. Que cela suffise pour appeler des valeurs de fonction de première classe est contesté.
Certains auteurs exigent qu'il soit possible de créer de nouvelles fonctions au moment de l'exécution pour les appeler « première classe ». Par conséquent, les fonctions en C ne sont pas des objets de première classe ; au lieu de cela, ils sont parfois appelés objets de seconde classe , car ils peuvent toujours être manipulés de la plupart des manières ci-dessus (via des pointeurs de fonction ).
Dans Smalltalk , les fonctions (méthodes) sont des objets de première classe, tout comme les classes Smalltalk. Puisque les opérateurs Smalltalk (+, -, etc.) sont des méthodes, ce sont aussi des objets de première classe.
Réflexion
Certains langages, tels que Java et PHP , ont un sous-système de réflexion explicite qui permet d'accéder aux structures d'implémentation internes même si elles ne sont pas accessibles ou manipulables de la même manière que les objets ordinaires.