Czym jest programowanie deklaratywne? [zamknięte]

Ciągle słyszę ten termin w kilku różnych kontekstach. O co chodzi?

Author: Sam Hasler, 2008-09-25

18 answers

Programowanie deklaratywne jest wtedy, gdy piszesz swój kod w taki sposób, że opisuje to, co chcesz zrobić, a nie jak chcesz to zrobić. To jest pozostawione do kompilatora, aby dowiedzieć się, jak.

Przykładami deklaratywnych języków programowania są SQL i Prolog.

 115
Author: 1800 INFORMATION,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-28 09:19:28

Inne odpowiedzi już doskonale wyjaśniają, czym jest programowanie deklaratywne, więc podam kilka przykładów, dlaczego może to być przydatne.

Niezależność Kontekstu

Programy deklaratywne są niezależne od kontekstu . Ponieważ tylko deklarują, jaki jest ostateczny cel, a nie pośrednie kroki do osiągnięcia tego celu, ten sam program może być używany w różnych kontekstach. Trudno to zrobić z imperatywnymi programami , ponieważ często zależy od kontekstu(np. stan ukryty).

Weź yacc jako przykład. To generator parserów aka. kompilator kompilator, zewnętrzny deklaratywny DSL do opisu gramatyki języka, tak aby parser dla tego języka mógł być automatycznie wygenerowany z opisu. Ze względu na swoją niezależność kontekstową, możesz zrobić wiele różnych rzeczy z taką gramatyką:

  • generowanie parsera C dla tej gramatyki (oryginalny przypadek użycia dla yacc)
  • Wygeneruj C++ parser dla tej gramatyki
  • generowanie parsera Javy dla tej gramatyki (za pomocą Jaya)
  • W języku C# jest to język, który nie jest używany w języku C#.]}
  • Wygeneruj Parser Ruby dla tej gramatyki (używając Racc)
  • Tworzenie wizualizacji drzewa dla tej gramatyki (za pomocą GraphViz)
  • po prostu wykonaj ładne drukowanie, fantazyjne formatowanie i podświetlanie składni samego pliku źródłowego yacc i dołącz go do podręcznika jako specyfikację składniową twojego język

I wiele innych ...

Optymalizacja

Ponieważ nie przepisujesz komputerowi, które kroki należy wykonać i w jakiej kolejności, może on znacznie swobodniej zmieniać twój program, a może nawet wykonywać niektóre zadania równolegle. Dobrym przykładem jest planista zapytań i optymalizator zapytań dla bazy danych SQL. Większość baz danych SQL pozwala na wyświetlenie zapytania, które są faktycznie wykonywalne w porównaniu do zapytania, które poprosił je wykonać. Często te zapytania wyglądają nic jak siebie nawzajem. Planista zapytań bierze pod uwagę rzeczy, o których nawet byś nie marzył: na przykład opóźnienie obrotowe płyty dyskowej lub fakt, że jakaś zupełnie inna aplikacja dla zupełnie innego użytkownika właśnie wykonała podobne zapytanie, a tabela, z którą się łączysz i że tak ciężko pracowałeś, aby uniknąć ładowania, i tak jest już w pamięci.

Jest tu interesujący kompromis: maszyna musi pracować ciężej, aby dowiedzieć się jak zrobić coś, co nie byłoby w języku imperatywnym, ale kiedy wykombinuje to, ma o wiele więcej swobody i o wiele więcej informacji na etapie optymalizacji.

 71
Author: Jörg W Mittag,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-28 03:35:13

Luźno:

Programowanie deklaratywne ma tendencję do:-

  • zbiór deklaracji lub deklaracji, z których każdy ma znaczenie (często w dziedzinie problemu) i mogą być rozumiane niezależnie i w izolacji.

Programowanie imperatywne ma tendencję do:-

  • sekwencje poleceń, z których każdy wykonuje jakąś akcję; ale które mogą, ale nie muszą mieć znaczenia w obszarze problemu.

W rezultacie imperatyw styl pomaga czytelnikowi zrozumieć mechanikę tego, co system faktycznie robi, 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, które system przyjmuje w kierunku rozwiązania problemu, ale jest mniej pouczające w kwestii mechaniki.

Prawdziwe programy (nawet te napisane w językach, które sprzyjają końcom widma, takich jak ProLog lub C) mają tendencję do prezentowania obu stylów 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żą one po prostu różnym celom i, jak w przypadku wielu rzeczy w życiu, umiar jest kluczowy.

 12
Author: William Payne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-30 12:34:37

Przepraszam, ale muszę się nie zgodzić z wieloma innymi odpowiedziami. Chciałbym zaprzestać tego niezrozumienia definicji programowania deklaratywnego.

Definicja

Transparentność Referencjalna (RT) wyrażeń podrzędnych jest atrybutem tylko wymaganym deklaratywnego wyrażenia programistycznego , ponieważ jest to jedyny atrybut, który nie jest współdzielony z programowaniem imperatywnym.

Inne cytowane atrybuty deklaratywne programowanie, Proszę kliknąć na hiperłącze powyżej, aby uzyskać szczegółowe wyjaśnienie.

Przykład arkusza kalkulacyjnego

Dwie odpowiedzi mówiły o programowaniu arkusza kalkulacyjnego. W przypadkach, gdy programowanie arkusza kalkulacyjnego (a.k.a. formuły) nie ma dostępu do mutable global Stan, to jest to programowanie deklaratywne. Dzieje się tak, ponieważ zmiennymi wartościami komórek są monolityczne wejście i wyjście main() (cały program). Nowe wartości nie są zapisywane do komórek po wykonaniu każdej formuły, a więc nie są mutowalne przez cały okres życia programu deklaratywnego (wykonanie wszystkich formuł w arkuszu kalkulacyjnym). Tak więc w stosunku do siebie, formuły postrzegają te mutowalne komórki jako niezmienne. Funkcja RT może mieć dostęp do immutable global state (oraz mutable local state).

W ten sposób zdolność do mutacji wartości w komórkach po zakończeniu programu (jako wyjście z main()), nie czyni ich zmiennymi przechowywanych wartości w kontekście reguł. Kluczową różnicą jest to, że wartości komórek nie są aktualizowane po wykonaniu każdej formuły arkusza kalkulacyjnego, więc kolejność wykonywania formuł nie ma znaczenia. Wartości komórek są aktualizowane po wykonaniu wszystkich formuł deklaratywnych.

 11
Author: Shelby Moore III,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-17 06:48:11

Programowanie deklaratywne jest obrazem, gdzie programowanie imperatywne jest instrukcją do malowania tego obrazu.

Piszesz w deklaratywnym stylu, jeśli "mówisz, co to jest", zamiast opisywać kroki, które komputer powinien podjąć, aby dostać się tam, gdzie chcesz.

Kiedy używasz XML do oznaczania danych, używasz programowania deklaratywnego, ponieważ mówisz "to jest osoba, to są urodziny, a tam jest adres ulicy".

Kilka przykładów gdzie programowanie deklaratywne i imperatywne łączą się dla większego efektu:

  • Windows Presentation Foundation używa deklaratywnej składni XML do opisania, jak wygląda interfejs użytkownika i jakie są relacje (powiązania) między kontrolkami a bazowymi strukturami danych.

  • Strukturyzowane pliki konfiguracyjne używają deklaratywnej składni (tak prostej, jak pary "klucz=wartość"), aby określić, co oznacza łańcuch lub wartość danych.

  • HTML zaznacza tekst ze znacznikami opisującymi rolę, jaką odgrywa każdy fragment tekstu w stosunku do całego dokumentu.

 7
Author: Chris Wenham,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 20:26:58

Wyobraź sobie stronę Excela. Z kolumnami wypełnionymi wzorami do obliczania zeznania podatkowego.

Cała logika odbywa się w komórkach, kolejność obliczeń jest określona przez samą formułę, a nie proceduralnie.

Na tym polega programowanie deklaratywne. Deklarujesz przestrzeń problemu i rozwiązanie, a nie przepływ programu.

Prolog jest jedynym deklaratywnym językiem, którego używam. Wymaga innego sposobu myślenia ale dobrze jest się nauczyć, jeśli tylko narażać się na coś innego niż typowy język programowania proceduralnego.

 6
Author: paan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 22:47:15

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 również programowanie imperatywne jako własność dualną.

[1]}ta definicja jest lepsza od tej, którą podałem w mojej wcześniejszej odpowiedzi, ponieważ jest zwięzła i bardziej ogólna. Ale może to być trudniejsze do grok, ponieważ implikacja twierdzeń niekompletności mających zastosowanie do programowania i życia w ogóle są trudne dla ludzi do owinięcia ich umysł wokół.

Przytoczone wyjaśnienie definicji omawia rolęczystego programowania funkcyjnego w programowaniu deklaratywnym.

Deklaratywny vs. imperatyw

Właściwość deklaratywna jest dziwna, rozwarta i trudna do uchwycenia w technicznie precyzyjnej definicji, która pozostaje ogólna i nie dwuznaczna, ponieważ jest naiwnym pojęciem, że możemy zadeklarować znaczenie (a. k. a semantyka) programu bez ponoszenia kosztów niezamierzone skutki uboczne. Istnieje nieodłączne napięcie między wyrażaniem znaczenia a unikaniem niezamierzonych skutków, a napięcie to w rzeczywistości wywodzi się z twierdzeń[17]}o niekompletności[3]} programowania i naszego wszechświata.

Jest uproszczone, technicznie nieprecyzyjne i często niejednoznaczne definiowanie deklaratywne jako "co robić" i imperatywne jako "Jak zrobić". Dwuznacznym przypadkiem jest " what " to " how " w program generujący program-kompilator.

Ewidentnie nieograniczona rekurencja, która sprawia, że język Turing jest kompletny , jest również analogiczna w semantyce - nie tylko w składniowej strukturze oceny (aka semantyka operacyjna). Jest to logicznie przykład analogiczny do twierdzenia Gödla - "każdy kompletny system aksjomatów jest również niespójny ". Zastanów się nad sprzeczną dziwnością tego cytatu! Jest to również przykład, który pokazuje, jak wyrażenie semantyki nie ma wiązania dającego się udowodnić, dlatego nie możemy udowodnić2 że program (i analogicznie jego semantyka) zatrzymuje vel twierdzenie o zatrzymaniu.

Twierdzenia o niekompletności wynikają z fundamentalnej natury naszego wszechświata, który zgodnie z drugim prawem termodynamiki jest " Entropia (Alias # niezależnych możliwości) jest trendem do maksimum na zawsze". Kodowanie i projektowanie programu nigdy się nie kończy - on żyje!- bo to próby zaspokojenia potrzeb realnego świata, a semantyka realnego świata zawsze się zmienia i zmienia na coraz większe możliwości. Ludzie nigdy nie przestają odkrywać nowych rzeczy (w tym błędów w programach; -).

Aby precyzyjnie i technicznie uchwycić to wspomniane wcześniej pożądane pojęcie w tym dziwnym wszechświecie, który nie ma krawędzi (zastanów się nad tym! nie ma "zewnątrz" naszego wszechświata), wymaga zwięzłej, ale zwodniczo-Nie prostej definicji, która będzie brzmiała niepoprawnie, dopóki nie zostanie wyjaśniona głęboko.

Definicja:


Właściwość deklaratywna polega na tym, że istnieje tylko jeden możliwy zbiór wyrażeń, które mogą wyrazić każdy konkretny semantyczny moduł.

Własność imperatywna3 jest podwójną, gdzie semantyka jest niespójna pod względem składu i / lub może być wyrażona za pomocą wariacji zestawów twierdzeń.


Ta definicja deklaratywna jest odrębnie lokalna w semantycznym scope, co oznacza, że wymaga, aby semantyk modularny zachowywał swoje spójne znaczenie niezależnie od tego, gdzie i jak jest instancjonowany i stosowany w globalnym scope. Tak więc każdy deklaratywny semantyczny modułowy powinien być wewnętrznie ortogonalny dla wszystkich możliwych innych - a nie niemożliwy (z powodu twierdzeń o niekompletności) globalny algorytm lub model obserwowania spójności, co jest również punktem "więcej nie zawsze jest lepsze" Autor: Robert Harper, profesor Informatyka na Carnegie Mellon University, jeden z projektantów standardu ML.

Przykładami tych modułowych semantyki deklaratywnej są funktory teorii kategorii, np. Applicative, nominalne typowanie, przestrzenie nazw, nazwane pola i w. r. t. do operacyjnego poziomu semantyki, a następnie czystego programowania funkcyjnego.

Tak dobrze zaprojektowane języki deklaratywne mogą wyraźniej wyrażać Znaczenie , choć z pewną utratą ogólności w tym, co można wyrazić, jednak zysk w tym, co można wyrazić z wewnętrzną konsekwencją.

Przykładem powyższej definicji jest zbiór formuł w komórkach programu arkusza kalkulacyjnego - które nie powinny nadawać tego samego znaczenia po przeniesieniu do różnych komórek kolumn i wierszy, tj. zmienionych identyfikatorów komórek. Identyfikatory komórek są częścią i nie są zbędne w zamierzonym znaczeniu. Tak więc każdy wynik arkusza kalkulacyjnego jest unikalny dla identyfikatorów komórek w zestawie formuł. Spójna modułowa semantyczne w tym przypadku jest użycie identyfikatorów komórek jako wejścia i wyjścia czystych funkcji dla formuł komórek (patrz poniżej).

Hyper Text Markup Language a. K. a. HTML-język dla statycznych stron internetowych - jest przykładem wysoce (ale nie idealnie3) język deklaratywny, który (przynajmniej przed HTML 5) nie miał możliwości wyrażania dynamicznego zachowania. HTML jest prawdopodobnie najłatwiejszym językiem do nauki. Dla zachowania dynamicznego, imperatywny język skryptowy, taki jak JavaScript był zwykle łączony z HTML. HTML bez JavaScript pasuje do definicji deklaratywnej, ponieważ każdy typ nominalny (tj. znaczniki) zachowuje swoje spójne znaczenie pod składnią w ramach reguł składni.

Konkurencyjną definicją deklaratywną sąkomutatywne i idempotentne właściwości wyrażeń semantycznych, tzn. że wyrażenia mogą być zmieniane i powielane bez zmiany znaczenia. Na przykład polecenia przypisujące wartości nazwane pola mogą być zmieniane i powielane bez zmiany znaczenia programu, jeśli nazwy te są modularne w. r. t. do dowolnej domyślnej kolejności. Nazwy czasami implikują kolejność, np. identyfikatory komórek zawierają ich pozycję w kolumnie i wierszu - przeniesienie sumy na arkusz kalkulacyjny zmienia jej znaczenie. W przeciwnym razie, te właściwości pośrednio wymagają globalnej spójności semantyki. Zasadniczo niemożliwe jest zaprojektowanie semantyki wyrażeń tak, aby pozostawały one spójne, jeśli są losowo uporządkowane lub duplikowane, ponieważ porządek i duplikacja są nieodłączne dla semantyki. Na przykład stwierdzenia "Foo exists" (lub construction) i "Foo does not exist" (I destruction). Jeśli uważa się przypadkową niespójność endemi zamierzonej semantyki, to przyjmuje się tę definicję jako wystarczająco ogólną dla właściwości deklaratywnej. Zasadniczo definicja ta jest próżna jako definicja uogólniona, ponieważ stara się uczynić spójność prostopadłą do semantyki, tzn. przeciwstawić się temu, że wszechświat semantyki jest dynamicznie nieograniczony i nie może być ujęty w paradygmacie koherencji globalnym .

Wymaganie właściwości komutacyjnych i idempotentnych dla (strukturalnego porządku oceny) semantyki operacyjnej niższego poziomu przekształca semantykę operacyjną w deklaratywną zlokalizowaną modułową semantykę, np.czyste Programowanie funkcyjne (włączając w to rekurencję zamiast pętli imperatywnych). Następnie kolejność operacyjna szczegółów realizacji do nie wpływa na spójność semantyki wyższego poziomu (tj. rozrzuca globalnie na). Na przykład kolejność ewaluacji (i teoretycznie także duplikacji) formuł arkusza kalkulacyjnego nie ma znaczenia, ponieważ wyjścia nie są kopiowane do wejść, dopóki nie zostaną obliczone wszystkie wyjścia, tzn. analogiczne do czystych funkcji.

C, Java, C++, C#, PHP i JavaScript nie są szczególnie deklaratywne. Składnia Copute i składnia Pythona są bardziej deklaratywnie zamierzonych rezultatów, czyli spójnej semantyki składniowej, która eliminuje to, co obce, dzięki czemu można łatwo zrozum kod, gdy o nim zapomną. Copute i Haskell determinizm semantyki operacyjnej i zachęcanie "nie powtarzaj siebie " (suche), ponieważ pozwalają tylko na czysty funkcjonalny paradygmat.

2 nawet tam, gdzie możemy udowodnić semantykę programu, np. za pomocą języka Coq, jest to ograniczone do semantyka wyrażona w typowanie i typowanie nigdy nie uchwyci całej semantyki programu - nawet dla języków, które nie są Turing pełne, np. w HTML+CSS możliwe jest wyrażanie niespójnych kombinacji, które w ten sposób mają niezdefiniowaną semantykę.

3 wiele wyjaśnień błędnie twierdzi, że tylko programowanie imperatywne ma składniowo uporządkowane instrukcje. Wyjaśniłem to pomieszanie imperatywnego i funkcjonalnego programowanie . Na przykład kolejność wyrażeń HTML nie zmniejsza spójności ich znaczenia.


Edit: dodałem następujący komentarz do bloga Roberta Harpera:

W programowaniu funkcyjnym ... zakres zmienności zmiennej jest typu

W zależności od tego, jak odróżnia się funkcjonalność od imperatywu programowania, Twój "przypisany" w programie imperatywnym również może mieć Typ A związany z jego zmiennością.

Jedyna nie mętna definicja, którą obecnie cenię za funkcjonalność programowanie to a) funkcje jako obiekty i typy pierwszej klasy, b) pierwszeństwo rekurencji nad pętlami i / lub C) czystych funkcji - tzn. tych funkcji, które nie wpływają na pożądaną semantykę program po zapamiętaniu (dzięki temu idealnie czysta funkcjonalność programowanie nie istnieje w ogólnoświatowej semantyce denotacyjnej ze względu na skutki operacyjne semantyka, np. pamięć przydział).

Właściwość idempotentna czystej funkcji oznacza wywołanie funkcji na jego zmienne można zastąpić jego wartością, która nie jest ogólnie argumenty postępowania imperatywnego. Czyste funkcje zdają się być deklaratywne w. r. t. do nieprzystosowanych przejść stanu pomiędzy typami wejściowymi i wynikowymi.

Ale skład czystych funkcji nie utrzymuje takich konsekwencja, ponieważ jest możliwość modelowania efektu ubocznego (globalny stan) proces imperatywny w czystym funkcjonalnym języku programowania, np. IOMonad Haskella, a ponadto całkowicie niemożliwe jest zapobiegać takim czynnościom w dowolnym programowaniu Turinga język.

Tak jak napisałam w 2012 roku, co wydaje się zbliżonym konsensusem komentarze w twój ostatni blog , że programowanie deklaratywne jest próba uchwycenia tezy, że zamierzona semantyka nigdy nieprzezroczyste. Przykładami semantyki nieprzejrzystej są zależność od porządku, uzależnienie od wymazywania semantyki wyższego poziomu w operacjach warstwa semantyczna (np. } limit semantyki wyższego poziomu) i zależności od wartości zmiennych które nie mogą być sprawdzone (udowodnione poprawne) przez język programowania.

Tak więc doszedłem do wniosku, że tylko nie-Turinga pełne języki mogą być deklaratywne.

Tak więc jedno jednoznaczne i odrębny atrybut języka deklaratywnego może być, że jego wyjście może być udowodnione, że jest zgodne z pewnym zbiorem wyliczeniowym Zasady generatywne. Na przykład dla dowolnego konkretnego programu HTML (ignorując różnice w sposobie interpretacji), który nie jest napisany (tzn. nie jest Turing kompletny) wtedy jego zmienność wyjściowa może być / align = "left" / Lub bardziej zwięźle program HTML jest czystą funkcją jego zmienność. Również program do arkuszy kalkulacyjnych jest czystą funkcją jego zmienne wejściowe.

Wydaje mi się więc, że deklaratywne języki są antytezą unbounded recursion , czyli druga niekompletność per Gödla twierdzenia samokontroli nie da się udowodnić.

Lesie Lamport napisał bajkę o tym, jak Euclid mógł pracował wokół twierdzeń niekompletności Gödla stosowanych w dowodach matematycznych w kontekście języka programowania przez zgodność między typami i logika (korespondencja Curry ' ego-Howarda itp.).

 6
Author: Shelby Moore III,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:15

Udoskonaliłem swoje rozumienie programowania deklaratywnego, od grudnia 2011 roku, kiedy udzieliłem Odpowiedzi na to pytanie. Oto moje obecne zrozumienie.

Długa wersja mojego zrozumienia (badań) jest szczegółowo na ten link, które należy przeczytać, aby uzyskać głębokie zrozumienie podsumowania podam poniżej.

Programowanie imperatywne jest tam, gdzie zmienny stan jest przechowywany i odczytywany, a więc kolejność i / lub powielanie programu instrukcje mogą zmieniać zachowanie (semantykę) programu (a nawet powodować błąd, tzn. niezamierzone zachowanie).

W najbardziej naiwnym i skrajnym sensie (co twierdziłem w mojej wcześniejszej odpowiedzi), programowanie deklaratywne (DP) jest unikaniem wszystkich przechowywanych mutowalnych stanów, więc kolejność i/lub powielanie instrukcji programu może NIE zmieniać zachowania (semantyki) programu.

Jednak taka ekstremalna definicja nie byłaby zbyt przydatna w realnym świecie, ponieważ prawie każdy program zawiera zapisany stan zmienny. Przykład arkusza kalkulacyjnego jest zgodny z tą ekstremalną definicją DP, ponieważ cały kod programu jest uruchamiany do końca z jedną statyczną kopią stanu wejściowego, zanim nowe stany zostaną zapisane. Następnie, jeśli jakikolwiek stan zostanie zmieniony, jest to powtarzane. Ale większość programów świata rzeczywistego nie może być ograniczona do takiego monolitycznego modelu zmian stanu.

Bardziej użyteczną definicją DP jest to, że zamawianie i / lub powielanie instrukcji programowania nie zmieniaj żadnej nieprzezroczystej semantyki. Innymi słowy, nie ma ukrytych przypadkowych zmian w semantyce -- wszelkie zmiany w kolejności instrukcji programu i / lub powielanie powodują tylko zamierzone i przejrzyste zmiany w zachowaniu programu.

Następnym krokiem byłoby omówienie, które Modele lub paradygmaty programowania pomagają w DP, ale nie o to tutaj chodzi.

 5
Author: Shelby Moore III,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:10:31

Programowanie deklaratywne to programowanie z deklaracjami, czyli zdaniami deklaratywnymi. Zdania deklaratywne mają wiele właściwości, które odróżniają je od zdań imperatywnych. W szczególności deklaracje to:

  • commutative (can be reordered)
  • asocjacyjny (można przegrupować)
  • idempotent (może powtarzać się bez zmiany znaczenia)
  • monotoniczne (deklaracje nie odejmują informacji)

Istotne jest to, że są to wszystkie właściwości strukturalne i są prostopadłe do przedmiotu. Deklaratywny nie jest o "co vs. jak" . Możemy zadeklarować (reprezentować i ograniczać) a "Jak" tak samo łatwo jak deklarujemy a "co". deklaratywny jest o strukturze, Nie treści. Programowanie deklaratywne ma znaczący wpływ na sposób abstrakcji i refaktoryzacji naszego kodu oraz modularyzacji go na podprogramy, ale nie tyle na modelu domeny.

Często możemy konwertować z imperatyw do deklaratywnego poprzez dodanie kontekstu. Np. od " skręć w lewo. (... poczekaj ...) Skręć W Prawo."do" 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 przestawianie lub powtarzanie zdań poważnie zmieniłoby znaczenie programu.

Odnośnie monotoniczne , deklaracje mogą dodawać ograniczenia które odejmują możliwości. Ale ograniczenia nadal dodają informacje (dokładniej, ograniczenia są informacjami). Jeśli potrzebujemy deklaracji różniących się czasem, typowe jest modelowanie tego za pomocą wyraźnej semantyki czasowej - np. od " piłka jest płaska "do" piłka jest płaska w czasie T". Jeśli mamy dwie sprzeczne deklaracje, mamy niespójny system deklaratywny, choć można to rozwiązać wprowadzając miękkie ograniczenia (priorytety, prawdopodobieństwa itp.) lub wykorzystując logikę parakonsystentną.

 5
Author: dmbarbour,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-06 21:43:26

Oto przykład.

W CSS (używanym do stylizacji stron HTML), jeśli chcesz, aby element obrazu miał 100 pikseli wysokości i 100 pikseli szerokości, po prostu "zadeklaruj", że tego chcesz w następujący sposób:

#myImageId {
height: 100px;
width: 100px;
}

Możesz uznać CSS za deklaratywny język arkuszy stylów.

Silnik przeglądarki, który odczytuje i interpretuje ten CSS jest darmowy, aby obraz wydawał się tak wysoki i tak szeroki, jak chce. Różnych silników przeglądarek (np. silnik dla IE, engine for Chrome) będzie realizować to zadanie inaczej.

Ich unikalne implementacje nie są oczywiście napisane w języku deklaratywnym, ale w języku 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 może zawierać wywołania funkcji). Może to robić takie rzeczy, jak interpolowanie wartości pikseli i renderowanie na ekranie.

 5
Author: Niko Bellic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-14 23:50:56

Jest to metoda programowania oparta na opisywaniu co coś powinno robić lub być zamiast opisywania Jak powinno działać.

Innymi słowy, nie piszesz algorytmów złożonych z wyrażeń, tylko układasz, jak chcesz, aby wszystko było. Dwa dobre przykłady to HTML i WPF.

Ten artykuł w Wikipedii to dobry przegląd: http://en.wikipedia.org/wiki/Declarative_programming

 4
Author: Kevin Berridge,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 20:20:23

Opisując komputerowi, czego chcesz, a nie jak coś zrobić.

 3
Author: denonde,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 21:57:30

Może to zabrzmieć dziwnie, ale dodałbym Excela (lub dowolny arkusz kalkulacyjny) do listy systemów deklaratywnych. Dobrym tego przykładem jest tutaj.

 2
Author: Lunatik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-05-06 06:30:23

Wyjaśniłbym to, ponieważ DP jest sposobem na wyrażenie

  • A wyrażenie celu , warunki-czego szukamy. Jest jeden, może czy wiele?
  • niektóre znane fakty
  • Zasady rozszerzające wiedzę o faktach

...i gdzie istnieje silnik dedukcyjny Zwykle pracujący z algorytmem unifikacji , aby znaleźć cele.

 1
Author: epatel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-29 11:39:16

Programowanie deklaratywne jest "aktem programowania w językach, które odpowiadają mentalnemu modelowi programisty, a nie operacyjnemu modelowi maszyny".

Różnica między programowaniem deklaratywnym a imperatywnym jest dobrze ilustruje problem parsowania ustrukturyzowanych danych.

Imperatywny program wykorzystywałby wzajemnie rekurencyjne funkcje do zużywania danych wejściowych i generować dane. Program deklaratywny wyrażałby gramatykę określającą struktura dane tak, aby mogły być następnie przetwarzane.

Różnica między tymi dwoma podejściami polega na tym, że program deklaratywny tworzy nowy język, który jest ściślej odwzorowany na mentalnym modelu problem niż jest jego język gospodarza.

 1
Author: dan_waterworth,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-20 20:57:41

Z tego co wiem, zaczęło być używane do opisywania systemów programowania takich jak Prolog, ponieważ prolog jest (podobno) o deklarowaniu rzeczy w sposób abstrakcyjny.

Coraz częściej oznacza to bardzo mało, ponieważ ma definicję podaną przez użytkowników powyżej. Powinno być jasne, że istnieje przepaść między deklaratywnym programowaniem Haskella, w przeciwieństwie do deklaratywnego programowania HTML.

 -1
Author: Marcin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-24 22:40:52

Kilka innych przykładów programowania deklaratywnego:

  • ASP.Net znaczniki dla databinding. Po prostu pisze "wypełnij tę siatkę tym źródłem", na przykład, i pozostawia to systemowi, jak to się dzieje.
  • wyrażenia Linq

Programowanie deklaratywne jest miłe, ponieważ może pomóc uprościć Twój mentalny model* kodu, i ponieważ może być w końcu bardziej skalowalny.

Na przykład, załóżmy, że masz funkcję, która robi coś dla każdego element w tablicy lub liście. Tradycyjny kod wyglądałby tak:

foreach (object item in MyList)
{
   DoSomething(item);
}
Nic wielkiego. Ale co jeśli użyjesz bardziej deklaratywnej składni i zamiast tego zdefiniujesz DoSomething() jako akcję? Wtedy możesz powiedzieć to w ten sposób:
MyList.ForEach(DoSometing);
To jest, oczywiście, bardziej zwięzłe. Ale jestem pewien, że masz więcej obaw niż tylko zapisanie dwóch linijek kodu tu i tam. Na przykład wydajność. Stary sposób, przetwarzanie musiało odbywać się w kolejności. Co jeśli ... Metoda ForEach() miała sposób na chcesz zasygnalizować, że może obsługiwać przetwarzanie równolegle, automatycznie? Teraz nagle zrobiłeś kod wielowątkowy w bardzo bezpieczny sposób i zmieniłeś tylko jedną linię kodu. W rzeczywistości istnieje rozszerzenie dla. Net, które pozwala ci to zrobić.
  • jeśli podążasz za tym linkiem, przeniesie Cię do wpisu na blogu mojego przyjaciela. Cały post jest trochę długi, ale możesz przewinąć w dół do nagłówka zatytułowanego "Problem" _ i tam go podnieść nie ma sprawy.*
 -2
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-04 15:11:39

To zależy od tego, jak podasz odpowiedź do tekstu. Ogólnie można spojrzeć na program w pewnym widoku, ale to zależy, pod jakim kątem spojrzeć na problem. Zacznę od programu: Dim Bus, Car, Time, Height As Integr

Ponownie zależy od tego, co problem jest ogólny. Być może będziesz musiał go skrócić ze względu na program. Mam nadzieję,że to pomoże i potrzebuje informacji zwrotnej, jeśli nie. Dziękuję.

 -3
Author: Danny Darrie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-30 10:37:25