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.

  1. Wszystkie elementy mogą być rzeczywistymi parametrami funkcji
  2. Wszystkie elementy mogą zostać zwrócone jako wyniki funkcji
  3. Wszystkie pozycje mogą być przedmiotem oświadczeń cesji
  4. 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.

Zobacz też

Bibliografia