Jakie są różnice pomiędzy programowaniem imperatywnym a deklaratywnym?
3 min
3 min
Na skróty
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!
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.
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++.
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.
Jeśli mielibyśmy krótko podsumować różnicę między programowaniem deklaratywnym a imperatywnym, powiedzielibyśmy, że:
Na szczęście, oba podejścia można w wielu językach połączyć — i dopasować do danego problemu.
Zawodowy copywriter oraz student psychologii na Uniwersytecie Warszawskim. W świecie marketingu internetowego równie mocno, co chwytliwe (i wartościowe) treści interesuje go dobry design. Gdy nie zajmuje się tworzeniem contentu, odkrywa perełki kina niezależnego i pracuje nad własnymi opowiadaniami.