Cetățean de primă clasă - First-class citizen
În proiectarea limbajului de programare , un cetățean de primă clasă (de asemenea , tip , obiect , entitate sau valoare ) într-un limbaj de programare dat este o entitate care susține toate operațiunile disponibile în general altor entități. Aceste operații includ de obicei trecerea ca argument, returnată dintr-o funcție, modificată și atribuită unei variabile.
Istorie
Conceptul obiectelor de clasa întâi și a doua a fost introdus de Christopher Strachey în anii 1960. El nu a definit de fapt termenul strict, ci a contrastat numerele reale și procedurile din ALGOL :
Obiecte de clasa I și II. În ALGOL, un număr real poate apărea într-o expresie sau poate fi atribuit unei variabile și oricare dintre ele poate apărea ca parametru real într-un apel de procedură. O procedură, pe de altă parte, poate apărea doar într-un alt apel de procedură fie ca operator (cel mai frecvent caz), fie ca unul dintre parametrii reali. Nu există alte expresii care implică proceduri sau ale căror rezultate sunt proceduri. Astfel, într-un sens, procedurile din ALGOL sunt cetățeni de clasa a doua - trebuie să apară întotdeauna în persoană și nu pot fi niciodată reprezentate printr-o variabilă sau o expresie (cu excepția cazului unui parametru formal) ...
Robin Popplestone a dat următoarea definiție: Toate articolele au anumite drepturi fundamentale.
- Toate elementele pot fi parametrii reali ai funcțiilor
- Toate articolele pot fi returnate ca rezultat al funcțiilor
- Toate articolele pot face obiectul declarațiilor de atribuire
- Toate articolele pot fi testate pentru egalitate.
În anii 1990, Raphael Finkel a propus definiții ale valorilor de clasa a doua și a treia, dar aceste definiții nu au fost adoptate pe scară largă.
Exemple
Cele mai simple tipuri de date scalare , cum ar fi numerele întregi și cu virgulă mobilă, sunt aproape întotdeauna de primă clasă.
În multe limbi mai vechi, tablourile și șirurile nu sunt de primă clasă: nu pot fi atribuite ca obiecte sau transmise ca parametri unui subrutină. De exemplu, nici Fortran IV, nici C nu acceptă alocarea matricei, iar atunci când sunt trecuți ca parametri, doar poziția primului lor element este de fapt trecută - dimensiunea lor este pierdută. C pare să sprijine alocarea indicilor matricei , dar de fapt acestea sunt pur și simplu indicatori către primul element al matricei și, din nou, nu poartă dimensiunea matricei.
În majoritatea limbilor, tipurile de date nu sunt obiecte de primă clasă, deși în unele limbaje orientate pe obiecte, clasele sunt obiecte de primă clasă și sunt instanțe de metaclasă .
Puține limbi acceptă continuările și etichetele GOTO ca obiecte, darămite ca obiecte de primă clasă.
| Concept | Descriere | Limbi |
|---|---|---|
| funcție de primă clasă | închideri și funcții anonime | Dart , Scheme , ML , Haskell , F # , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust |
| control de primă clasă | continuări | Schemă , ML , F # |
| tip de primă clasă | tipuri dependente | Coq , Idris , Agda |
| tip de date de primă clasă | Generic Haskell , C ++ 11 | |
| polimorfism de primă clasă | polimorfism impredicativ | |
| mesaj de primă clasă | mesaje dinamice (apeluri de metodă) | Smalltalk , Objective-C |
| clasa de primă clasă | metaclasă | Smalltalk , Objective-C , Ruby , Python , Delphi |
| dovezi de primă clasă | obiect de dovadă | Coq , Agda |
Funcții
Multe limbaje de programare acceptă trecerea și returnarea valorilor funcției, care pot fi aplicate argumentelor. Este contestat dacă acest lucru este suficient pentru a apela valorile funcției de primă clasă.
Unii autori necesită posibilitatea de a crea noi funcții în timpul rulării pentru a le numi „de primă clasă”. Ca urmare, funcțiile din C nu sunt obiecte de primă clasă; în schimb, ele sunt uneori numite obiecte de clasa a doua , deoarece pot fi manipulate în continuare în majoritatea modelor de mai sus (prin intermediul indicatorilor de funcție ).
În Smalltalk , funcțiile (metodele) sunt obiecte de primă clasă, la fel ca clasele Smalltalk. Deoarece operatorii Smalltalk (+, -, etc.) sunt metode, sunt și obiecte de primă clasă.
Reflecţie
Unele limbaje, cum ar fi Java și PHP , au un subsistem de reflecție explicit care permite accesul la structurile de implementare interne, chiar dacă acestea nu sunt accesibile sau manipulabile în același mod ca obiectele obișnuite.