W wielu artykułach opisujących zalety programowania funkcjonalnego widziałem funkcjonalne języki programowania, takie jak Haskell, ML, Scala lub Clojure, nazywane „językami deklaratywnymi”, różniącymi się od języków imperatywnych, takich jak C / C ++ / C # / Java. Moje pytanie brzmi: co sprawia, że funkcjonalne języki programowania są deklaratywne, a nie imperatywne.
Często spotykanym wyjaśnieniem opisującym różnice między programowaniem deklaratywnym a imperatywnym jest to, że w programowaniu imperatywnym mówisz komputerowi „jak coś zrobić”, a nie „co robić” w językach deklaratywnych. Problem z tym objaśnieniem polega na tym, że ciągle robisz to we wszystkich językach programowania. Nawet jeśli zejdziesz na najniższy poziom, wciąż mówisz komputerowi „Co robić”, każesz CPU dodać dwie liczby, nie instruujesz go, jak wykonać dodawanie. Jeśli przejdziemy do drugiego końca spektrum, czysto funkcjonalnego języka wysokiego poziomu, takiego jak Haskell, w rzeczywistości mówisz komputerowi, jak osiągnąć określone zadanie, to właśnie twój program jest sekwencją instrukcji, aby osiągnąć określone zadanie, którego komputer nie wie, jak wykonać samodzielnie. Rozumiem, że języki takie jak Haskell, Clojure itp. Są oczywiście na wyższym poziomie niż C / C ++ / C # / Java i oferują takie funkcje, jak leniwa ocena, niezmienne struktury danych, anonimowe funkcje, curry, trwałe struktury danych itp. programowanie funkcjonalne możliwe i wydajne, ale nie klasyfikowałbym ich jako języków deklaratywnych.
Dla mnie językiem czysto deklaratywnym byłby ten, który składa się wyłącznie z deklaracji, przykładem takich języków byłby CSS (tak, wiem, że CSS technicznie nie byłby językiem programowania). CSS zawiera tylko deklaracje stylu, które są używane przez HTML i JavaScript strony. CSS nie może robić nic innego poza deklaracjami, nie może tworzyć funkcji klasowych, tj. Funkcji, które określają styl wyświetlania na podstawie jakiegoś parametru, nie można wykonywać skryptów CSS itp. To dla mnie opisuje język deklaratywny (zauważ, że nie powiedziałem deklaratywny język programowania ).
Aktualizacja:
Ostatnio bawiłem się z Prologiem i dla mnie Prolog jest najbliższym językiem programowania do języka w pełni deklaratywnego (przynajmniej moim zdaniem), jeśli nie jest to jedyny w pełni deklaratywny język programowania. Aby opracować programowanie w Prologu, należy wykonać deklaracje określające albo fakt (funkcja predykatu, która zwraca wartość true dla określonego wejścia), albo regułę (funkcja predykatu, która zwraca true dla danego warunku / wzorca na podstawie danych wejściowych), reguły są zdefiniowane przy użyciu techniki dopasowania wzorca. Aby cokolwiek zrobić w prologu, przeszukujesz bazę wiedzy, zastępując jedną lub więcej danych wejściowych predykatu zmienną, a prolog próbuje znaleźć wartości dla zmiennych, dla których predykat się powiedzie.
Chodzi mi o prolog, że nie ma instrukcji bezwzględnych, po prostu mówisz (deklarujesz) komputerowi, co on wie, a potem pytasz (pytasz) o wiedzę. W funkcjonalnych językach programowania nadal podajesz instrukcje, tj. Weź wartość, wywołaj funkcję X i dodaj do niej 1 itd., Nawet jeśli nie manipulujesz bezpośrednio lokalizacjami pamięci lub nie zapisujesz obliczeń krok po kroku. Nie powiedziałbym, że programowanie w Haskell, ML, Scali lub Clojure jest w tym sensie deklaratywne, chociaż mogę się mylić. Jest właściwym, prawdziwym, czysto funkcjonalnym programowaniem deklaratywnym w sensie, który opisałem powyżej.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
( mam nadzieję, że to zrozumiałeś, Clojure). Moje oryginalne pytanie brzmi: co różni to od tego int? x = 1; x += 2; x *= x; return x;
Moim zdaniem jest w większości taki sam.