Was ist der Unterschied zwischen deklarativer und imperativer Programmierung? [geschlossen]

541

Ich habe im Internet nach einer Definition für deklarative und imperative Programmierung gesucht, die etwas Licht für mich bringen würde. Die Sprache, die bei einigen der Ressourcen verwendet wird, die ich gefunden habe, ist jedoch entmutigend - zum Beispiel bei Wikipedia . Hat jemand ein reales Beispiel, das er mir zeigen könnte, um diesem Thema eine Perspektive zu geben (vielleicht in C #)?

Brad
quelle
3
Imperativ geht in ein Restaurant und bestellt eine 6 Unzen. Steak (selten gekocht), Pommes (mit Ketchup), ein Beilagensalat (mit Ranch) und eine Cola (ohne Eis). Der Kellner liefert genau das, wonach er gefragt hat, und er berechnet 14,50 USD. Auf der anderen Seite geht Declarative in ein Restaurant und sagt dem Kellner, dass er nur etwa 12 Dollar für das Abendessen bezahlen möchte und Lust auf Steak hat. Der Kellner kommt mit 6 Unzen zurück. Steak (gekochtes Medium), eine Seite Kartoffelpüree, gedünsteter Brokkoli, ein Brötchen und ein Glas Wasser. Er hat 11,99 $ berechnet.
cs_pupil

Antworten:

786

Ein gutes C # -Beispiel für deklarative vs. imperative Programmierung ist LINQ.

Mit der imperativen Programmierung teilen Sie dem Compiler Schritt für Schritt mit, was passieren soll.

Beginnen wir zum Beispiel mit dieser Sammlung und wählen die ungeraden Zahlen:

List<int> collection = new List<int> { 1, 2, 3, 4, 5 };

Mit der imperativen Programmierung würden wir dies durchgehen und entscheiden, was wir wollen:

List<int> results = new List<int>();
foreach(var num in collection)
{
    if (num % 2 != 0)
          results.Add(num);
}

Hier sagen wir:

  1. Erstellen Sie eine Ergebnissammlung
  2. Gehen Sie jede Nummer in der Sammlung durch
  3. Überprüfen Sie die Zahl, falls sie ungerade ist, und fügen Sie sie den Ergebnissen hinzu

Bei der deklarativen Programmierung hingegen schreiben Sie Code, der beschreibt, was Sie wollen, aber nicht unbedingt, wie Sie es erhalten (deklarieren Sie Ihre gewünschten Ergebnisse, aber nicht Schritt für Schritt):

var results = collection.Where( num => num % 2 != 0);

Hier sagen wir "Gib uns alles, wo es seltsam ist", nicht "Schritt durch die Sammlung. Überprüfen Sie dieses Element, wenn es seltsam ist, fügen Sie es einer Ergebnissammlung hinzu."

In vielen Fällen ist Code auch eine Mischung aus beiden Designs, sodass er nicht immer schwarzweiß ist.

Reed Copsey
quelle
8
+1. Sie erwähnen jedoch zuerst LINQ, aber was haben die Beispiele damit zu tun?
Zano
15
collection.Where verwendet die deklarativen LINQ-Erweiterungsmethoden. Es werden nicht die C # -Sprachenfunktionen verwendet, sondern die deklarative API. Ich wollte hier keine Nachrichten mischen, weshalb ich die Sprachzusätze vermieden habe, die auf den deklarativen Methoden aufbauen.
Reed Copsey
241
Es scheint mir, dass deklarative Programmierung nichts anderes als eine Abstraktionsebene ist.
Drazen Bjelovuk
8
Dies ist eine gute Antwort, aber sie beantwortet den Unterschied zwischen unreiner funktionaler und zwingender Programmierung. collection.Whereverwendet nicht die deklarative Syntax, die Linq bereitstellt - siehe msdn.microsoft.com/en-us/library/bb397906.aspx für Beispiele, from item in collection where item%2 != 0 select itemwäre die deklarative Form. Das Aufrufen einer Funktion wird nicht zu einer deklarativen Programmierung, nur weil sich diese Funktion im System.Linq-Namespace befindet.
Pete Kirkham
30
@PeteKirkham Die von Ihnen verwendete Syntax ist nicht das Problem - bei deklarativ und imperativ geht es eher darum, zu erklären, was geschehen soll, als genau zu erklären, wie es geschehen muss. Die Verwendung der Syntax der integrierten Syntax oder der Erweiterungsmethode ist ein separates Problem.
Reed Copsey
145

Deklarative Programmierung ist, wenn Sie sagen, was Sie wollen, und imperative Sprache ist, wenn Sie sagen, wie Sie bekommen, was Sie wollen.

Ein einfaches Beispiel in Python:

# Declarative
small_nums = [x for x in range(20) if x < 5]

# Imperative
small_nums = []
for i in range(20):
    if i < 5:
        small_nums.append(i)

Das erste Beispiel ist deklarativ, da wir keine "Implementierungsdetails" für die Erstellung der Liste angeben.

Wenn Sie ein C # -Beispiel einbinden, ergibt die Verwendung von LINQ im Allgemeinen einen deklarativen Stil, da Sie nicht sagen, wie Sie das erhalten, was Sie möchten. Sie sagen nur, was Sie wollen. Das Gleiche könnte man über SQL sagen.

Ein Vorteil der deklarativen Programmierung besteht darin, dass der Compiler Entscheidungen treffen kann, die zu besserem Code führen können als von Hand. Wird mit dem SQL-Beispiel ausgeführt, wenn Sie eine Abfrage wie hatten

SELECT score FROM games WHERE id < 100;

Der SQL "Compiler" kann diese Abfrage "optimieren", da er weiß, dass ides sich um ein indiziertes Feld handelt - oder möglicherweise nicht indiziert. In diesem Fall muss er ohnehin über den gesamten Datensatz iterieren. Oder vielleicht weiß die SQL-Engine, dass dies der perfekte Zeitpunkt ist, um alle 8 Kerne für eine schnelle parallele Suche zu nutzen. Sie , als Programmierer, die nicht mit einer dieser Bedingungen betroffen, und Sie haben keinen Code zu schreiben , keinen besonderen Fall in dieser Art und Weise zu handhaben .

Mark Rushakoff
quelle
30
Dieses Python-Beispiel ist NICHT deklarativ.
Juanjo Conti
18
@Juanjo: Es IST decalarative.
fehlender Faktor
3
Wie ist die erste Aussage hier aussagekräftiger als die zweite?
Zenna
17
Mit Juanjo und Zenna einverstanden sein - ein Schleifenkonstrukt verwandelt sich nicht auf magische Weise in ein deklaratives Programm, wenn es in eine kürzere Notation umgestaltet wird.
Felix Frank
11
Ich stimme @FelixFrank nicht zu und neige zu der "kühnen" Aussage von @ missingfaktor. Die traditionelle, "vollständig" deklarative Methode, dies zu tun filter(lambda x: x < 5, range(20)), ist nur eine weitere Umgestaltung in eine kürzere Notation. Dies unterscheidet sich in keiner sinnvollen Weise von dem Listenverständnisausdruck (der klare Abschnitte "map" und "filter" enthält), der mit der ausdrücklichen Absicht erstellt wurde (siehe Seite 202 ), eine präzisere Notation zu erstellen. Und dieses Listenverständnis wäre in diesem Fall klarer / idiomatischer.
YoniLavi
100

Deklarativ vs. Imperativ

Ein Programmierparadigma ist ein grundlegender Stil der Computerprogrammierung. Es gibt vier Hauptparadigmen: imperativ, deklarativ, funktional (was als Teilmenge des deklarativen Paradigmas betrachtet wird) und objektorientiert.

Deklarative Programmierung : ist ein Programmierparadigma, das die Logik einer Berechnung ausdrückt (Was tun), ohne ihren Kontrollfluss zu beschreiben (Wie tun). Einige bekannte Beispiele für deklarative domänenspezifische Sprachen (DSLs) sind CSS, reguläre Ausdrücke und eine Teilmenge von SQL (z. B. SELECT-Abfragen). Viele Auszeichnungssprachen wie HTML, MXML, XAML, XSLT ... sind häufig deklarativ. Die deklarative Programmierung versucht, die Unterscheidung zwischen einem Programm als Befehlssatz und einem Programm als Aussage über die gewünschte Antwort zu verwischen.

Imperative Programmierung : ist ein Programmierparadigma, das die Berechnung anhand von Anweisungen beschreibt, die einen Programmstatus ändern. Die deklarativen Programme können doppelt als Programmierbefehle oder mathematische Aussagen angesehen werden.

Funktionale Programmierung: ist ein Programmierparadigma, das die Berechnung als Bewertung mathematischer Funktionen behandelt und Zustands- und veränderbare Daten vermeidet. Es betont die Anwendung von Funktionen im Gegensatz zum imperativen Programmierstil, der Zustandsänderungen betont. In einer reinen Funktionssprache wie Haskell sind alle Funktionen ohne Nebenwirkungen, und Zustandsänderungen werden nur als Funktionen dargestellt, die den Zustand transformieren.

Das folgende Beispiel für die imperative Programmierung in MSDN durchläuft die Zahlen 1 bis 10 und findet die geraden Zahlen.

var numbersOneThroughTen = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//With imperative programming, we'd step through this, and decide what we want:
var evenNumbers = new List<int>();
foreach (var number in numbersOneThroughTen)
{    if (number % 2 == 0)
    {
        evenNumbers.Add(number);
    }
}
//The following code uses declarative programming to accomplish the same thing.
// Here, we're saying "Give us everything where it's odd"
var evenNumbers = numbersOneThroughTen.Select(number => number % 2 == 0);

Beide Beispiele liefern das gleiche Ergebnis, und eines ist weder besser noch schlechter als das andere. Das erste Beispiel erfordert mehr Code, aber der Code ist testbar, und der zwingende Ansatz gibt Ihnen die volle Kontrolle über die Implementierungsdetails. Im zweiten Beispiel ist der Code wahrscheinlich besser lesbar. Mit LINQ haben Sie jedoch keine Kontrolle darüber, was hinter den Kulissen passiert. Sie müssen darauf vertrauen, dass LINQ das angeforderte Ergebnis liefert.

AliKarimi
quelle
7
Können Sie eine Beschreibung für objektorientiert hinzufügen?
Mbigras
54

Alle obigen Antworten und andere Online-Beiträge erwähnen Folgendes:

  • Mit deklarativ Programmierung schreiben Sie Code, der beschreibt, was Sie wollen, aber nicht unbedingt, wie Sie es bekommen
  • Sie sollten die deklarative Programmierung der imperativen Programmierung vorziehen

Was sie uns nicht gesagt haben, ist, wie wir es erreichen können . Damit ein Teil des Programms deklarativer ist, müssen andere Teile die Abstraktion bereitstellen , um die Implementierungsdetails (die die imperativen Codes sind) auszublenden .

  • Beispielsweise ist LINQ deklarativer als Schleifen (für, während usw.), z. B. können Sie list.Where()eine neue gefilterte Liste abrufen. Damit dies funktioniert, hat Microsoft alle Anstrengungen unternommen, die hinter der LINQ-Abstraktion stehen.

Tatsächlich ist einer der Gründe, warum funktionale Programmierung und funktionale Bibliotheken deklarativer sind, dass sie Schleifen und Listenerstellungen abstrahiert haben und alle Implementierungsdetails (höchstwahrscheinlich imperative Codes mit Schleifen) hinter den Kulissen verbergen.

In jedem Programm haben Sie immer sowohl imperative als auch deklarative Codes. Sie sollten darauf abzielen, alle imperativen Codes hinter den Abstraktionen zu verbergen , damit andere Teile des Programms sie deklarativ verwenden können .

Obwohl funktionale Programmierung und LINQ Ihr Programm deklarativer machen können, können Sie es immer noch deklarativer machen, indem Sie mehr Abstraktionen bereitstellen. Zum Beispiel:

// JavaScript example

// Least declarative
const bestProducts = [];
for(let i = 0; i < products.length; i++) {
    let product = products[i];
    if (product.rating >= 5 && product.price < 100) {
        bestProducts.push(product);
    }
}


// More declarative
const bestProducts = products.filter(function(product) {
    return product.rating >= 5 && product.price < 100;
});

// Most declarative, implementation details are hidden in a function
const bestProducts = getBestProducts();

PS Das Extrem der deklarativen Programmierung besteht darin, neue domänenspezifische Sprachen (DSL) zu erfinden:

  1. Zeichenfolgensuche : Regulärer Ausdruck anstelle von benutzerdefiniertem Imperativcode
  2. React.js : JSX anstelle der direkten DOM-Manipulation
  3. AWS CloudFormation : YAML anstelle von CLI
  4. Relationale Datenbank : SQL anstelle älterer Lese- / Schreib-APIs wie ISAM oder VSAM.
Motorkraft
quelle
Es gibt viele gute Beispiele für deklarative Programmierungen: React , CloudFormation , Terraform
Engineforce
"Deklarative" Programmierung bedeutet also nur, den Code, der den Job erledigt, in eine Funktion zu verschieben?
Guillaume F.
@ GuillaumeF. Es geht darum, die domänenspezifische Abstraktion zu erstellen. Zum Beispiel - in Banking: sollten Sie Funktionen erstellen wie debit, depositusw. statt eigener Verantwortung Code des Wiederholensaccount.balance += depositAmount
engineforce
44

Ich werde ein weiteres Beispiel hinzufügen, das in der deklarativen / imperativen Programmierdiskussion selten auftaucht: die Benutzeroberfläche!

In C # können Sie eine Benutzeroberfläche mit verschiedenen Technologien erstellen.

Am zwingenden Ende können Sie DirectX oder OpenGL verwenden, um Ihre Schaltflächen, Kontrollkästchen usw. unbedingt Zeile für Zeile (oder wirklich Dreieck für Dreieck) zu zeichnen. Es liegt an Ihnen zu sagen, wie die Benutzeroberfläche gezeichnet wird.

Am deklarativen Ende haben Sie WPF. Sie schreiben im Grunde etwas XML (ja, ja, "XAML" technisch) und das Framework erledigt die Arbeit für Sie. Sie sagen, wie die Benutzeroberfläche aussieht. Es ist Sache des Systems, herauszufinden, wie es geht.

Wie auch immer, nur eine andere Sache, über die man nachdenken sollte. Nur weil eine Sprache deklarativ oder imperativ ist, heißt das nicht, dass sie bestimmte Merkmale der anderen nicht aufweist.

Ein Vorteil der deklarativen Programmierung besteht auch darin, dass der Zweck beim Lesen des Codes normalerweise leichter zu verstehen ist, während der Imperativ Ihnen eine genauere Kontrolle über die Ausführung gibt.

Das Wesentliche von allem:

Deklarativ -> whatSie wollen fertig sein

Imperativ -> howSie wollen es getan haben

Erich Mirabal
quelle
27

Ich mochte eine Erklärung aus einem Cambridge-Kurs + ihre Beispiele:

  • Deklarative - angeben , was zu tun ist nicht , wie es zu tun
    • Beispiel: HTML beschreibt, was auf einer Webseite angezeigt werden soll und nicht, wie es auf dem Bildschirm gezeichnet werden soll
  • Imperativ - Geben Sie an, was und wie
    • int x; - was (deklarativ)
    • x=x+1; - Wie
ROMANIA_engineer
quelle
„nicht , wie es sollte auf dem Bildschirm gezeichnet werden“ ... So bedeutet jedoch , dass das CSSist Imperativ dann?
Chef_Code
11
Nein. Es kann auch als deklarativ angesehen werden, weil Sie nur sagen, was Sie wollen - "machen Sie diesen Zellrand blau" . Stellen Sie sich vor, Sie möchten denselben Rand in einem imperativen Ansatz zeichnen (z. B. JavaScript). Dann müssen Sie sagen: "Gehe zu Punkt (x1, y1), zeichne eine blaue Linie zwischen diesem Punkt und (x2, y1), zeichne eine blaue Linie von (x2, y1) nach (x2, y2), zeichne eine blaue Linie Zeichnen Sie von (x2, y2) bis (x1, y2) eine blaue Linie von (x1, y2) bis (x1, y1) .
ROMANIA_engineer
@ROMANIA_engineer, wo finde ich bitte einen solchen Cambridge-Kurs?
Testteam
@testteam, suchen Sie die folgenden "cl.cam.ac.uk Lehre ooprog" bei Google. Sie können die Jahre über die URL ändern.
ROMANIA_engineer
@ROMANIA_engineer, verstanden, danke
Testteam
26

Der Unterschied hängt hauptsächlich mit der gesamten Abstraktionsebene zusammen. Mit deklarativ sind Sie irgendwann so weit von den einzelnen Schritten entfernt, dass das Programm viel Spielraum hat, wie Sie Ihr Ergebnis erzielen können.


Sie könnten jede Anweisung als irgendwo auf ein Kontinuum fallend betrachten:

Abstraktionsgrad:

Declarative <<=====|==================>> Imperative

Beispiel der deklarativen realen Welt:

  1. Bibliothekar, bitte überprüfen Sie mir eine Kopie von Moby Dick. (Der Bibliothekar wählt nach eigenem Ermessen die beste Methode zur Ausführung der Anfrage.)

Imperatives Beispiel aus der realen Welt:

  1. Gehe in die Bibliothek
  2. Buchorganisationssystem finden (Kartenkatalog - Alte Schule)
  3. Informieren Sie sich über die Verwendung von Kartenkatalogen (Sie haben es auch vergessen, richtig)
  4. Finden Sie heraus, wie Regale beschriftet und organisiert sind.
  5. Finden Sie heraus, wie Bücher in einem Regal angeordnet sind.
  6. Querverweis des Buchorts aus dem Kartenkatalog mit dem Organisationssystem, um das Buch zu finden.
  7. Nehmen Sie das Buch mit zur Kasse.
  8. Buch auschecken.
Lucent Fox
quelle
Geht es hier nicht mehr um Abstraktion als um Deklarativ / Imperativ? Sie weisen den Bibliothekar immer noch an, das Buch zu bringen.
Kamathln
Die Antwort wurde aktualisiert, um vollständiger zu sein und diesen Aspekt in die Lösung aufzunehmen.
Lucent Fox
3
Darin liegt etwas Wahres, aber es ist keine vollständige Definition. Mit deklarativer Programmierung geben Sie das Endziel an, ohne Rücksicht auf den Startpunkt. Bei der imperativen Programmierung ist ein definierter Startpunkt wichtig. Es ist wie der Unterschied zwischen einer Adresse und einer Wegbeschreibung. Die Adresse ist nützlich, egal wer Sie sind. Während Anweisungen ungültig sind, wenn Sie woanders beginnen.
Cthutu
24

Für die imperative Programmierung müssen Entwickler Schritt für Schritt festlegen, wie Code ausgeführt werden soll. Um unbedingt Anweisungen zu geben, sagen Sie: "Gehen Sie zur 1st Street, biegen Sie links in die Main Street ab, fahren Sie zwei Blocks, biegen Sie rechts in die Maple ab und halten Sie am dritten Haus auf der linken Seite." Die deklarative Version könnte ungefähr so ​​klingen: "Fahr zu Sues Haus." Man sagt, wie man etwas macht; der andere sagt, was zu tun ist.

Der deklarative Stil hat zwei Vorteile gegenüber dem imperativen Stil:

  • Es zwingt den Reisenden nicht, sich lange Anweisungen zu merken.
  • Dadurch kann der Reisende die Route nach Möglichkeit optimieren.

Calvert, C. Kulkarni, D. (2009). Essentieller LINQ. Addison Wesley. 48.

GorkemHalulu
quelle
11

Imperative Programmierung sagt dem Computer explizit, was zu tun ist und wie es zu tun ist, wie z. B. die Angabe der Reihenfolge und dergleichen

C #:

for (int i = 0; i < 10; i++)
{
    System.Console.WriteLine("Hello World!");
}

Deklarativ ist, wenn Sie dem Computer sagen, was zu tun ist, aber nicht wirklich, wie es zu tun ist. Datalog / Prolog ist die erste Sprache, die in dieser Hinsicht in den Sinn kommt. Grundsätzlich ist alles deklarativ. Sie können die Bestellung nicht wirklich garantieren.

C # ist eine viel wichtigere Programmiersprache, aber bestimmte C # -Funktionen sind deklarativer, wie z. B. Linq

dynamic foo = from c in someCollection
           let x = someValue * 2
           where c.SomeProperty < x
           select new {c.SomeProperty, c.OtherProperty};

Das Gleiche könnte zwingend geschrieben werden:

dynamic foo = SomeCollection.Where
     (
          c => c.SomeProperty < (SomeValue * 2)
     )
     .Select
     (
          c => new {c.SomeProperty, c.OtherProperty}
     )

(Beispiel aus Wikipedia Linq)

McKay
quelle
2
Sie haben einen Tippfehler: Die linq-Anweisungen sind deklarativ, nicht imperitiv (Sie haben "C # -Funktionen sind zwingender, wie Linq" sollte deklarativ lauten.
Reed Copsey
Behoben (vor einiger Zeit)
McKay
8

In der Informatik ist deklarative Programmierung ein Programmierparadigma, das die Logik einer Berechnung ausdrückt, ohne ihren Kontrollfluss zu beschreiben.

Von http://en.wikipedia.org/wiki/Declarative_programming

Kurz gesagt, die deklarative Sprache ist einfacher, weil ihr die Komplexität des Kontrollflusses fehlt (Schleifen, if-Anweisungen usw.).

Ein guter Vergleich ist das ASP.Net-Code-Behind-Modell. Sie haben deklarative '.ASPX'-Dateien und dann die imperativen' ASPX.CS'-Codedateien. Ich stelle oft fest, dass, wenn ich in der deklarativen Hälfte des Skripts alles tun kann, was ich brauche, viel mehr Leute verfolgen können, was getan wird.

Kervin
quelle
7

Hier von Philip Roberts stehlen :

  • Die zwingende Programmierung sagt der Maschine, wie etwas zu tun ist (was zu dem führt, was passieren soll).
  • Die deklarative Programmierung teilt der Maschine mit, was passieren soll (und der Computer findet heraus, wie es geht).

Zwei Beispiele:

1. Verdoppeln Sie alle Zahlen in einem Array

Imperativ:

var numbers = [1,2,3,4,5]
var doubled = []

for(var i = 0; i < numbers.length; i++) {
  var newNumber = numbers[i] * 2
  doubled.push(newNumber)
}
console.log(doubled) //=> [2,4,6,8,10]

Deklarativ:

var numbers = [1,2,3,4,5]

var doubled = numbers.map(function(n) {
  return n * 2
})
console.log(doubled) //=> [2,4,6,8,10]

2. Summieren Sie alle Elemente in einer Liste

Imperativ

var numbers = [1,2,3,4,5]
var total = 0

for(var i = 0; i < numbers.length; i++) {
  total += numbers[i]
}
console.log(total) //=> 15

Deklarativ

var numbers = [1,2,3,4,5]

var total = numbers.reduce(function(sum, n) {
  return sum + n
});
console.log(total) //=> 15

Beachten Sie, wie in den imperativen Beispielen eine neue Variable erstellt, mutiert und dieser neue Wert zurückgegeben wird (dh wie etwas geschehen kann), während die deklarativen Beispiele für eine bestimmte Eingabe ausgeführt werden und den neuen Wert basierend auf der ursprünglichen Eingabe zurückgeben (d. H. , was wir passieren wollen).

Chris Eaves-Kohlbrenner
quelle
5
Wie bei erschreckend vielen Antworten auf diese Frage ist Ihr Beispiel für "deklarative" Programmierung ein Beispiel für funktionale Programmierung. Die Semantik von 'map' lautet 'wendet diese Funktion der Reihe nach auf die Elemente des Arrays an'. Sie lassen der Laufzeit keinen Spielraum in der Reihenfolge der Ausführung.
Pete Kirkham
4

Imperative Programmierung
Eine Programmiersprache, die Programmierdisziplin wie C / C ++, Java, COBOL, FORTRAN, Perl und JavaScript erfordert. Programmierer, die in solchen Sprachen schreiben, müssen eine geeignete Reihenfolge der Aktionen entwickeln, um das Problem zu lösen, basierend auf Kenntnissen in Datenverarbeitung und Programmierung.

Deklarative Programmierung
Eine Computersprache, für die keine herkömmliche Programmierlogik geschrieben werden muss. Benutzer konzentrieren sich eher auf die Definition der Eingabe und Ausgabe als auf die Programmschritte, die in einer prozeduralen Programmiersprache wie C ++ oder Java erforderlich sind.

Deklarative Programmierbeispiele sind CSS, HTML, XML, XSLT, RegX.

Premraj
quelle
2

Das deklarative Programm ist nur ein Datenelement für seine mehr oder weniger "universelle" imperative Implementierung / vm.

Pluspunkte: Die Angabe nur von Daten in einem fest codierten (und überprüften) Format ist einfacher und weniger fehleranfällig als die direkte Angabe einer Variante eines imperativen Algorithmus. Einige komplexe Spezifikationen können nicht direkt geschrieben werden, sondern nur in einer DSL-Form. Best und Freq, die in DSLs Datenstrukturen verwendet werden, sind Mengen und Tabellen. weil Sie keine Abhängigkeiten zwischen Elementen / Zeilen haben. und wenn Sie keine Abhängigkeiten haben, haben Sie die Freiheit, Änderungen vorzunehmen und die Unterstützung zu vereinfachen. (Vergleichen Sie zum Beispiel Module mit Klassen - mit Modulen, die Sie zufrieden stellen, und mit Klassen, bei denen Sie ein fragiles Basisklassenproblem haben.) Alle Güter der Deklarativität und DSL ergeben sich unmittelbar aus den Vorteilen dieser Datenstrukturen (Tabellen und Mengen). Ein weiteres Plus: Sie können die Implementierung der deklarativen Sprache vm ändern, wenn DSL mehr oder weniger abstrakt ist (gut gestaltet). zum Beispiel parallel implementieren.

Minuspunkte: Sie raten richtig. Die Implementierung eines generischen (und durch DSL parametrisierten) imperativen Algorithmus / VM kann langsamer und / oder speicherhungrig sein als die spezifische. in manchen Fällen. Wenn diese Fälle selten sind - vergessen Sie es einfach, lassen Sie es langsam sein. Wenn es häufig ist, können Sie Ihr DSL / VM für diesen Fall jederzeit erweitern. Irgendwo, wo alle anderen Fälle langsamer werden, klar ...

PS Frameworks liegt auf halbem Weg zwischen DSL und Imperativ. und wie alle Halfway-Lösungen ... kombinieren sie Mängel, nicht Vorteile. Sie sind nicht so sicher UND nicht so schnell :) Schauen Sie sich das Alleskönner-Haskell an - es liegt auf halbem Weg zwischen starker einfacher ML und flexiblem Metaprog Prolog und ... was für ein Monster es ist. Sie können Prolog als Haskell mit nur booleschen Funktionen / Prädikaten betrachten. und wie einfach seine Flexibilität gegen Haskell ist ...

4KCheshireCat
quelle
2

Ich frage mich nur, warum niemand Attributklassen als deklaratives Programmierwerkzeug in C # erwähnt hat. Die beliebte Antwort auf dieser Seite hat gerade über LINQ als deklaratives Programmierwerkzeug gesprochen.

Laut Wikipedia

Zu den gebräuchlichen deklarativen Sprachen gehören Datenbankabfragesprachen (z. B. SQL, XQuery), reguläre Ausdrücke, Logikprogrammierung, Funktionsprogrammierung und Konfigurationsverwaltungssysteme.

Daher ist LINQ als funktionale Syntax definitiv eine deklarative Methode, aber Attributklassen in C # als Konfigurationstool sind auch deklarativ. Hier ist ein guter Ausgangspunkt, um mehr darüber zu erfahren: Kurzübersicht über die C # -Attributprogrammierung

Siavash Mortazavi
quelle
Dies ist ein guter Punkt und ein offensichtlicheres Beispiel, denke ich. Dinge wie linq können immer noch zwingend erscheinen, daher ist es verwirrend für Leute, die den Unterschied nicht kennen, aber Attribute sind nur schwer zu erkennen als deklarativ. Sie schlagen buchstäblich wenig "Tags" an Mitglieder, um zu erklären, was Sie mit ihnen machen möchten, aber Sie sagen in keiner Weise das Wie. Ich kann sehen, wie jemand sagen könnte, dass eine Linq-Abfrage immer noch das Wie sagt, weil Sie auf einer bestimmten Ebene ein beschreiben Form der Logik, die nicht so schwer ist, aber mit Attributen beschreiben Sie überhaupt keine Logik. Sie beschriften nur Dinge
user441521
2

Nur um ein weiteres Beispiel für die Entwicklung mobiler Apps hinzuzufügen. In iOS und Android haben wir Interface Builder, mit denen wir die Benutzeroberfläche der Apps definieren können.

Die mit diesen Buildern gezeichnete Benutzeroberfläche ist deklarativer Natur, wobei wir die Komponenten ziehen und ablegen. Die eigentliche Zeichnung erfolgt darunter und wird vom Framework und System ausgeführt.

Wir können aber auch die gesamten Komponenten im Code zeichnen, und das ist von Natur aus unerlässlich.

Einige neue Sprachen wie Angular JS konzentrieren sich darauf, Benutzeroberflächen deklarativ zu entwerfen, und wir sehen möglicherweise viele andere Sprachen, die dieselbe Unterstützung bieten. Wie Java hat keine gute deklarative Möglichkeit, native Desktop-Apps in Java Swing oder Java FX zu zeichnen, aber in naher Zukunft könnten sie es einfach.

Puneet Sharma
quelle
Java ist kein Akronym BTW
Mordechai
1

Nach meinem Verständnis haben beide Begriffe Wurzeln in der Philosophie, es gibt deklarative und imperative Arten von Wissen. Deklaratives Wissen sind Aussagen über die Wahrheit, Aussagen über Tatsachen wie mathematische Axiome. Es sagt dir etwas. Imperatives oder prozedurales Wissen zeigt Ihnen Schritt für Schritt, wie Sie zu etwas gelangen. Das ist im Wesentlichen die Definition eines Algorithmus. Wenn Sie möchten, vergleichen Sie eine Computerprogrammiersprache mit der englischen Sprache. Deklarative Sätze geben etwas an. Ein langweiliges Beispiel, aber hier ist eine deklarative Methode, um anzuzeigen, ob zwei Zahlen in Java gleich sind:

public static void main(String[] args)
{
    System.out.print("4 = 4.");
}

Imperative Sätze auf Englisch geben dagegen einen Befehl oder stellen eine Anfrage. Imperative Programmierung ist also nur eine Liste von Befehlen (mach das, mach das). Hier ist eine zwingende Möglichkeit, in Java anzuzeigen, ob zwei Zahlen gleich sind oder nicht, während Benutzereingaben akzeptiert werden:

private static Scanner input;    

public static void main(String[] args) 
{
    input = new Scanner(System.in);
    System.out.println();
    System.out.print("Enter an integer value for x: ");
    int x = input.nextInt();
    System.out.print("Enter an integer value for y: ");        
    int y = input.nextInt();

    System.out.println();
    System.out.printf("%d == %d? %s\n", x, y, x == y);
}

Im Wesentlichen überspringt deklaratives Wissen bestimmte Elemente, um eine Abstraktionsebene über diesen Elementen zu bilden. Die deklarative Programmierung macht dasselbe.

Matthew Conrad
quelle