832 Stimmen

Was ist der Unterschied zwischen dem deklarativen und dem imperativen Paradigma in der Programmierung?

Ich habe im Internet nach einer Definition für folgende Begriffe gesucht deklarativ et Imperativ Programmierung, die mir etwas Licht ins Dunkel bringen würde. Allerdings ist die Sprache, die bei einigen der Ressourcen, die ich gefunden habe, verwendet wird, entmutigend - zum Beispiel bei Wikipedia . Hat jemand ein Beispiel aus der Praxis, das er mir zeigen könnte und das dieses Thema aus einer anderen Perspektive beleuchten könnte (vielleicht in C#)?

76 Stimmen

Imperativ geht in ein Restaurant und bestellt ein Steak (blutig gebraten), Pommes frites (mit Ketchup), einen Beilagensalat (mit Ranch) und eine Cola (ohne Eis). Der Kellner liefert ihm genau das, was er bestellt hat, und berechnet ihm 14,50 Dollar. Auf der anderen Seite, Deklarativ geht 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 einem Steak (medium gegart), Kartoffelpüree, gedünstetem Brokkoli, einem Brötchen und einem Glas Wasser zurück. Ihm werden 11,99 Dollar berechnet.

3 Stimmen

Ein weiteres gutes Beispiel, das ich gefunden habe, ist vielleicht, wie Sie Docker-Dateien und Befehle tun... z.B. ein imperativer Ansatz ist, dass Sie alle Ihre Schritte nacheinander in der Befehlszeile definieren, z.B. erstellen Sie einen Container in aws, erstellen Sie ein Netzwerk und dann setzen Sie Ihre Ressourcen irgendwie zusammen... der DECLARATIVE Ansatz wäre dann: Sie DECLARE eine Dockerdatei (oder docker-compose.yaml), wo Sie im Wesentlichen alle Ihre Befehle (oder Sie nur benennen, was Sie wollen, dass es zu tun) innerhalb einer Datei, und dann einfach diese Datei ausführen. Seine deklariert alle auf einmal vorher, so sollte es immer ähnlich verhalten.

1 Stimmen

Sie können die Natur eines deklarativen Programms und der deklarativen Programmierung besser verstehen, wenn Sie sie als einen Konfigurations- und Konfigurationsprozess betrachten.

3voto

Matthew Conrad Punkte 41

Nach meinem Verständnis haben beide Begriffe ihre Wurzeln in der Philosophie, es gibt deklaratives und imperatives Wissen. Deklaratives Wissen sind Wahrheitsaussagen, Tatsachenbehauptungen wie mathematische Axiome. Es sagt Ihnen etwas. Imperatives oder prozedurales Wissen sagt Ihnen Schritt für Schritt, wie Sie zu etwas gelangen. Das ist es, was die Definition eines Algorithmus im Wesentlichen ausmacht. Vergleichen Sie doch einmal eine Computerprogrammiersprache mit der englischen Sprache. Deklarative Sätze sagen etwas aus. Ein langweiliges Beispiel, aber hier ist ein deklarativer Weg, um in Java anzuzeigen, ob zwei Zahlen gleich sind:

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

Imperativsätze im Englischen hingegen geben einen Befehl oder eine Aufforderung. Imperative Programmierung ist also nichts anderes als eine Liste von Befehlen (tu dies, tu das). Hier ist eine imperative Methode, mit der in Java angezeigt wird, ob zwei Zahlen gleich sind oder nicht, während eine Benutzereingabe akzeptiert wird:

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 deklaratives Wissen überspringt bestimmte Elemente, um eine Abstraktionsebene über diesen Elementen zu bilden. Die deklarative Programmierung tut dasselbe.

3voto

4KCheshireCat Punkte 51

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

Pluspunkte: Die Spezifikation von Daten in einem fest kodierten (und geprüften) Format ist einfacher und weniger fehleranfällig als die direkte Spezifikation einer Variante eines imperativen Algorithmus. Einige komplexe Spezifikationen können nicht direkt geschrieben werden, sondern nur in Form einer DSL. Die besten und am häufigsten in DSLs verwendeten Datenstrukturen sind Mengen und Tabellen, weil es keine Abhängigkeiten zwischen den Elementen/Zeilen gibt und wenn man keine Abhängigkeiten hat, hat man die Freiheit zu modifizieren und eine einfache Unterstützung. (Vergleichen Sie zum Beispiel Module mit Klassen - mit Modulen sind Sie glücklich und mit Klassen haben Sie das Problem der fragilen Basisklasse) alle Vorteile der Deklarativität und DSL folgen 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 entworfen). machen Sie parallele Implementierung, zum Beispiel. oder portieren Sie es auf andere Betriebssysteme usw. alle gut spezifizierten modularen isolierenden Schnittstellen oder Protokolle geben Ihnen solche Freiheit und Leichtigkeit der Unterstützung.

Minuspunkte: Sie haben richtig geraten. Eine generische (und durch DSL parametrisierte) imperative Algorithmus/VM-Implementierung kann langsamer und/oder speicherhungriger sein als eine spezifische. Wenn dieser Fall selten ist - vergessen Sie es einfach, lassen Sie es langsam sein. Wenn es häufig ist - können Sie Ihre DSL/VM immer für diesen Fall erweitern. irgendwo verlangsamen alle anderen Fälle, sicher...

P.S. Frameworks sind ein halber Weg zwischen DSL und Imperativ. und wie alle Lösungen auf halbem Weg ... kombinieren sie Defizite, nicht Vorteile. sie sind nicht so sicher UND nicht so schnell :) schauen Sie sich den Tausendsassa Haskell an - es ist ein halber Weg zwischen starker einfacher ML und flexiblem Metaprog Prolog und ... was für ein Monster es ist. Sie können Prolog als ein Haskell mit nur booleschen Funktionen/Prädikaten betrachten. und wie einfach seine Flexibilität im Vergleich zu Haskell ist ...

2voto

Puneet Sharma Punkte 9159

Ich möchte nur ein weiteres Beispiel für die Entwicklung mobiler Anwendungen anführen. 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 deklarativ, d. h. wir ziehen die Komponenten per Drag & Drop. Das eigentliche Zeichnen geschieht darunter und wird vom Framework und System durchgeführt.

Wir können aber auch die gesamten Komponenten in Code zeichnen, und das ist zwingend notwendig.

Außerdem konzentrieren sich einige neue Sprachen wie Angular JS auf die deklarative Gestaltung von Benutzeroberflächen, und es könnte sein, dass viele andere Sprachen die gleiche Unterstützung bieten. Java hat zum Beispiel keine gute deklarative Methode, um native Desktop-Anwendungen in Java Swing oder Java FX zu zeichnen, aber in naher Zukunft könnte das der Fall sein.

2voto

Siavash Mortazavi Punkte 817

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 gängigen deklarativen Sprachen gehören die Sprachen für Datenbankabfragen (z. B. SQL, XQuery), reguläre Ausdrücke, logische Programmierung, funktionale Programmierung und Konfigurationsmanagementsysteme.

LINQ als funktionale Syntax ist also definitiv eine deklarative Methode, aber Attributklassen in C# als Konfigurationswerkzeug sind ebenfalls deklarativ. Hier ist ein guter Ausgangspunkt, um mehr darüber zu lesen: Kurzer Überblick über die C#-Attributprogrammierung

0 Stimmen

Dinge wie Linq können immer noch imperativ erscheinen, so dass es für Leute, die den Unterschied nicht kennen, verwirrend ist, aber Attribute sind schwer anders als deklarativ zu sehen. Sie klatschen buchstäblich kleine "Tags" auf Mitglieder, um zu deklarieren, was Sie mit ihnen machen wollen, aber Sie sagen nicht das Wie in irgendeinem Sinne. Ich kann verstehen, wie jemand sagen könnte, dass eine Linq-Abfrage immer noch eine Art "Wie" ist, weil man auf einer gewissen Ebene eine Form von Logik beschreibt, die einfach nicht so schwer ist, aber mit Attributen beschreibt man überhaupt keine Logik, man bezeichnet nur Dinge.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X