J'ai vu à maintes reprises des déclarations telles que «Faites de cette fonctionnalité un citoyen de première classe dans telle ou telle langue / plate-forme». Par exemple, on parle d’énums en C # / .net. Alors, quand une fonctionnalité est-elle considérée comme un "citoyen de première classe" dans un langage / une plate-forme de programmation?
language-features
Gulshan
la source
la source
La notion de "citoyen de première classe" ou "élément de première classe" dans un langage de programmation a été introduite par l'informaticien britannique Christopher Strachey dans les années 1960 dans le contexte de fonctions de première classe. La formulation la plus célèbre de ce principe est probablement dans Structure et interprétation des programmes informatiques de Gerald Jay Sussman et Harry Abelson:
En gros, 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.
Tout est une question "d'égalité des droits": vous pouvez faire tout ce qui précède, avec, par exemple, des nombres entiers, alors pourquoi une autre chose devrait-elle être différente?
La définition ci-dessus est un peu restrictive dans le sens où elle ne parle que de l'aspect de première classe en tant qu'objets 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, les opérateurs et les méthodes Java sont du même type. Vous pouvez définir de nouvelles méthodes, vous pouvez (un peu) choisir librement les noms de vos propres méthodes, vous pouvez remplacer des méthodes, vous pouvez surcharger des méthodes. James Gosling peut également faire tout cela avec des opérateurs, mais vous et moi ne le pouvons pas. Je veux dire, contrairement à la croyance populaire, Java ne surcharge d'opérateur de support: par exemple, l'
+
opérateur est surchargé pourbyte
,short
,int
,long
,float
,double
etString
, et IIRC en Java 7 aussiBigInteger
etBigDecimal
(et probablement deux ou trois j'ai oublié), il est juste que vousne pas avoir d'influence sur elle. Cela place clairement les opérateurs de deuxième 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. (Cela fait-il des opérateurs de troisième classe?)la source
Il s’agit généralement d’une construction qui peut être passée comme paramètre, qui peut être définie comme un type de retour d’une fonction ou à laquelle une valeur peut être affectée. Normalement, vous devez être capable de les construire au moment de l'exécution. Par exemple, une instance de classe serait un citoyen de première classe en c ++ ou java, mais pas une fonction en C.
la source
Je dirais qu'une fonctionnalité est un citoyen de première classe si elle est mise en œuvre uniquement par la langue.
c'est-à-dire qu'il ne nécessite pas de fonctionnalités multilingues ou une bibliothèque standard pour implémenter cette fonctionnalité.
Exemple:
En C / C ++, je ne considère pas les fonctions comme des citoyens de première classe (d’autres le peuvent).
En effet, il existe des moyens de manipuler des fonctions directement prises en charge par le langage mais nécessitant l’utilisation d’autres fonctionnalités. 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é.
la source
Pour ajouter un exemple aux réponses déjà fournies:
Dans WCF / C #, vous devez actuellement marquer un objet de classe avec un attribut de contrat de service pour le faire fonctionner en tant que service. Il n'y a pas une telle chose comme:
Une classe est un citoyen de première classe en c #, alors qu'un service ne l'est pas.
J'espère que cela t'aides
la source