J'ai vu à plusieurs reprises des déclarations du type: "Veuillez faire de cette fonctionnalité un citoyen de première classe dans telle ou telle langue/plate-forme". Par exemple, il est dit à propos des énumérations dans C # /. Net. Alors, quand une fonctionnalité est-elle considérée comme un "citoyen de première classe" dans un langage/plateforme de programmation?
Définition
Un objet est de première classe lorsqu'il:
- peut être stocké dans des variables et des structures de données
- peut être passé en paramètre à un sous-programme
- peut être retourné à la suite d'un sous-programme
- peut être construit au moment de l'exécution
- a une identité intrinsèque (indépendante de tout nom donné)
Le terme "objet" est utilisé ici de manière lâche, ne faisant pas nécessairement référence aux objets dans la programmation orientée objet. Les types de données scalaires les plus simples, tels que les nombres entiers et à virgule flottante, sont presque toujours de première classe.
La notion de "citoyen de première classe" ou "élément de première classe" dans un langage de programmation a été introduite par un informaticien britannique Christopher Strachey dans les années 1960 dans le contexte de la première -fonctions de classe. La formulation la plus célèbre de ce principe se trouve probablement dans Structure et interprétation des programmes informatiques par Gerald Jay Sussman et Harry Abelson:
- Ils peuvent être nommés par des variables.
- Ils peuvent être transmis comme arguments aux procédures.
- Ils peuvent être retournés en tant que résultats de procédures.
- Ils peuvent être inclus dans les structures de données.
Fondamentalement, cela signifie que vous pouvez faire avec cet élément de langage de programmation tout ce que vous pouvez faire avec tous les autres éléments du langage de programmation.
Il s'agit de "droits égaux": vous pouvez faire tout ce qui précède, avec, disons, des entiers, alors pourquoi autre chose devrait-il être différent?
La définition ci-dessus est un peu restrictive dans le sens où elle ne parle vraiment que de l'aspect de première classe en tant qu'objet du programme. Une définition plus générale serait qu'une chose est de première classe si vous pouvez tout faire avec elle, vous pouvez également faire avec d'autres choses du même genre.
Par exemple, Java et Java sont de même nature. Vous pouvez définir de nouvelles méthodes, vous pouvez (quelque peu) choisir librement les noms de vos propres méthodes). , vous pouvez remplacer les méthodes, vous pouvez surcharger les méthodes. James Gosling peut aussi faire tout cela avec des opérateurs, mais vous et moi ne pouvez pas. I signifie, contrairement à la croyance populaire, Java prend en charge la surcharge de l'opérateur: par exemple, le +
L'opérateur est surchargé pour byte
, short
, int
, long
, float
, double
et String
, et IIRC dans Java 7 aussi pour BigInteger
et BigDecimal
(et probablement un couple que j'ai oublié), c'est juste que vous n'avez aucune influence sur cela. Cela rend clairement les opérateurs de seconde classe selon cette deuxième définition. Notez que les méthodes ne sont toujours pas des objets de première classe selon la première définition, cependant (cela fait-il des opérateurs de troisième classe?)
Habituellement, cela fait référence à une construction qui est passable en tant que paramètre, peut être définie comme un type de retour d'une fonction ou peut être affectée d'une valeur. Normalement, vous devez pouvoir les construire au moment de l'exécution. Par exemple, une instance d'une classe serait un citoyen de première classe en c ++ ou Java, mais pas une fonction en C.
Je dirais qu'une fonctionnalité est un citoyen de première classe si elle est implémentée uniquement par le langage.
c'est à dire. il ne nécessite pas plusieurs fonctionnalités linguistiques ou une bibliothèque standard pour implémenter cette fonctionnalité.
Exemple:
En C/C++, je ne considère pas les fonctions comme un citoyen de première classe (d'autres le peuvent).
En effet, il existe des moyens de manipuler des fonctions qui sont directement prises en charge par le langage mais qui nécessitent l'utilisation d'autres fonctionnalités du langage. La liaison de paramètres à une fonction n'est pas directement prise en charge et vous devez créer un foncteur pour implémenter cette fonctionnalité.