Ich höre immer wieder, wie dieser Begriff in verschiedenen Kontexten herumgeworfen wird. Was ist es?
programming-languages
declarative
glossary
Brian G.
quelle
quelle
Antworten:
Deklarative Programmierung ist, wenn Sie Ihren Code so schreiben, dass er beschreibt, was Sie tun möchten und nicht, wie Sie es tun möchten. Es bleibt dem Compiler überlassen, das Wie herauszufinden.
Beispiele für deklarative Programmiersprachen sind SQL und Prolog.
quelle
Die anderen Antworten machen bereits einen fantastischen Job und erklären, was deklarative Programmierung ist. Deshalb werde ich nur einige Beispiele dafür nennen, warum dies nützlich sein könnte.
Kontextunabhängigkeit
Deklarative Programme sind kontextunabhängig . Da sie nur das endgültige Ziel angeben, nicht jedoch die Zwischenschritte, um dieses Ziel zu erreichen, kann dasselbe Programm in verschiedenen Kontexten verwendet werden. Dies ist bei imperativen Programmen schwierig , da sie häufig vom Kontext abhängen (z. B. versteckter Zustand).
Nehmen Sie
yacc
als Beispiel. Es ist ein Parser-Generator aka. Compiler Compiler, ein externes deklaratives DSL zur Beschreibung der Grammatik einer Sprache, sodass aus der Beschreibung automatisch ein Parser für diese Sprache generiert werden kann. Aufgrund seiner Kontextunabhängigkeit können Sie mit einer solchen Grammatik viele verschiedene Dinge tun:yacc
)Und viele mehr …
Optimierung
Da Sie dem Computer nicht vorschreiben, welche Schritte in welcher Reihenfolge ausgeführt werden sollen, kann er Ihr Programm viel freier anordnen und möglicherweise sogar einige Aufgaben parallel ausführen. Ein gutes Beispiel ist ein Abfrageplaner und Abfrageoptimierer für eine SQL-Datenbank. In den meisten SQL-Datenbanken können Sie die Abfrage anzeigen, die sie tatsächlich ausführen, im Vergleich zu der Abfrage, zu deren Ausführung Sie sie aufgefordert haben. Oft sehen diese Abfragen nicht aussich mögen. Der Abfrageplaner berücksichtigt Dinge, von denen Sie nicht einmal geträumt hätten: beispielsweise die Rotationslatenz des Plattentellers oder die Tatsache, dass eine völlig andere Anwendung für einen völlig anderen Benutzer gerade eine ähnliche Abfrage und die Tabelle ausgeführt hat, die Sie sind Beitritt mit und dass Sie so hart gearbeitet haben, um das Laden zu vermeiden, ist sowieso schon im Speicher.
Hier gibt es einen interessanten Kompromiss: Die Maschine muss härter arbeiten, um herauszufinden, wie etwas zu tun ist, als dies in einer zwingenden Sprache der Fall wäre, aber wenn sie es herausfindet, hat sie viel mehr Freiheit und viel mehr Informationen für die Optimierung Bühne.
quelle
Lose:
Deklarative Programmierung tendiert zu: -
Imperative Programmierung tendiert zu: -
Infolgedessen hilft ein imperativer Stil dem Leser, die Mechanik dessen zu verstehen, was das System tatsächlich tut, gibt jedoch möglicherweise nur wenig Einblick in das Problem, das es lösen soll. Auf der anderen Seite hilft ein deklarativer Stil dem Leser, die Problemdomäne und den Ansatz des Systems zur Lösung des Problems zu verstehen, ist jedoch in Bezug auf die Mechanik weniger informativ.
Bei echten Programmen (auch solchen, die in Sprachen geschrieben sind, die die Enden des Spektrums bevorzugen, wie ProLog oder C) sind beide Stile an verschiedenen Stellen in unterschiedlichem Maße vorhanden, um den unterschiedlichen Komplexitäten und Kommunikationsanforderungen des Stücks gerecht zu werden. Ein Stil ist dem anderen nicht überlegen; Sie dienen nur unterschiedlichen Zwecken, und wie bei vielen Dingen im Leben ist Mäßigung der Schlüssel.
quelle
Hier ist ein Beispiel.
Wenn Sie in CSS (zum Stylen von HTML-Seiten) möchten, dass ein Bildelement 100 Pixel hoch und 100 Pixel breit ist, "deklarieren" Sie einfach, dass dies wie folgt gewünscht wird:
Sie können CSS als deklarative "Stylesheet" -Sprache betrachten.
Die Browser-Engine, die dieses CSS liest und interpretiert , kann das Bild so groß und breit erscheinen lassen, wie es möchte. Verschiedene Browser-Engines (z. B. die Engine für IE, die Engine für Chrome) implementieren diese Aufgabe unterschiedlich.
Ihre einzigartigen Implementierungen sind natürlich NICHT in einer deklarativen Sprache geschrieben, sondern in einer prozeduralen wie Assembly, C, C ++, Java, JavaScript oder Python. Dieser Code besteht aus einer Reihe von Schritten, die Schritt für Schritt ausgeführt werden müssen (und möglicherweise Funktionsaufrufe enthalten). Es kann beispielsweise Pixelwerte interpolieren und auf dem Bildschirm rendern.
quelle
Es tut mir leid, aber ich muss vielen anderen Antworten nicht zustimmen. Ich möchte dieses durcheinandergebrachte Missverständnis der Definition der deklarativen Programmierung stoppen.
Definition
Die referenzielle Transparenz (RT) der Unterausdrücke ist das einzige erforderliche Attribut eines deklarativen Programmierausdrucks , da es das einzige Attribut ist, das nicht mit der imperativen Programmierung geteilt wird.
Andere zitierte Attribute der deklarativen Programmierung leiten sich aus dieser RT ab. Bitte klicken Sie auf den Hyperlink oben für die detaillierte Erklärung.
Beispiel für eine Tabellenkalkulation
Zwei Antworten erwähnten die Tabellenkalkulationsprogrammierung. In den Fällen, in denen die Tabellenkalkulationsprogrammierung (auch als Formeln bezeichnet) nicht auf den veränderlichen globalen Status zugreift , handelt es sich um eine deklarative Programmierung. Dies liegt daran, dass die veränderlichen Zellenwerte die monolithische Eingabe und Ausgabe von
main()
(dem gesamten Programm) sind. Die neuen Werte werden nach Ausführung jeder Formel nicht in die Zellen geschrieben, sodass sie für die Lebensdauer des deklarativen Programms (Ausführung aller Formeln in der Tabelle) nicht veränderbar sind. Daher betrachten die Formeln diese veränderlichen Zellen relativ zueinander als unveränderlich. Eine RT-Funktion kann auf den unveränderlichen globalen Status (und auch auf den veränderlichen lokalen Status ) zugreifen .Die Fähigkeit, die Werte in den Zellen zu mutieren, wenn das Programm beendet wird (als Ausgabe von
main()
), macht sie daher nicht zu veränderlichen gespeicherten Werten im Kontext der Regeln. Der Hauptunterschied besteht darin, dass die Zellenwerte nicht aktualisiert werden, nachdem jede Tabellenkalkulationsformel ausgeführt wurde. Daher spielt die Reihenfolge der Ausführung der Formeln keine Rolle. Die Zellenwerte werden aktualisiert, nachdem alle deklarativen Formeln ausgeführt wurden.quelle
Deklarative Programmierung ist das Bild, wobei imperative Programmierung Anweisungen zum Malen dieses Bildes sind.
Sie schreiben in einem deklarativen Stil, wenn Sie "sagen, was es ist", anstatt die Schritte zu beschreiben, die der Computer unternehmen sollte, um dorthin zu gelangen, wo Sie es möchten.
Wenn Sie XML zum Markieren von Daten verwenden, verwenden Sie deklarative Programmierung, weil Sie sagen: "Dies ist eine Person, das ist ein Geburtstag, und dort drüben gibt es eine Adresse."
Einige Beispiele dafür, wo deklarative und imperative Programmierung kombiniert werden, um eine größere Wirkung zu erzielen:
Windows Presentation Foundation verwendet die deklarative XML-Syntax, um zu beschreiben, wie eine Benutzeroberfläche aussieht und welche Beziehungen (Bindungen) zwischen Steuerelementen und zugrunde liegenden Datenstrukturen bestehen.
Strukturierte Konfigurationsdateien verwenden deklarative Syntax (so einfach wie "Schlüssel = Wert" -Paare), um zu identifizieren, was eine Zeichenfolge oder ein Wert von Daten bedeutet.
HTML markiert Text mit Tags, die beschreiben, welche Rolle jeder Text in Bezug auf das gesamte Dokument spielt.
quelle
Deklarative Programmierung ist das Programmieren mit Deklarationen, dh deklarativen Sätzen. Deklarative Sätze haben eine Reihe von Eigenschaften, die sie von imperativen Sätzen unterscheiden. Erklärungen sind insbesondere:
Ein relevanter Punkt ist, dass dies alles strukturelle Eigenschaften sind und orthogonal zum Gegenstand sind. Bei der Erklärung geht es nicht um "Was gegen Wie" . Wir können ein "Wie" genauso einfach deklarieren (darstellen und einschränken) wie ein "Was" . Bei der Erklärung geht es um Struktur, nicht um Inhalt. Die deklarative Programmierung hat einen erheblichen Einfluss darauf, wie wir unseren Code abstrahieren und umgestalten und wie wir ihn in Unterprogramme modularisieren, jedoch nicht so sehr auf das Domänenmodell.
Oft können wir durch Hinzufügen von Kontext von Imperativ zu Deklarativ konvertieren. ZB von "Biegen Sie links ab. (... warten Sie ...) Biegen Sie rechts ab." zu "Bob wird an der Kreuzung von Foo und Bar um 11:01 Uhr links abbiegen. Bob wird an der Kreuzung von Bar und Baz um 11:06 Uhr rechts abbiegen." Beachten Sie, dass im letzteren Fall die Sätze idempotent und kommutativ sind, während im ersten Fall das Umordnen oder Wiederholen der Sätze die Bedeutung des Programms stark verändern würde.
In Bezug auf Monotonie können Deklarationen Einschränkungen hinzufügen , die Möglichkeiten subtrahieren . Einschränkungen fügen jedoch weiterhin Informationen hinzu (genauer gesagt, Einschränkungen sind Informationen). Wenn wir zeitvariable Deklarationen benötigen, ist es typisch, dies mit expliziter zeitlicher Semantik zu modellieren - z. B. von "der Ball ist flach" bis "der Ball ist zum Zeitpunkt T flach". Wenn wir zwei widersprüchliche Deklarationen haben, haben wir ein inkonsistentes deklaratives System, obwohl dies durch die Einführung weicher Einschränkungen (Prioritäten, Wahrscheinlichkeiten usw.) oder die Nutzung einer parakonsistenten Logik gelöst werden kann .
quelle
Beschreiben eines Computers, was Sie wollen, nicht wie man etwas macht.
quelle
Stellen Sie sich eine Excel-Seite vor. Mit Spalten, die mit Formeln gefüllt sind, um Ihre Steuererklärung zu berechnen.
Die gesamte Logik wird in den Zellen deklariert. Die Reihenfolge der Berechnung erfolgt durch die Formel selbst und nicht prozedural.
Darum geht es bei der deklarativen Programmierung. Sie deklarieren den Problemraum und die Lösung und nicht den Programmablauf.
Prolog ist die einzige deklarative Sprache, die ich benutze. Es erfordert eine andere Art des Denkens, aber es ist gut zu lernen, wenn Sie nur etwas anderem als der typischen prozeduralen Programmiersprache ausgesetzt werden.
quelle
Ich habe mein Verständnis der deklarativen Programmierung seit Dezember 2011 verfeinert, als ich eine Antwort auf diese Frage gab. Hier folgt mein aktuelles Verständnis.
Die lange Version meines Verständnisses (Forschung) finden Sie unter diesem Link , den Sie lesen sollten, um ein tiefes Verständnis der Zusammenfassung zu erhalten, die ich unten bereitstellen werde.
Bei der imperativen Programmierung wird der veränderbare Zustand gespeichert und gelesen. Daher kann die Reihenfolge und / oder das Duplizieren von Programmanweisungen das Verhalten (die Semantik) des Programms ändern (und sogar einen Fehler verursachen, dh unbeabsichtigtes Verhalten).
Im naivsten und extremsten Sinne (was ich in meiner vorherigen Antwort behauptet habe) vermeidet die deklarative Programmierung (DP) jeden gespeicherten veränderlichen Zustand, so dass die Reihenfolge und / oder Vervielfältigung von Programmanweisungen das Verhalten (die Semantik) des Programms NICHT ändern kann .
Eine solch extreme Definition wäre jedoch in der realen Welt nicht sehr nützlich, da fast jedes Programm einen gespeicherten veränderlichen Zustand beinhaltet. Das Tabellenkalkulationsbeispiel entspricht dieser extremen Definition von DP, da der gesamte Programmcode mit einer statischen Kopie des Eingabestatus vollständig ausgeführt wird, bevor die neuen Status gespeichert werden. Wenn dann ein Zustand geändert wird, wird dies wiederholt. Die meisten Programme der realen Welt können jedoch nicht auf ein solches monolithisches Modell von Zustandsänderungen beschränkt werden.
Eine nützlichere Definition von DP ist, dass die Reihenfolge und / oder Vervielfältigung von Programmieranweisungen keine undurchsichtige Semantik ändert. Mit anderen Worten, es treten keine versteckten zufälligen Änderungen in der Semantik auf - Änderungen in der Reihenfolge der Programmanweisungen und / oder Duplikationen verursachen nur beabsichtigte und transparente Änderungen des Programmverhaltens.
Der nächste Schritt wäre, darüber zu sprechen, welche Programmiermodelle oder Paradigmen bei DP helfen, aber das ist hier nicht die Frage.
quelle
Functional programming
ist heutzutage ein Modewort, das im Wesentlichen eine Teilmenge der deklarativen Programmierung ist. LINQ in C # -Sprache ist ein Element der funktionalen Programmierung, wenn die Sprache selbst von Natur aus unerlässlich ist. Nach dieser Definition wird C # also zu einer Art Hybrid.Es ist eine Programmiermethode, die darauf basiert, zu beschreiben, was etwas tun oder sein soll, anstatt zu beschreiben, wie es funktionieren soll.
Mit anderen Worten, Sie schreiben keine Algorithmen aus Ausdrücken, sondern legen nur fest, wie die Dinge sein sollen. Zwei gute Beispiele sind HTML und WPF.
Dieser Wikipedia-Artikel bietet einen guten Überblick: http://en.wikipedia.org/wiki/Declarative_programming
quelle
Seit ich meine vorherige Antwort geschrieben habe, habe ich eine neue Definition der deklarativen Eigenschaft formuliert, die unten zitiert wird. Ich habe auch imperative Programmierung als die duale Eigenschaft definiert.
Diese Definition ist der in meiner vorherigen Antwort angegebenen überlegen, da sie prägnant und allgemeiner ist. Es kann jedoch schwieriger sein, etwas zu verstehen, da die Implikation der Unvollständigkeitssätze, die für die Programmierung und das Leben im Allgemeinen gelten, für den Menschen schwierig ist, sich Gedanken zu machen.
In der zitierten Erklärung der Definition wird die Rolle der reinen funktionalen Programmierung bei der deklarativen Programmierung erörtert .
Bearbeiten: Ich habe den folgenden Kommentar in Robert Harpers Blog gepostet :
quelle
Deklarative Programmierung ist "der Vorgang des Programmierens in Sprachen, die eher dem mentalen Modell des Entwicklers als dem Betriebsmodell der Maschine entsprechen".
Der Unterschied zwischen deklarativer und imperativer Programmierung wird durch das Problem der Analyse strukturierter Daten deutlich.
Ein zwingendes Programm würde gegenseitig rekursive Funktionen verwenden, um Eingaben zu verbrauchen und Daten zu generieren. Ein deklaratives Programm würde eine Grammatik ausdrücken, die die Struktur der Daten definiert, damit sie dann analysiert werden können.
Der Unterschied zwischen diesen beiden Ansätzen besteht darin, dass das deklarative Programm eine neue Sprache erstellt, die dem mentalen Modell des Problems enger zugeordnet ist als die Wirtssprache.
quelle
Es mag seltsam klingen, aber ich würde Excel (oder wirklich jede Tabelle) zur Liste der deklarativen Systeme hinzufügen. Ein gutes Beispiel dafür finden Sie hier .
quelle
Ich würde es erklären, da DP eine Möglichkeit ist, sich auszudrücken
... und wo es eine Deduktionsmaschine gibt, die normalerweise mit einem Vereinigungsalgorithmus arbeitet , um die Ziele zu finden.
quelle
Soweit ich das beurteilen kann, wurde es verwendet, um Programmiersysteme wie Prolog zu beschreiben, weil es bei Prolog (angeblich) darum geht, Dinge abstrakt zu deklarieren.
Es bedeutet zunehmend sehr wenig, da es die oben von den Benutzern angegebene Definition hat. Es sollte klar sein, dass es eine Kluft zwischen der deklarativen Programmierung von Haskell und der deklarativen Programmierung von HTML gibt.
quelle
Einige andere Beispiele für deklarative Programmierung:
Deklarative Programmierung ist hilfreich, weil sie dazu beitragen kann, Ihr mentales Codemodell * zu vereinfachen , und weil sie möglicherweise skalierbarer ist.
Angenommen, Sie haben eine Funktion, die mit jedem Element in einem Array oder einer Liste etwas bewirkt. Herkömmlicher Code würde folgendermaßen aussehen:
Keine große Sache da. Was aber, wenn Sie die deklarativere Syntax verwenden und stattdessen DoSomething () als Aktion definieren? Dann können Sie es so sagen:
Dies ist natürlich prägnanter. Aber ich bin sicher, Sie haben mehr Bedenken, als nur hier und da zwei Codezeilen zu speichern. Leistung zum Beispiel. Die alte Art, die Verarbeitung musste nacheinander erfolgen. Was wäre, wenn Sie mit der .ForEach () -Methode signalisieren könnten, dass die Verarbeitung automatisch parallel ausgeführt werden kann? Jetzt haben Sie Ihren Code plötzlich auf sehr sichere Weise multithreaded gemacht und nur eine Codezeile geändert. Tatsächlich gibt es eine Erweiterung für .Net, mit der Sie genau das tun können.
quelle
Dies hängt davon ab, wie Sie die Antwort auf den Text senden. Insgesamt können Sie das Programm in einer bestimmten Ansicht betrachten, aber es hängt davon ab, aus welchem Blickwinkel Sie das Problem betrachten. Ich werde Sie mit dem Programm beginnen: Dim Bus, Auto, Zeit, Höhe als Integr
Auch hier kommt es darauf an, was das Problem insgesamt ist. Möglicherweise müssen Sie es aufgrund des Programms kürzen. Hoffe das hilft und brauche das Feedback wenn es nicht geht. Danke.
quelle