Was ist der Unterschied zwischen deklarativen und prozeduralen Programmierparadigmen?


Antworten:


108

Imperativ

Es gibt verschiedene Unterparadigmen des imperativen Programmierparadigmas, wie das prozedurale oder das objektorientierte Programmierparadigma.

Im imperativen Programmierparadigma beschreiben Sie den Algorithmus Schritt für Schritt in verschiedenen Abstraktionsgraden.

Beispiele für Programmiersprachen, die das prozedurale Paradigma unterstützen:

  • C (und die meisten anderen Legacy-Sprachen)
  • Meistens PHP
  • In gewissem Sinne alle wichtigen Sprachen

Objektorientierte

Es bezieht sich normalerweise auf Sprachen, die eine Hierarchie von Typen aufweisen , die sowohl Methoden als auch Status von Basistypen zu abgeleiteten Typen erben, aber auch das ungewöhnliche prototypbasierte JavaScript enthalten.

Beispiele für Programmiersprachen, die das OO-Paradigma unterstützen:

  • Java

Deklarativ

Es gibt verschiedene Unterparadigmen des deklarativen Programmierparadigmas, wie das funktionale oder das logische Programmierparadigma.

Im deklarativen Programmierparadigma beschreiben Sie ein Ergebnis oder ein Ziel und erhalten es über eine " Black Box ". Das Gegenteil von Imperativ.

Beispiele für Programmiersprachen, die das deklarative Programmierparadigma unterstützen:

  • yacc
  • Baumkrone
  • SQL
  • Reguläre Ausdrücke
  • lex
  • XSLT
  • Markup, Troff, CSS, VHDL

Funktionell

Die funktionale Programmierung betont die Anwendung von Funktionen ohne Nebenwirkungen und ohne veränderlichen Zustand. Die obigen deklarativen Systeme weisen bestimmte Aspekte der funktionalen Programmierung auf.

Beispiele für Programmiersprachen, die das deklarative Funktionsparadigma unterstützen:

  • Haskell
  • OCaml
  • Planen
  • Erlang
  • F #
  • Scala

61

In der deklarativen Programmierung sagen Sie, was Sie wollen, ohne sagen zu müssen, wie es geht. Bei der prozeduralen Programmierung müssen Sie genaue Schritte angeben, um das Ergebnis zu erhalten.

Beispielsweise ist SQL deklarativer als prozedural, da die Abfragen keine Schritte zum Erzeugen des Ergebnisses angeben.


2
+1 für ein gutes Beispiel unter SQL. Können wir bitte weitere Beispiele haben?
Mauris

5
Mauris: Vielleicht keine Programmiersprache, aber HTML ist deklarativ, weil Sie beschreiben, was Sie wollen (ein Absatz mit diesem Bit in Fettdruck), anstatt "Zeichenfolge zeichnen, Zeichenfolge messen, Position vorrücken usw." zu schreiben. Ein anderes Beispiel ist Prolog, bei dem ein "Programm" eine deklarative Menge von Fakten und Beziehungen / Abzügen sowie eine Abfrage ist. Die Prolog-Engine ermittelt, wie die Abfrage ausgewertet wird: Sie müssen ihr nicht mitteilen, wie dies zu tun ist. Schließlich reguläre Ausdrücke: Sie beschreiben das Muster, anstatt die Schritte zum Testen auf Übereinstimmung zu formulieren.
Itowlson

MXML (Teil des Flex-Frameworks) ist deklarativ: Sie geben an, in welcher Reihenfolge Ihre Objekte / Container angezeigt werden sollen, und das Layout wird abhängig davon festgelegt, ob Sie es horizontal oder vertikal anordnen sollen. ActionScript 3 ist prozedural und unterstützt OOP-Paradigmen.
Hurra Ich

Makefiles ist eine andere ziemlich berühmte deklarative Sprache
Stefano Borini

25

Lassen Sie mich Ihnen ein Beispiel aus der Praxis geben: Ich brauche eine Tasse Tee.

Verfahren:

  1. Geh in die Küche
  2. Holen Sie sich Zucker, Milch und Tee,
  3. Mischen Sie sie und erhitzen Sie sie über dem Feuer, bis es kocht
  4. Gib das in eine Tasse und bring es mir

Deklarativ:

  1. Hol mir eine Tasse Tee.

In einer prozeduralen Sprache definieren Sie den gesamten Prozess und geben die entsprechenden Schritte an. Sie geben nur Bestellungen ein und definieren, wie der Prozess bedient wird.

In einer deklarativen Sprache legen Sie einfach den Befehl oder die Reihenfolge fest und lassen es im System sein, wie diese Reihenfolge ausgeführt werden soll. Sie brauchen nur Ihr Ergebnis, ohne zu überlegen, wie es gemacht werden soll.


2
Dieses extrem vereinfachte Beispiel hat den Punkt für mich (ein bisschen) nach Hause gebracht. Aber eines nervt mich immer noch, wenn ich versuche, den Unterschied zu verstehen - was ist, wenn es keinen Befehl "Hol mir eine Tasse Tee" gibt? Müssten Sie es dann selbst erstellen? Wenn ja, würden Sie nicht eine Funktion erstellen, die dem Verfahrensbeispiel ähnelt? Ich denke, was mich verwirrt, ist, dass es so aussieht, als ob prozedural und deklarativ keine festen Eigenschaften einer bestimmten Sprache sind , sondern wie Sie diese Sprache verwenden. Man könnte in Java "Hol mir eine Tasse Tee" sagen , wenn das eine verfügbare Methode ist ...
Magnus W

3
Ich frage mich, ob "1. Tee, Earl Grey, Hot" ein besseres Beispiel wäre. Es wird erklärt, was geliefert werden muss, nicht welche Aktionen ausgeführt werden müssen ('Get me ...')
JeffUK

Magnus, deine Frage ist absolut richtig. Meiner Meinung nach sind die deklarativen Sprachen höhere Sprachen und leiten sich aus dem Verfahren ab. Erinnern Sie sich an die Zeit, als Entwickler Befehlszeilen verwenden müssen, um zwei Zahlen hinzuzufügen? Jetzt können Sie mit nur einer einfachen Funktion die Summe von zwei oder mehr Zahlen erhalten. Wenn es aus meiner Sicht keinen Befehl "Hol mir eine Tasse Tee" gibt, müssen Sie ihn erstellen. Wenn die nächste Person versucht, es zu benutzen, wird es dort sein. Das ist nach meinem schlechten Wissen. Vielen Dank
Muhammad Zeeshan Tahir

5

Verfahrensprogrammierung :

Bei der prozeduralen Programmierung folgt das Programm beim Start einer Reihe von Anweisungen. Die Anweisungen können sich je nach Datei- oder Speicherinhalt ändern, variieren jedoch insgesamt nicht stark. Die Eingabe in das Programm erfolgt normalerweise nicht über Benutzereingaben in Echtzeit, sondern aus einem vorab gesammelten Datensatz.

Deklarative Programmierung:

Bei der deklarativen ereignisgesteuerten Programmierung wird ein Datenbestand mit optionalen Aktionen zentralisiert, die das Programm ausführen kann. Beispielsweise ist jedes "Ereignis" in einem Textverarbeitungsprogramm eine Maus- oder Tastatur- (oder Datei-) Änderung, die sich auf die Daten und Dokumente auswirkt. Sie müssen nicht in beliebiger Reihenfolge durchgeführt werden. Die ereignisgesteuerte Programmierung erfolgt in Form kleiner Programme (Ereignishandler), die alle mit einem gemeinsamen Datensatz arbeiten, sodass jedes kleine Programm dieselben Daten verwenden kann, das Dokument in diesem Beispiel.


1

Der Hauptunterschied zwischen zwei Programmiersprachen besteht darin, dass wir dem Computer bei der prozeduralen Programmierung mitteilen, wie das Problem zu lösen ist, und bei der deklarativen Programmierung dem Computer mitteilen, welches Problem gelöst werden soll.


0

Um den ansiblen Kommentar anzusprechen und vielleicht ein Beispiel zwischen den Unterschieden der beiden zu liefern. Ansible ist prozedural, wenn so etwas wie Marionette oder Terraform deklarativ sind. Beispielsweise erstellen Sie eine ansible yaml-Datei, um 10 ec2-Instanzen wie folgt bereitzustellen:
-ec2: count: 10 image: ami-058c6e5b73b074cd2 instance_type: t2.micro

Wenn Sie diese Datei zweimal ausführen würden, würden Sie 20 t2.micro ec2-Instanzen erhalten. Wenn Sie das Äquivalent in einer deklarativen Sprache wie terraform geschrieben und zweimal ausgeführt hätten, würden nur 10 t2.micro-Instanzen ausgeführt, unabhängig davon, wie oft Sie es ausgeführt haben. Deklarative Sprachen geben den Endzustand an. Prozedurale Sprachen tun einfach das, was Sie sagen, ohne Rücksicht auf den aktuellen oder vergangenen Zustand.



-2

Im prozeduralen Ansatz codieren Sie Ihre Anweisung, um das Ergebnis zu erzielen. Im deklarativen Ansatz definieren Sie, was gelöst werden muss, als das Wissen, das Problem zu lösen. Schauen Sie sich das Beispiel eines prozeduralen oder deklarativen Ansatzes an, das ich in beiden Ansätzen implementiert habe.

Wie Sie im Beispiel sehen würden, müssen Sie im deklarativen Ansatz nicht anweisen, wie das Problem gelöst werden soll.


Sie verweisen auf externe Beispiele, als wären sie hier geschrieben worden. Bringen Sie Ihre Beispiele als Teil Ihrer Antwort ein.
ChronoFish
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.