Jaka jest różnica między paradygmatami programowania deklaratywnego i proceduralnego?


Odpowiedzi:


108

Tryb rozkazujący

Istnieje kilka pod-paradygmatów imperatywnego paradygmatu programowania, na przykład paradygmaty proceduralne lub obiektowe .

W paradygmacie programowania imperatywnego opisujesz algorytm krok po kroku, na różnych stopniach abstrakcji.

Przykłady języków programowania, które wspierają paradygmat proceduralny:

  • C (i większość innych starszych języków)
  • Głównie PHP
  • W pewnym sensie wszystkie główne języki

Zorientowany obiektowo

Zwykle odnosi się do języków, które wykazują hierarchię typów, które dziedziczą zarówno metody, jak i stan od typów podstawowych do typów pochodnych, ale obejmuje również nietypowy JavaScript oparty na prototypach.

Przykłady języków programowania, które wspierają paradygmat OO:

  • Jawa

Deklaracyjny

Istnieje kilka podparadygmatów paradygmatu programowania deklaratywnego, takich jak paradygmaty programowania funkcyjnego lub logicznego.

W paradygmacie programowania deklaratywnego opisujesz wynik lub cel i otrzymujesz go za pośrednictwem „ czarnej skrzynki ”. Przeciwieństwo imperatywu.

Przykłady języków programowania obsługujących paradygmat programowania deklaratywnego:

  • yacc
  • Wierzchołek drzewa
  • SQL
  • Wyrażenia regularne
  • lex
  • XSLT
  • znaczniki, troff, CSS, VHDL

Funkcjonalny

Programowanie funkcjonalne kładzie nacisk na stosowanie funkcji bez skutków ubocznych i bez stanu zmiennego. Powyższe systemy deklaratywne wykazują pewne aspekty programowania funkcjonalnego.

Przykłady języków programowania, które wspierają deklaratywny paradygmat funkcjonalny:

  • Haskell
  • OCaml
  • Schemat
  • Erlang
  • FA#
  • Scala

61

Programowanie deklaratywne to miejsce, w którym mówisz, co chcesz, bez konieczności mówienia, jak to zrobić. W przypadku programowania proceduralnego musisz dokładnie określić kroki, aby uzyskać wynik.

Na przykład SQL jest bardziej deklaratywny niż proceduralny, ponieważ zapytania nie określają kroków prowadzących do uzyskania wyniku.


2
+1 za dobry przykład w SQL. czy możemy prosić o więcej przykładów?
mauris

5
Mauris: Może nie jest językiem programowania, ale HTML jest deklaratywny, ponieważ opisujesz to, czego chcesz (akapit z tym bitem pogrubionym), zamiast pisać „ciąg rysunkowy, ciąg pomiarowy, pozycja do przodu itp.” Innym przykładem jest Prolog, gdzie „program” to deklaratywny zbiór faktów i relacji / dedukcji oraz zapytanie. Silnik Prologu ustala, jak ocenić zapytanie: nie musisz mu mówić, jak to zrobić. Na koniec wyrażenia regularne: opisujesz wzorzec zamiast wymieniać kroki, aby sprawdzić dopasowanie.
itowlson,

MXML (część frameworka Flex) jest deklaratywny: mówisz mu, w jakiej kolejności chcesz, aby Twoje obiekty / kontenery były wyświetlane, a on obsługuje układ w zależności od tego, czy kazałeś mu układać się poziomo, czy pionowo. ActionScript 3 jest proceduralny i obsługuje paradygmaty OOP.
Hooray Im Helping

makefiles to kolejny dość znany język deklaratywny
Stefano Borini

25

Pozwólcie, że dam wam przykład z prawdziwego świata: potrzebuję filiżanki herbaty.

Proceduralny:

  1. Idź do kuchni
  2. Zdobądź cukier, mleko i herbatę,
  3. Wymieszaj je i podgrzej nad ogniem, aż się zagotuje
  4. Włóż to do filiżanki i przynieś mi

Deklaracyjny:

  1. Daj mi filiżankę herbaty.

W języku proceduralnym definiujesz cały proces i podajesz kroki, jak to zrobić. Po prostu dostarczasz zamówienia i określasz, jak proces będzie obsługiwany.

W języku deklaratywnym po prostu ustawiasz polecenie lub kolejność i pozwalasz, aby system miał wykonać to zamówienie. Potrzebujesz tylko wyniku, nie zastanawiając się, jak to zrobić.


2
Ten niezwykle uproszczony przykład faktycznie (trochę) doprowadził mnie do sedna. Ale jedna rzecz wciąż mnie niepokoi, próbując zrozumieć różnicę - a co, jeśli nie ma komendy „Podaj mi filiżankę herbaty”? Czy musiałbyś wtedy sam go stworzyć? Jeśli tak, czy nie utworzyłbyś funkcji podobnej do przykładu proceduralnego? Myślę, że to, co mnie wprawia w zakłopotanie, to fakt, że wygląda na to, że proceduralne i deklaratywne nie są ustalonymi właściwościami żadnego konkretnego języka , ale raczej sposobem, w jaki się go używa? Możesz powiedzieć „Podaj mi filiżankę herbaty” w Javie, jeśli to dostępna metoda ...
Magnus W

3
Zastanawiam się, czy „1. Herbata, Earl Grey, Gorąca” byłaby lepszym przykładem. Deklaruje, co należy dostarczyć, a nie jakie działania należy wykonać (
``

Magnus, twoje pytanie jest absolutnie słuszne. Moim zdaniem języki deklaratywne są bardziej językami wysokiego poziomu i wywodzą się z proceduralnych. Pamiętasz czas, kiedy programiści musieli używać linii poleceń, aby dodać dwie liczby? Teraz możesz uzyskać SUMĘ dwóch lub więcej liczb za pomocą prostej funkcji. Więc z mojej perspektywy, jeśli nie ma polecenia „Podaj mi filiżankę herbaty”, musisz je utworzyć. Kiedy następna osoba spróbuje użyć, będzie tam. Według mojej słabej wiedzy. Dzięki
Muhammad Zeeshan Tahir

5

Programowanie proceduralne:

W programowaniu proceduralnym, gdy program jest uruchamiany, postępuje zgodnie z zestawem instrukcji. Instrukcje mogą się zmieniać w zależności od zawartości niektórych plików lub pamięci, ale ogólnie nie różnią się znacznie. dane wejściowe do programu zazwyczaj nie pochodzą z danych wprowadzanych przez użytkownika w czasie rzeczywistym, ale raczej z wstępnie zebranego zestawu danych.

Programowanie deklaratywne:

W deklaratywnym programowaniu sterowanym zdarzeniami skupia się wokół zbioru danych z opcjonalnymi akcjami, które program może na nich wykonać. Na przykład każde „zdarzenie” w edytorze tekstu to dowolna zmiana myszy lub klawiatury (lub pliku), która ma wpływ na dane, dokumenty. Nie trzeba ich wykonywać w żadnej kolejności. Programowanie sterowane zdarzeniami ma postać małych programów (programów obsługi zdarzeń), które wszystkie pracują na wspólnym zestawie danych, dzięki czemu każdy mały program może używać tych samych danych, czyli dokumentu w tym przykładzie.


0

Główna różnica między dwoma językami programowania polega na tym , że w programowaniu proceduralnym mówimy komputerowi, jak rozwiązać problem, aw programowaniu deklaratywnym mówimy komputerowi, jaki problem chcemy rozwiązać.


0

Aby odnieść się do komentarza ansibla i być może podać przykład między różnicami między nimi. Ansible ma charakter proceduralny, w którym coś takiego jak marionetka lub terraform jest deklaratywne. Na przykład, tworzysz plik yaml ansible, aby wdrożyć 10 instancji ec2 w następujący sposób:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Gdybyś miał uruchomić ten plik dwa razy, skończyłbyś z 20 instancjami t2.micro ec2. Jeśli napiszesz odpowiednik w języku deklaratywnym, takim jak terraform, i uruchomisz go dwukrotnie, uruchomionych byłoby tylko 10 instancji t2.micro, niezależnie od tego, ile razy go uruchomiłeś. Języki deklaratywne określają stan końcowy. Języki proceduralne po prostu robią to, co im każesz, bez względu na obecny lub przeszły stan.


-1

Więc YAML jest deklaratywnym językiem programowania? Ponieważ definiujemy, czego chcemy, zamiast pisać rzeczywistą logikę.

Pytam o to, ponieważ jeśli ktoś zna Ansible, które jest narzędziem do zarządzania konfiguracją, używa YAML, ale nadal należy do kategorii języków proceduralnych.



To bardziej przypomina bardzo twierdzący komentarz, a nie odpowiedź
zardilior

-2

W podejściu proceduralnym kodujesz swoją instrukcję, aby osiągnąć wynik. W podejściu deklaratywnym definiujesz, co należy rozwiązać, jako wiedzę o rozwiązaniu problemu. Przyjrzyj się przykładowi podejścia proceduralnego lub deklaratywnego, które zaimplementowałem w obu podejściach.

Jak widać na przykładzie, w podejściu deklaratywnym nie trzeba instruować JAK rozwiązać problem.


Odwołujesz się do przykładów spoza witryny, tak jakby zostały tutaj napisane. Jako część odpowiedzi podaj swoje przykłady.
ChronoFish
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.