Obywatel pierwszej kategorii - First-class citizen
W programowaniu projekt językowy , a obywatela pierwszej klasy (również typ , przedmiot , podmiot lub wartości ) w danym języku programowania jest podmiotem, który obsługuje wszystkie operacje ogólnie dostępne dla innych podmiotów. Te operacje zazwyczaj obejmują przekazanie jako argument, zwrócenie z funkcji, zmodyfikowanie i przypisanie do zmiennej.
Historia
Pojęcie przedmiotów pierwszej i drugiej klasy zostało wprowadzone przez Christophera Stracheya w latach 60. XX wieku. W rzeczywistości nie zdefiniował tego terminu ściśle, ale skontrastował liczby rzeczywiste i procedury w ALGOL :
Obiekty pierwszej i drugiej klasy. W ALGOL liczba rzeczywista może pojawić się w wyrażeniu lub być przypisana do zmiennej, a każdy z nich może pojawić się jako rzeczywisty parametr w wywołaniu procedury. Z drugiej strony procedura może pojawić się tylko w innym wywołaniu procedury jako operator (najczęstszy przypadek) lub jako jeden z rzeczywistych parametrów. Nie ma innych wyrażeń dotyczących procedur lub których wynikiem są procedury. Zatem w pewnym sensie procedury w ALGOL są obywatelami drugiej kategorii – zawsze muszą występować osobiście i nigdy nie mogą być reprezentowane przez zmienną lub wyrażenie (z wyjątkiem przypadku parametru formalnego)…
Robin Popplestone podał następującą definicję: Wszystkie przedmioty mają pewne podstawowe prawa.
- Wszystkie elementy mogą być rzeczywistymi parametrami funkcji
- Wszystkie elementy mogą zostać zwrócone jako wyniki funkcji
- Wszystkie pozycje mogą być przedmiotem oświadczeń cesji
- Wszystkie przedmioty można przetestować pod kątem równości.
W latach 90. Raphael Finkel zaproponował definicje wartości drugiej i trzeciej klasy, ale definicje te nie zostały powszechnie przyjęte.
Przykłady
Najprostsze skalarne typy danych, takie jak liczby całkowite i zmiennoprzecinkowe, są prawie zawsze pierwszej klasy.
W wielu starszych językach tablice i łańcuchy nie są pierwszorzędne: nie mogą być przypisane jako obiekty lub przekazane jako parametry do podprogramu. Na przykład ani Fortran IV, ani C nie obsługują przypisywania tablic, a kiedy są przekazywane jako parametry, w rzeczywistości przekazywana jest tylko pozycja ich pierwszego elementu — ich rozmiar jest tracony. Wydaje się, że C obsługuje przypisanie wskaźników do tablicy , ale w rzeczywistości są to po prostu wskaźniki do pierwszego elementu tablicy i znowu nie przenoszą rozmiaru tablicy.
W większości języków typy danych nie są obiektami pierwszej klasy, chociaż w niektórych językach obiektowych klasy są obiektami pierwszej klasy i są instancjami metaklas .
Niewiele języków obsługuje kontynuacje i etykiety GOTO jako obiekty, nie mówiąc już o obiektach pierwszej klasy.
Pojęcie | Opis | Języki |
---|---|---|
pierwszorzędna funkcja | zamknięcia i funkcje anonimowe | Dart , Scheme , ML , Haskell , F# , Kotlin , Scala , Swift , PHP , Python , Raku , JavaScript , Delphi , Rust |
pierwszorzędna kontrola | kontynuacje | Schemat , ML , F# |
typ pierwszej klasy | typy zależne | Coq , Idris , Agda |
pierwszorzędny typ danych | Ogólny Haskell , C++11 | |
pierwszorzędny polimorfizm | imperatywny polimorfizm | |
pierwszorzędna wiadomość | wiadomości dynamiczne (wywołania metod) | Smalltalk , Cel-C |
klasa pierwsza | metaklasa | Smalltalk , Objective-C , Ruby , Python , Delphi |
najwyższej klasy dowody | obiekt dowodowy | Coq , Agda |
Funkcje
Wiele języków programowania obsługuje przekazywanie i zwracanie wartości funkcji, które można zastosować do argumentów. Kwestią sporną jest, czy to wystarczy, aby wywołać wartości funkcji pierwszej klasy.
Niektórzy autorzy wymagają możliwości tworzenia nowych funkcji w czasie wykonywania, aby nazywać je „pierwszej klasy”. W rezultacie funkcje w C nie są obiektami pierwszej klasy; zamiast tego są czasami nazywane obiektami drugiej klasy , ponieważ nadal można nimi manipulować w większości powyższych sposobów (poprzez wskaźniki do funkcji ).
W Smalltalk funkcje (metody) są obiektami pierwszej klasy, podobnie jak klasy Smalltalk. Ponieważ operatory Smalltalk (+, - itd.) są metodami, są również obiektami pierwszej klasy.
Odbicie
Niektóre języki, takie jak Java i PHP , mają podsystem jawnego odbicia, który umożliwia dostęp do wewnętrznych struktur implementacyjnych, nawet jeśli nie są one dostępne lub nie można nimi manipulować w taki sam sposób, jak zwykłe obiekty.