Programowanie deklaratywne - Declarative programming
W informatyce , programowanie deklaratywne jest programowanie paradygmat -a styl budowania struktury i elementy programów komputerowych-że wyraża logikę obliczeń bez opisywania jej przepływ sterowania .
Wiele języków, które stosują ten styl, próbuje zminimalizować lub wyeliminować skutki uboczne , opisując to, co program musi osiągnąć w dziedzinie problemowej , zamiast opisywać, jak to osiągnąć jako sekwencję elementów podstawowych języka programowania ( jak pozostawić do implementacja języka ). Jest to sprzeczne z programowaniem imperatywnym , które implementuje algorytmy w jawnych krokach.
Programowanie deklaratywne często traktuje programy jako teorie logiki formalnej , a obliczenia jako dedukcje w tej przestrzeni logicznej. Programowanie deklaratywne może znacznie uprościć pisanie programów równoległych .
Wspólne języki deklaratywne obejmują te z bazy danych języków zapytań (np SQL , XQuery ), wyrażenia regularne , programowania logicznego , programowania funkcjonalne i zarządzania konfiguracją systemów.
Definicja
Programowanie deklaratywne jest często definiowane jako dowolny styl programowania, który nie jest konieczny . Szereg innych powszechnych definicji próbuje go zdefiniować, po prostu przeciwstawiając go programowaniu imperatywnemu. Na przykład:
- Program wysokiego poziomu opisujący, co powinno wykonać obliczenie.
- Każdy język programowania, który nie ma skutków ubocznych (a dokładniej, jest referencyjnie przezroczysty )
- Język wyraźnie korespondujący z logiką matematyczną .
Definicje te w znacznym stopniu się pokrywają.
Programowanie deklaratywne to nieimperatywny styl programowania, w którym programy opisują pożądane wyniki bez jawnego wyświetlania poleceń lub kroków, które należy wykonać. Funkcjonalne i logiczne języki programowania charakteryzują się deklaratywnym stylem programowania. W logicznych językach programowania programy składają się z instrukcji logicznych, a program wykonuje się, wyszukując dowody instrukcji.
W czystym języku funkcjonalnym , takim jak Haskell , wszystkie funkcje są bez skutków ubocznych , a zmiany stanu są reprezentowane tylko jako funkcje przekształcające stan, który jest jawnie reprezentowany jako obiekt pierwszej klasy w programie. Chociaż czysto funkcjonalne języki nie są konieczne, często dają możliwość opisania efektu funkcji jako serii kroków. Inne języki funkcjonalne, takie jak Lisp , OCaml i Erlang , obsługują mieszankę programowania proceduralnego i funkcjonalnego.
Niektóre logiczne języki programowania, takie jak Prolog , i języki zapytań do baz danych, takie jak SQL, choć z zasady deklaratywne, obsługują również proceduralny styl programowania.
Subparadygmaty
Programowanie deklaratywne to termin zbiorczy, który obejmuje szereg bardziej znanych paradygmatów programowania .
Programowanie ograniczeń
Programowanie z ograniczeniami określa relacje między zmiennymi w postaci ograniczeń, które określają właściwości rozwiązania docelowego. Zbiór ograniczeń jest rozwiązywany przez nadanie wartości każdej zmiennej, tak aby rozwiązanie było zgodne z maksymalną liczbą ograniczeń. Programowanie z ograniczeniami często uzupełnia inne paradygmaty: programowanie funkcjonalne, logiczne, a nawet imperatywne.
Języki specyficzne dla domeny
Dobrze znane przykłady deklaratywnych języków specyficznych dla domeny (DSL) obejmują język wejściowy generatora parsera yacc , QML , język specyfikacji kompilacji Make, język zarządzania konfiguracją Puppet , wyrażenia regularne i podzbiór SQL (na przykład zapytania SELECT ). DSL mają tę zaletę, że są przydatne, chociaż niekoniecznie muszą być kompletne według Turinga , co ułatwia językowi czysto deklaratywny charakter.
Wiele języków znaczników, takich jak HTML , MXML , XAML , XSLT lub inne języki znaczników interfejsu użytkownika, są często deklaratywne. Na przykład HTML opisuje tylko to, co powinno pojawić się na stronie internetowej — nie określa ani przepływu sterowania renderowaniem strony, ani możliwych interakcji strony z użytkownikiem.
Od 2013 r. niektóre systemy oprogramowania łączą tradycyjne języki znaczników interfejsu użytkownika (takie jak HTML) z deklaratywnymi znacznikami, które określają, co (ale nie w jaki sposób) powinny zrobić systemy serwerów zaplecza, aby obsługiwać zadeklarowany interfejs. Takie systemy, zwykle używające specyficznej dla domeny przestrzeni nazw XML , mogą zawierać abstrakcje składni bazy danych SQL lub sparametryzowane wywołania usług internetowych przy użyciu reprezentacji stanu (REST) i SOAP .
Programowanie funkcjonalne
Funkcjonalne języki programowania, takie jak Haskell , Scheme i ML , oceniają wyrażenia za pomocą aplikacji funkcji. W przeciwieństwie do powiązanego, ale bardziej imperatywnego paradygmatu programowania proceduralnego, programowanie funkcjonalne kładzie niewielki nacisk na jawne sekwencjonowanie. Na przykład w Scheme kolejność oceny wielu rodzajów wyrażeń podrzędnych jest niezdefiniowana lub niejawna. Zamiast tego obliczenia charakteryzują się różnymi rodzajami rekurencyjnych zastosowań i kompozycji funkcji wyższego rzędu , z wyraźnymi odniesieniami do I/O i danych pojawiającymi się oszczędnie , a mutacje stanu unikane lub enkapsulowane tam, gdzie to możliwe.
Języki hybrydowe
Pliki Makefile, na przykład, określają zależności w sposób deklaratywny, ale zawierają również niezbędną listę działań do wykonania. Podobnie yacc określa deklaratywnie gramatykę bezkontekstową, ale zawiera fragmenty kodu z języka hosta, co zwykle jest konieczne (takie jak C ).
Programowanie logiczne
Logiczne języki programowania, takie jak stan Prolog i relacje zapytań. Specyfika jak te kwerendy są odbierane jest do wykonania i jego twierdzenie Prover, ale zazwyczaj przybiera formę jakiegoś zjednoczenia . Podobnie jak programowanie funkcjonalne, wiele języków programowania logicznego dopuszcza skutki uboczne i w rezultacie nie są ściśle deklaratywne.
Modelowanie
Modele lub matematyczne reprezentacje systemów fizycznych mogą być implementowane w deklaratywnym kodzie komputerowym. Kod zawiera szereg równań, a nie imperatywnych przypisań, które opisują („deklarują”) relacje behawioralne. Kiedy model jest wyrażony w tym formalizmie, komputer jest w stanie wykonać manipulacje algebraiczne, aby jak najlepiej sformułować algorytm rozwiązania. Przyczynowość matematyczna jest zazwyczaj narzucana na granicach systemu fizycznego, podczas gdy opis behawioralny samego systemu jest deklaratywny lub bezprzyczynowy. Języki i środowiska modelowania deklaratywnego obejmują Analytica , Modelica i Simile .
Zobacz też
- Porównanie paradygmatów programowania
- Programowanie indukcyjne
- Lista deklaratywnych języków programowania
Bibliografia
Zewnętrzne linki
- Fransa Coenena. Charakterystyka deklaratywnych języków programowania . 1999.
- Roberta Harpera .
- Olofa Torgerssona. Uwaga na temat paradygmatów programowania deklaratywnego i przyszłości programowania definicyjnego . 1996.