Ciągle słyszę ten termin w różnych kontekstach. Co to jest?
programming-languages
declarative
glossary
Brian G.
źródło
źródło
Odpowiedzi:
Programowanie deklaratywne polega na pisaniu kodu w sposób opisujący to, co chcesz zrobić, a nie sposób, w jaki chcesz to zrobić. Kompilator musi ustalić, jak to zrobić.
Przykładami deklaratywnych języków programowania są SQL i Prolog.
źródło
Inne odpowiedzi już fantastycznie wyjaśniają, czym jest programowanie deklaratywne, dlatego przedstawię kilka przykładów, dlaczego może to być przydatne.
Kontekst Niezależność
Programy deklaratywne są niezależne od kontekstu . Ponieważ deklarują jedynie ostateczny cel, ale nie pośrednie kroki do osiągnięcia tego celu, ten sam program może być wykorzystywany w różnych kontekstach. Jest to trudne w przypadku programów imperatywnych , ponieważ często zależą one od kontekstu (np. Stan ukryty).
Weź
yacc
jako przykład. Jest to także generator parserów. kompilator kompilator, zewnętrzna deklaratywna DSL do opisywania gramatyki języka, dzięki czemu parser dla tego języka może być automatycznie generowany z opisu. Ze względu na niezależność od kontekstu, przy pomocy takiej gramatyki możesz robić wiele różnych rzeczy:yacc
)I wiele więcej …
Optymalizacja
Ponieważ nie określasz komputera, jakie kroki należy podjąć i w jakiej kolejności, może on znacznie swobodniej zmieniać układ programu, a nawet wykonywać niektóre zadania równolegle. Dobrym przykładem jest planer zapytań i optymalizator zapytań do bazy danych SQL. Większość baz danych SQL pozwala wyświetlić zapytanie, które faktycznie wykonują, w porównaniu z zapytaniem, o które je poprosiłeś . Często te zapytania nic nie wyglądająlubią się nawzajem. Planer zapytań bierze pod uwagę rzeczy, o których nawet byś nie marzył: na przykład opóźnienie obrotu talerza dysku lub fakt, że jakaś inna aplikacja dla zupełnie innego użytkownika właśnie wykonała podobne zapytanie i tabelę, którą jesteś dołączanie się i że tak ciężko pracowałeś, aby uniknąć ładowania, i tak jest już w pamięci.
Jest to ciekawy kompromis tutaj: maszyna musi pracować ciężej, aby dowiedzieć się, jak coś zrobić, niż miałoby to miejsce w języku bezwzględnej, ale kiedy to robi zrozumieć to, że ma znacznie większą swobodę i wiele więcej informacji na optymalizację etap.
źródło
Luźno:
Programowanie deklaratywne dąży do:
Programowanie imperatywne dąży do:
W rezultacie styl imperatywny pomaga czytelnikowi zrozumieć mechanikę tego, co faktycznie robi system, ale może dać niewielki wgląd w problem, który ma rozwiązać. Z drugiej strony deklaratywny styl pomaga czytelnikowi zrozumieć dziedzinę problemu i podejście, jakie system przyjmuje do rozwiązania problemu, ale jest mniej pouczający w kwestii mechaniki.
Prawdziwe programy (nawet te napisane w językach, które faworyzują końce spektrum, takie jak ProLog lub C) zazwyczaj mają oba style obecne w różnym stopniu w różnych punktach, aby zaspokoić różne złożoności i potrzeby komunikacyjne utworu. Jeden styl nie jest lepszy od drugiego; służą po prostu innym celom i, podobnie jak w przypadku wielu rzeczy w życiu, umiar jest kluczowy.
źródło
Oto przykład.
W CSS (używanym do stylizowania stron HTML), jeśli chcesz, aby element obrazu miał 100 pikseli wysokości i 100 pikseli szerokości, po prostu „oświadczasz”, że to, co chcesz, w następujący sposób:
Możesz uznać CSS za deklaratywny język „arkusza stylów”.
Silnik przeglądarki, który czyta i interpretuje ten CSS, może sprawić, że obraz będzie wyglądał tak wysoko i tak szeroko, jak chce. Różne silniki przeglądarki (np. Silnik IE, silnik Chrome) będą realizować to zadanie inaczej.
Ich unikalne implementacje NIE są oczywiście napisane w języku deklaratywnym, ale w proceduralnym, takim jak Assembly, C, C ++, Java, JavaScript lub Python. Ten kod to kilka kroków, które należy wykonać krok po kroku (i mogą obejmować wywołania funkcji). Może to robić interpolować wartości pikseli i renderować na ekranie.
źródło
Przykro mi, ale muszę się nie zgodzić z wieloma innymi odpowiedziami. Chciałbym zatrzymać to mętne niezrozumienie definicji programowania deklaratywnego.
Definicja
Przezroczystość referencyjna (RT) wyrażeń podrzędnych jest jedynym wymaganym atrybutem deklaratywnego wyrażenia programistycznego , ponieważ jest to jedyny atrybut, który nie jest współdzielony z programowaniem imperatywnym.
Inne cytowane atrybuty programowania deklaratywnego pochodzą z tej RT. Kliknij powyższy link, aby uzyskać szczegółowe wyjaśnienie.
Przykład arkusza kalkulacyjnego
Dwie odpowiedzi wspomniały o programowaniu arkuszy kalkulacyjnych. W przypadkach, gdy programowanie arkusza kalkulacyjnego (inaczej formuł) nie ma dostępu do zmiennego stanu globalnego , jest to programowanie deklaratywne. To dlatego, że komórki Zmienne wartości są monolityczne wejście i wyjście z
main()
(cały program). Nowe wartości nie są zapisywane w komórkach po wykonaniu każdej formuły, dlatego nie można ich modyfikować przez cały czas życia programu deklaratywnego (wykonanie wszystkich formuł w arkuszu kalkulacyjnym). W związku z tym formuły postrzegają te zmienne komórki jako niezmienne. Funkcja RT ma dostęp do niezmiennego stanu globalnego (a także zmiennego stanu lokalnego ).Zatem zdolność do mutowania wartości w komórkach, gdy program kończy się (jako wyjście
main()
), nie powoduje, że można je modyfikować przechowywane wartości w kontekście reguł. Kluczowym rozróżnieniem jest to, że wartości komórek nie są aktualizowane po wykonaniu każdej formuły arkusza kalkulacyjnego, dlatego kolejność wykonywania formuł nie ma znaczenia. Wartości komórek są aktualizowane po wykonaniu wszystkich formuł deklaratywnych.źródło
Programowanie deklaratywne to obraz, przy czym programowanie imperatywne to instrukcje do malowania tego obrazu.
Pisząc w sposób deklaratywny, piszesz „Mówisz, co to jest”, zamiast opisywać kroki, jakie powinien podjąć komputer, aby dostać się tam, gdzie chcesz.
Kiedy używasz XML do oznaczania danych, używasz deklaratywnego programowania, ponieważ mówisz: „To jest osoba, która ma urodziny, a tam jest adres”.
Kilka przykładów połączenia programowania deklaratywnego i imperatywnego w celu uzyskania większego efektu:
Windows Presentation Foundation używa deklaratywnej składni XML do opisania wyglądu interfejsu użytkownika oraz relacji (powiązań) między kontrolkami i bazowymi strukturami danych.
Strukturalne pliki konfiguracyjne używają deklaratywnej składni (tak proste, jak pary „klucz = wartość”), aby zidentyfikować, co oznacza ciąg lub wartość danych.
HTML zaznacza tekst znacznikami, które opisują rolę każdego fragmentu tekstu w stosunku do całego dokumentu.
źródło
Programowanie deklaratywne to programowanie z deklaracjami, tzn. Zdaniami deklaratywnymi. Zdania deklaratywne mają szereg właściwości, które odróżniają je od zdań rozkazujących. W szczególności deklaracjami są:
Istotną kwestią jest to, że są to wszystkie właściwości strukturalne i są prostopadłe do przedmiotu. W deklaratywnym nie chodzi o „Co vs. Jak” . Możemy zadeklarować (reprezentować i ograniczyć) „jak” równie łatwo, jak deklarujemy „co” . Deklaratywna jest struktura, a nie treść. Programowanie deklaratywne ma znaczący wpływ na to, w jaki sposób wyodrębniamy i refaktoryzujemy nasz kod oraz jak modulujemy go do podprogramów, ale nie tak bardzo w modelu domeny.
Często możemy zmienić z trybu rozkazującego na tryb deklaratywny, dodając kontekst. Np. „Skręć w lewo. (... poczekaj na to ...) Skręć w prawo.” na „Bob skręci w lewo na skrzyżowaniu Foo i Bar o 11:01. Bob skręci w prawo na skrzyżowaniu Bar i Baz o 11:06”. Zauważ, że w tym drugim przypadku zdania są idempotentne i przemienne, podczas gdy w pierwszym przypadku zmiana lub powtórzenie zdań poważnie zmieniłoby znaczenie programu.
Jeśli chodzi o monotonię , deklaracje mogą dodawać ograniczenia, które odejmują możliwości . Ale ograniczenia wciąż dodają informacje (a dokładniej, ograniczenia są informacją). Jeśli potrzebujemy deklaracji zmieniających się w czasie, typowe jest modelowanie tego z wyraźną semantyką czasową - np. Od „kula jest płaska” do „kula jest płaska w czasie T”. Jeśli mamy dwie sprzeczne deklaracje, mamy niespójny system deklaratywny, chociaż można to rozwiązać poprzez wprowadzenie miękkich ograniczeń (priorytetów, prawdopodobieństw itp.) Lub wykorzystanie logiki parakonsekwentnej.
źródło
Opisywanie komputerowi tego, czego chcesz, a nie jak coś zrobić.
źródło
wyobraź sobie stronę programu Excel. Z kolumnami wypełnionymi formułami do obliczenia zwrotu podatku.
Cała logika jest zadeklarowana w komórkach, kolejność obliczeń jest ustalana na podstawie samej formuły, a nie proceduralnie.
Na tym właśnie polega programowanie deklaratywne. Zadeklarujesz przestrzeń problemu i rozwiązanie, a nie przebieg programu.
Prolog jest jedynym deklaratywnym językiem, którego używam. Wymaga to innego sposobu myślenia, ale dobrze jest nauczyć się, jeśli tylko narażasz się na coś innego niż typowy język programowania proceduralnego.
źródło
Dopracowałem swoje rozumienie programowania deklaratywnego od grudnia 2011 r., Kiedy udzieliłem odpowiedzi na to pytanie. Oto moje obecne zrozumienie.
Długa wersja mojego zrozumienia (badania) została szczegółowo opisana pod tym linkiem , który należy przeczytać, aby uzyskać głębokie zrozumienie podsumowania, które przedstawię poniżej.
Programowanie imperatywne polega na zapisywaniu i odczytywaniu stanu zmiennego, a zatem kolejność i / lub powielanie instrukcji programu może zmienić zachowanie programu (semantykę) (a nawet spowodować błąd, tj. Niezamierzone zachowanie).
W najbardziej naiwnym i ekstremalnym sensie (który twierdziłem w mojej poprzedniej odpowiedzi) programowanie deklaratywne (DP) unika całego przechowywanego stanu zmiennego, dlatego uporządkowanie i / lub powielanie instrukcji programu NIE może zmienić zachowania (semantyki) programu .
Jednak taka ekstremalna definicja nie byłaby bardzo przydatna w prawdziwym świecie, ponieważ prawie każdy program wymaga zmagazynowanego stanu. Na przykład arkusz kalkulacyjny zgodny z tą definicją ekstremalnych DP, ponieważ cały kod programu jest prowadzony do końca z jednego statycznego kopii stanu wejścia, zanim zostaną zapisane nowe kraje. Następnie, jeśli jakikolwiek stan zostanie zmieniony, jest to powtarzane. Ale większość programów w świecie rzeczywistym nie może być ograniczona do takiego monolitycznego modelu zmian stanu.
Bardziej użyteczną definicją DP jest to, że kolejność i / lub powielanie instrukcji programowania nie zmienia żadnej nieprzejrzystej semantyki. Innymi słowy, nie występują ukryte losowe zmiany semantyki - wszelkie zmiany w kolejności instrukcji programu i / lub duplikacji powodują jedynie zamierzone i przejrzyste zmiany w zachowaniu programu.
Następnym krokiem byłoby omówienie, które modele programowania lub paradygmaty pomagają w DP, ale nie o to tutaj chodzi.
źródło
Functional programming
jest obecnie modnym słowem, które jest zasadniczo podzbiorem deklaratywnego programowania. LINQ w języku C # jest elementem programowania funkcjonalnego, gdy sam język jest z natury konieczny. Tak więc C # staje się rodzajem hybrydy opartej na tej definicji.Jest to metoda programowania oparta na opisie tego, co należy zrobić lub być, a nie na tym , jak to powinno działać.
Innymi słowy, nie piszesz algorytmów wykonanych z wyrażeń, po prostu układasz, jak chcesz, aby rzeczy były. Dwa dobre przykłady to HTML i WPF.
Ten artykuł w Wikipedii stanowi dobry przegląd: http://en.wikipedia.org/wiki/Declarative_programming
źródło
Ponieważ napisałem moją wcześniejszą odpowiedź, sformułowałem nową definicję właściwości deklaratywnej, która jest cytowana poniżej. Zdefiniowałem także programowanie imperatywne jako podwójną właściwość.
Ta definicja jest lepsza od tej, którą podałem w poprzedniej odpowiedzi, ponieważ jest zwięzła i bardziej ogólna. Ale może być trudniej zrozumieć, ponieważ implikacje twierdzeń o niekompletności mających zastosowanie do programowania i życia w ogólności są trudne dla ludzi, aby otoczyli umysł.
Cytowany wyjaśnienie definicji omawia rolę czysto funkcjonalne sztuki programowania w języku programowania deklaratywnego.
Edycja: Zamieściłem następujący komentarz na blogu Roberta Harpera:
źródło
Programowanie deklaratywne to „czynność programowania w językach zgodnych z modelem mentalnym programisty, a nie z modelem operacyjnym maszyny”.
Różnicę między programowaniem deklaratywnym a imperatywnym dobrze ilustruje problem analizy danych strukturalnych.
Program imperatywny używałby wzajemnie rekurencyjnych funkcji do pobierania danych wejściowych i generowania danych. Program deklaratywny wyraziłby gramatykę, która określa strukturę danych, dzięki czemu można je następnie przeanalizować.
Różnica między tymi dwoma podejściami polega na tym, że program deklaratywny tworzy nowy język, który jest ściślej odwzorowany w modelu mentalnym problemu niż w języku goszczącym.
źródło
Może to zabrzmieć dziwnie, ale dodam Excela (lub dowolny arkusz kalkulacyjny) do listy systemów deklaratywnych. Dobry przykład tego podano tutaj .
źródło
Wyjaśniłbym to, ponieważ DP to sposób na wyrażenie
... i tam, gdzie istnieje silnik odliczania, zwykle pracujący z algorytmem unifikacji w celu znalezienia celów.
źródło
O ile wiem, zaczęto go używać do opisywania systemów programistycznych takich jak Prolog, ponieważ prolog (rzekomo) polega na deklarowaniu rzeczy w abstrakcyjny sposób.
W coraz większym stopniu oznacza to bardzo mało, ponieważ ma definicję podaną przez użytkowników powyżej. Powinno być jasne, że istnieje luka między deklaratywnym programowaniem Haskell, a w stosunku do deklaratywnego programowania HTML.
źródło
Kilka innych przykładów programowania deklaratywnego:
Programowanie deklaratywne jest przyjemne, ponieważ może uprościć twój mentalny model * kodu i może być bardziej skalowalne.
Załóżmy na przykład, że masz funkcję, która robi coś z każdym elementem tablicy lub listy. Tradycyjny kod wyglądałby tak:
Nic wielkiego. Ale co, jeśli użyjesz bardziej deklaratywnej składni i zamiast tego zdefiniujesz DoSomething () jako akcję? Możesz to powiedzieć w ten sposób:
Jest to oczywiście bardziej zwięzłe. Ale jestem pewien, że masz więcej obaw niż tylko zapisywanie dwóch linii kodu tu i tam. Wydajność, na przykład. Po staremu przetwarzanie musiało być wykonywane po kolei. Co zrobić, jeśli metoda .ForEach () ma sposób zasygnalizować, że może ona automatycznie przetwarzać dane równolegle? Teraz nagle twój kod jest wielowątkowy w bardzo bezpieczny sposób i zmieniłeś tylko jeden wiersz kodu. W rzeczywistości istnieje rozszerzenie .Net, które pozwala to zrobić.
źródło
To zależy od tego, jak prześlesz odpowiedź na tekst. Ogólnie rzecz biorąc, możesz spojrzeć na program w pewnym widoku, ale zależy to od tego, pod jakim kątem patrzysz na problem. Zacznę od rozpoczęcia programu: Dim Bus, Car, Time, Height As Integr
Znowu zależy to od ogólnego problemu. Być może będziesz musiał go skrócić z powodu programu. Mam nadzieję, że to pomaga i potrzebuję informacji zwrotnej, jeśli nie. Dziękuję Ci.
źródło