Początkujących programistów czasem zaskakuje to, jak zróżnicowanym „narzędziami” posługują się poszczególne języki programowania. Jedna z najważniejszych różnic polega na tym, czy dany język oparty jest na podejściu imperatywnym, czy deklaratywnym — a może korzysta z obu? W dzisiejszym tekście spróbujemy przybliżyć obydwa paradygmaty — zapraszamy do lektury!
Czym są paradygmaty programowania?
Zacznijmy od początku — czyli od tego, czym są wspomniane paradygmaty.
W skrócie, są to podejścia do rozwiązywania problemów programistycznych, wyróżniające się specyficzną strukturą, zaleceniami i możliwościami. Niektóre języki opracowane zostały specjalnie z myślą o danym paradygmacie, inne — posługują się nimi bardzo swobodnie, łącząc ich cechy. Tak naprawdę większość popularnych obecnie języków (np. Python, Ruby czy JavaScript) stanowi połączenie różnych paradygmatów.
Tytułowe programowanie imperatywne oraz deklaratywne są dwoma przeciwstawnymi do siebie paradygmatami — określającymi, jaki charakter mają „instrukcje” wydawane komputerowi przez program.
Programowanie imperatywne — na czym polega?
W podejściu imperatywnym każdy program stanowi po prostu ciąg instrukcji, prowadzących komputer krok po kroku przez kolejne czynności na drodze do osiągnięcia zamierzonego przez programistę celu. Opisujemy więc nie to, co chcemy zrobić, a w jaki sposób chcemy to zrobić — przy pomocy instrukcji wyboru, klauzul if i pętli.
Zdj 1. Tak mógłby wyglądać prosty skrypt imperatywny na sumę zbioru liczb w Pythonie.
Źródło: Declarative vs imperative programming: 5 key differences — educative.io
Chyba każdy, kto uczył się programowania, zaczynał właśnie od podejścia imperatywnego. Z jednej strony jest ono bardzo intuicyjne dla początkującego — z drugiej, oddaje w ręce programisty pełną kontrolę nad procesami wykonywanymi przez program. Wymaga przy tym, oczywiście, nieco więcej pracy (i sporej dokładności, jeśli chcemy uniknąć błędów).
Na paradygmacie imperatywnym oparte są praktycznie wszystkie najpopularniejsze języki: od JavaScriptu i Pythona po PHP, Javę oraz C++.
A co wyróżnia programowanie deklaratywne?
Podejście deklaratywne skoncentrowane jest na celu, a nie — jak w przypadku paradygmatu imperatywnego — na procesie. Programista „deklaruje”, co program ma osiągnąć — jakie warunki ma spełnić końcowe rozwiązanie procesu — bez wskazywania, w jaki sposób powinien to zrobić.
Kod w paradygmacie deklaratywnym jest więc bardziej abstrakcyjny — ale też podobny do sposobu, w jaki komunikujemy się między sobą na co dzień. Gdy prosimy baristę o kawę, nie musimy mu wyjaśniać, jak — krok po kroku — powinien ją przygotować. Wystarczy, że wybierzemy rodzaj kawy… i ewentualnie dodamy, z jakim mlekiem chcemy ją wypić. Programowanie deklaratywne działa podobnie.
Zdj 2. A tak wygląda ten sam skrypt na sumę według paradygmatu deklaratywnego.
Źródło: Declarative vs imperative programming: 5 key differences — educative.io
Co za tym idzie — struktura kodu deklaratywnego jest zwięzła — i bardzo czytelna. A przynajmniej dla kogoś, kto dobrze zna mechanizmy i składnię danego języka; w przeciwnym razie kod rzeczywiście może być abstrakcyjny.
Z zasad programowania deklaratywnego korzysta m.in. język SQL, służący do tworzenia i modyfikowania baz danych. Dobrymi przykładami mogą być też HTML oraz CSS — które co prawda nie są de facto językami programowania, ale ich struktura również jest oparta na deklaracjach, a nie na instrukcjach.
Jednak elementy deklaratywne znajdziemy także w językach typowo imperatywnych. Mamy więc Pythona, Ruby oraz Javę, które korzystają z niektórych struktur programowania funkcyjnego (odmiana programowania deklaratywnego). Na tym paradygmacie oparto też bardzo popularne biblioteki JavaScript — React oraz Angular.
Programowanie imperatywne a deklaratywne — podsumowanie
Jeśli mielibyśmy krótko podsumować różnicę między programowaniem deklaratywnym a imperatywnym, powiedzielibyśmy, że:
- paradygmat imperatywny daje pełną kontrolę nad procesami, przez jakie przechodzi program; posługiwanie się nim oznacza jednak dłuższy, bardziej złożony i trudniejszy w utrzymaniu kod;
- paradygmat deklaratywny znacząco upraszcza kod, ułatwiając utrzymanie złożonych programów; nie radzi sobie jednak z niektórymi problemami, zwłaszcza tymi wymagającymi „zagłębienia się” w logikę całego systemu.
Na szczęście, oba podejścia można w wielu językach połączyć — i dopasować do danego problemu.