Co to jest funkcja pierwszej klasy?

„Funkcja pierwszej klasy” to termin, który można zastosować w programowaniu komputerowym i informatyce do języka programowania komputerów, jeśli jego traktowanie funkcji jest zgodne z zestawem wytycznych, chociaż pełny zakres i głębia tych wytycznych nie jest formalnie uzgodniona . Aby mieć pierwszorzędny język programowania funkcji, główną cechą, która musi być obsługiwana, jest możliwość przekazywania funkcji jako argumentów do innych funkcji. Funkcja musi również mieć możliwość przypisania do zmiennej, aby mogła być przechowywana. Inne właściwości używane do określenia, co stanowi funkcję pierwszej klasy, obejmują zdolność do dynamicznego generowania funkcji w czasie wykonywania oraz zdolność języka do posiadania funkcji jako wartości zwracanej przez inną funkcję. Języki obsługujące pierwszorzędną architekturę funkcji pozwalają na wysoki poziom abstrakcji, a także, w niektórych przypadkach, zapewniają mechanizm dynamicznego generowania kodu w czasie wykonywania.

Kiedy termin „funkcja” jest używany w luźno zdefiniowanym sensie, koncepcja przekazywania funkcji w programie przez zmienne niekoniecznie jest unikalna dla języków, które natywnie implementują obsługę funkcji pierwszej klasy. Możliwość przekazywania bloków kodu do funkcji lub zwracania niedynamicznego kodu z funkcji może być łatwo wykonana w wielu językach programowania za pomocą różnych mechanizmów. Jedną ze ścisłych części definicji języka funkcji pierwszej klasy jest jednak to, że obsługa funkcji jako zmiennych musi być wykonywana natywnie, bez użycia metadanych, takich jak definicje warunkowe, i bez wywoływania kompilatora w celu ponownej kompilacji fragmentu kod. Termin „funkcja” jest również używany w odniesieniu do niezależnych bloków kodu, które są wywoływane samodzielnie, co oznacza, że ​​nie zawierają bloków kodu znanych jako metody w językach programowania obiektowego lub bloków czasami nazywanych procedurami w innych językach.

Kiedy język jest zaprojektowany tak, aby umożliwiał kod funkcji pierwszej klasy, niektóre wzorce projektowe można zaimplementować bardziej bezpośrednio niż w innych językach. Funkcja może otrzymać funkcję jako zmienną, a następnie skonstruować nową funkcję i zwrócić nową funkcję do kodu wywołującego, co tworzy mechanizm tworzenia kodu programu w czasie wykonywania. Może to również umożliwić korzystanie z funkcji wprowadzanych przez użytkownika w czasie rzeczywistym w obrębie języka bez użycia procesów, takich jak refleksja lub ocena.

Niektóre z najbardziej podstawowych zastosowań architektury funkcji pierwszej klasy obejmują tworzenie ogólnych funkcji, które można łatwo ponownie wykorzystać, oraz implementację rekurencyjnych algorytmów matematycznych, które są w stanie samodzielnie modyfikować swoje równania w miarę postępu. Jednym z podobnych, bardziej zaawansowanych zastosowań mechanizmów pierwszej klasy jest implementacja polimorfizmu w językach, w których nie jest ona specjalnie zaimplementowana. Może to pozwolić na wywoływanie funkcji z tą samą sygnaturą funkcji, ale wykonywanie kodu na podstawie kontekstu, w którym została wywołana, czasami poprzez przekazanie funkcji klucza do funkcji polimorficznej.