it-swarm.com.de

Funktionale, deklarative und imperative Programmierung

Was bedeuten die Begriffe "funktionale", "deklarative" und "imperative" Programmierung?

459
curiouskitty

Für diese gibt es keine eindeutige, objektive Definition. Hier ist, wie [~ # ~] ich [~ # ~] sie definieren würde:

Imperativ - Der Fokus liegt eher auf den Schritten, die der Computer ausführen sollte, als auf den Schritten, die der Computer ausführen wird (z. B. C, C++) Java).

deklarativ - Der Schwerpunkt liegt auf dem, was der Computer tun soll, anstatt wie er es tun soll (z. B. SQL).

Functional - Eine Teilmenge deklarativer Sprachen, die sich stark auf die Rekursion konzentriert

100
Jason Baker

Imperativ und Deklarativ beschreiben zwei gegensätzliche Programmierstile. Imperativ ist der traditionelle "Schritt für Schritt Rezept" -Ansatz, während deklarativ eher "das ist, was ich will, jetzt erarbeiten Sie, wie es geht".

diese beiden Ansätze treten während der gesamten Programmierung auf - auch mit derselben Sprache und demselben Programm. Im Allgemeinen wird der deklarative Ansatz als vorzuziehen erachtet, da der Programmierer nicht so viele Details angeben muss, sondern auch weniger Chancen auf Fehler hat (wenn Sie das gewünschte Ergebnis beschreiben, kann ein gut getesteter automatischer Prozess von diesem Punkt zum nächsten zurückkehren) Definieren Sie die Schritte, und hoffen Sie, dass die Dinge zuverlässiger sind, als wenn Sie jeden Schritt von Hand spezifizieren müssen.

auf der anderen Seite bietet ein zwingender Ansatz mehr Kontrolle auf niedriger Ebene - es ist der "Mikromanager-Ansatz" für die Programmierung. und das kann es dem Programmierer ermöglichen, das Wissen über das Problem zu nutzen, um eine effizientere Antwort zu geben. So ist es nicht ungewöhnlich, dass einige Teile eines Programms in einem deklarativeren Stil geschrieben werden, aber dass die geschwindigkeitskritischen Teile zwingender sind.

wie Sie sich vielleicht vorstellen können, wirkt sich die Sprache, die Sie zum Schreiben eines Programms verwenden, darauf aus, wie deklarativ Sie sein können. Eine Sprache mit integrierten "intelligenten" Funktionen für die Ermittlung der zu treffenden Aktionen bei einer Beschreibung des Ergebnisses wird eine wesentlich aussagekräftigere Sprache ermöglichen Ansatz als einer, bei dem der Programmierer zuerst diese Art von Intelligenz mit imperativem Code hinzufügen muss, bevor er in der Lage ist, eine deklarativere Ebene darüber aufzubauen. So wird beispielsweise eine Sprache wie ein Prolog als sehr aussagekräftig angesehen, da sie über einen integrierten Prozess verfügt, der nach Antworten sucht.

bisher werden Sie feststellen, dass ich funktionsfähig Programmierung nicht erwähnt habe. Das liegt daran, dass es sich um einen Begriff handelt, dessen Bedeutung nicht unmittelbar mit den beiden anderen zusammenhängt. Im einfachsten Fall bedeutet funktionale Programmierung, dass Sie Funktionen verwenden. Insbesondere, dass Sie eine Sprache verwenden, die Funktionen als "erstklassige Werte" unterstützt - das bedeutet, dass Sie nicht nur Funktionen schreiben können, sondern auch Funktionen schreiben können, die Funktionen schreiben (die Funktionen schreiben, die ...) und Funktionen übergeben funktionen. Kurz gesagt - diese Funktionen sind so flexibel und gebräuchlich wie Zeichenfolgen und Zahlen.

es mag daher seltsam erscheinen, dass funktional, imperativ und deklarativ oft zusammen erwähnt werden. Der Grund dafür ist die Konsequenz, die Idee der funktionalen Programmierung "auf die Spitze" zu treiben. Eine Funktion ist im wahrsten Sinne des Wortes etwas aus der Mathematik - eine Art "Black Box", die Eingaben benötigt und immer die gleiche Ausgabe liefert. und für diese Art von Verhalten müssen keine sich ändernden Variablen gespeichert werden. Wenn Sie also eine Programmiersprache entwerfen, deren Ziel es ist, eine sehr reine, mathematisch beeinflusste Idee der funktionalen Programmierung umzusetzen, lehnen Sie letztendlich die Idee von Werten weitgehend ab, die sich ändern können (in einem bestimmten, begrenzten, technischen Sinne).

und wenn Sie dies tun - wenn Sie die Änderungsmöglichkeiten von Variablen einschränken -, werden Sie fast zufällig dazu gezwungen, deklarativere Programme zu schreiben, da ein großer Teil der imperativen Programmierung beschreibt, wie sich Variablen ändern, und Sie können dies nicht mehr TU das! es stellt sich also heraus, dass die funktionale Programmierung - insbesondere die Programmierung in einer funktionalen Sprache - eher deklarativen Code liefert.

um es zusammenzufassen:

  • imperativ und Deklarativ sind zwei gegensätzliche Programmierstile (die gleichen Namen werden für Programmiersprachen verwendet, die diese Stile fördern).

  • funktionale Programmierung ist ein Programmierstil, bei dem Funktionen sehr wichtig werden und in der Folge sich ändernde Werte an Bedeutung verlieren. Die eingeschränkte Möglichkeit, Wertänderungen anzugeben, erzwingt einen deklarativeren Stil.

daher wird "funktionale Programmierung" oft als "deklarativ" bezeichnet.

52
andrew cooke

In einer Nussschale:

Ein imperative Sprache gibt eine Reihe von Anweisungen an, die der Computer nacheinander ausführt (tun Sie dies, dann tun Sie das).

A deklarative Sprache deklariert eine Reihe von Regeln darüber, welche Ausgaben aus welchen Eingaben resultieren sollen (z. B. wenn Sie A haben, dann ist das Ergebnis B). Eine Engine wendet diese Regeln auf Eingaben an und gibt eine Ausgabe aus.

Eine funktionale Sprache deklariert eine Reihe von mathematischen/logischen Funktionen, die definieren, wie Eingaben in Ausgaben übersetzt werden. z.B. f(y) = y * y. Es ist eine Art deklarative Sprache.

50
mdja

Imperativ: wie um unser Ziel zu erreichen

   Take the next customer from a list.
   If the customer lives in Spain, show their details.
   If there are more customers in the list, go to the beginning

Deklarativ: was wir erreichen wollen

   Show customer details of every customer living in Spain
23
Arturo Herrero

Imperative Programmierung bezeichnet jeden Programmierstil, bei dem Ihr Programm aus Anweisungen aufgebaut ist beschreibt, wie die von einem Computer ausgeführten Vorgänge ablaufen.

Deklarative Programmierung bezeichnet jeden Programmierstil, bei dem Ihr Programm eine Beschreibung des Problems oder der Lösung enthält - aber es wird nicht ausdrücklich angegeben, wie die Arbeit ausgeführt wird.

Functional Programming ist das Programmieren durch Auswerten von Funktionen und Funktionen von Funktionen ... Als (genau definierte) funktionale Programmierung bezeichnet man das Programmieren durch Definieren von nebenwirkungsfreien mathematischen Funktionen, also ist eine Form der deklarativen Programmierung aber es ist nicht die einzige Art deklarativer Programmierung.

Logikprogrammierung (zum Beispiel in Prolog) ist eine andere Form der deklarativen Programmierung. Dabei wird durch Entscheiden, ob eine logische Aussage wahr ist (oder ob sie erfüllt werden kann), berechnet. Das Programm besteht in der Regel aus einer Reihe von Fakten und Regeln - d. H. Einer Beschreibung statt einer Reihe von Anweisungen.

Term Rewriting (zum Beispiel CASL) ist eine andere Form der deklarativen Programmierung. Es beinhaltet die symbolische Transformation von algebraischen Begriffen. Es unterscheidet sich vollständig von der Logikprogrammierung und der funktionalen Programmierung.

21
Dafydd Rees

imperativ - Ausdrücke beschreiben die Reihenfolge der auszuführenden Aktionen (assoziativ)

deklarativ - Ausdrücke sind Deklarationen, die zum Verhalten des Programms beitragen (assoziativ, kommutativ, idempotent, monoton)

funktional - Ausdrücke haben Wert als einzige Auswirkung; Die Semantik unterstützt das Gleichheitsdenken

13
dmbarbour

Imperative Programmierung: Sagen Sie der „Maschine“, wie sie etwas tun soll, und als Ergebnis wird passieren, was Sie tun möchten.

Deklarative Programmierung: Sagen Sie der „Maschine“, was passieren soll, und lassen Sie den Computer herausfinden, wie es geht.

Beispiel eines Imperativs

function makeWidget(options) {
    const element = document.createElement('div');
    element.style.backgroundColor = options.bgColor;
    element.style.width = options.width;
    element.style.height = options.height;
    element.textContent = options.txt;

    return element;
}

Beispiel für deklarativ

function makeWidget(type, txt) {
    return new Element(type, txt);
}

Hinweis: Der Unterschied besteht nicht in Kürze, Komplexität oder Abstraktion. Wie gesagt, der Unterschied ist wie vs was.

6
yondoo

Heutzutage neuer Fokus: Brauchen wir die alten Klassifikationen?

Der Imperativ/Deklarativ/Funktional Aspekt war in der Vergangenheit gut, um generische Sprachen zu klassifizieren, aber heutzutage haben alle "großen Sprachen" (wie Java, Python, Javascript usw.) einige Option (normalerweise Frameworks ), um mit "anderem Fokus" als dem Hauptfokus (üblicher Imperativ) auszudrücken, und um parallele Prozesse, deklarative Funktionen, Lambdas usw. auszudrücken.

Eine gute Variante dieser Frage ist "Welcher Aspekt ist heute gut, um Frameworks zu klassifizieren?" ... Ein wichtiger Aspekt ist etwas, das wir kennzeichnen können "Programmierstil" ...

Konzentrieren Sie sich auf die Fusion von Daten mit Algorithmus

Ein gutes Beispiel zum Erklären. Wie Sie können lesen Sie über jQuery bei Wikipedia ,

Der Satz von jQuery-Kernfunktionen - DOM-Elementauswahl, Durchquerung und Manipulation -, der durch seine Auswahlmaschine (...) aktiviert wurde, erzeugte einen neuen "Programmierstil", der Algorithmen und DOM-Datenstrukturen fusionierte

Daher ist jQuery das beste (populäre) Beispiel für die Fokussierung auf einen "neuen Programmierstil" , dh nicht nur Objektorientierung, sondern " Fusionieren Algorithmen und Datenstrukturen ". jQuery ist etwas reaktiv wie Tabellenkalkulationen, aber nicht "zellenorientiert", sondern " DOM-knotenorientiert " ... Vergleichen der Hauptstile in diesem Zusammenhang:

  1. Keine Verschmelzung : In allen "großen Sprachen", in jedem funktionalen/deklarativen/imperativen Ausdruck, ist das Übliche "keine Verschmelzung" von Daten und Algorithmus, außer durch eine Objektorientierung ist das eine Fusion in strenge algebrische Struktur Sichtweise.

  2. Einige Fusionen : Alle klassischen Fusionsstrategien haben heutzutage einen Rahmen, der sie als Paradigma verwendet ... Datenfluss , - Ereignisgesteuertes Programmieren (oder alte domänenspezifische Sprachen wie awk und XSLT ) ... wie Programmieren mit moderne Tabellenkalkulationen, sie sind auch Beispiele für reaktive Programmierung Stil.

  3. Big Fusion : ist "der jQuery-Stil" ... jQuery ist eine domänenspezifische Sprache mit dem Schwerpunkt " fusionieren Algorithmen und DOM-Datenstrukturen ".
    PS: Andere "Abfragesprachen", wie XQuery, SQL (mit PL als imperativer Ausdrucksoption) sind ebenfalls Datenalgorithmus-Fusionsbeispiele, aber sie sind Inseln , ohne Fusion mit anderen Systemmodulen ... Spring , bei Verwendung von find()- -Varianten und Specification -Klauseln, ist ein weiterer Vorteil Fusionsbeispiel.

4
Peter Krauss

Ich denke, dass Ihre Taxonomie falsch ist. Es gibt zwei entgegengesetzte Arten von Imperativ und Deklarativ. Funktional ist nur ein Subtyp von deklarativ. Übrigens, Wikipedia gibt die gleiche Tatsache an.

3
Rorick

Beim deklarativen Programmieren wird eine zeitlose Logik zwischen der Eingabe und der Ausgabe ausgedrückt. Beispielsweise wäre das folgende Beispiel im Pseudocode deklarativ:

def factorial(n):
  if n < 2:
    return 1
  else:
    return factorial(n-1)

output = factorial(argvec[0])

Wir definieren hier nur eine Beziehung, die als 'Fakultät' bezeichnet wird, und definieren die Beziehung zwischen der Ausgabe und der Eingabe als diese Beziehung. Wie hier offensichtlich sein sollte, erlaubt jede strukturierte Sprache in gewissem Umfang deklaratives Programmieren. Eine zentrale Idee der deklarativen Programmierung sind unveränderliche Daten. Wenn Sie eine Variable zuweisen, tun Sie dies nur einmal und dann nie wieder. Andere, strengere Definitionen haben zur Folge, dass es möglicherweise überhaupt keine Nebenwirkungen gibt. Diese Sprachen werden manchmal als "rein deklarativ" bezeichnet.

Das gleiche Ergebnis in einem imperativen Stil wäre:

a = 1
b = argvec[0]
while(b < 2):
  a * b--

output = a

In diesem Beispiel haben wir keine zeitlose statische logische Beziehung zwischen dem Eingang und dem Ausgang ausgedrückt. Wir haben die Speicheradressen manuell geändert, bis einer von ihnen das gewünschte Ergebnis erzielt hat. Es sollte offensichtlich sein, dass alle Sprachen deklarative Semantik in gewissem Umfang zulassen, aber nicht alle imperative, sondern nur rein deklarative Sprachen Nebenwirkungen und Mutationen insgesamt zulassen.

In deklarativen Sprachen wird häufig angegeben, was zu tun ist, und nicht, wie es zu tun ist. Ich halte das für eine Fehlbezeichnung. Deklarative Programme geben immer noch an, wie man von der Eingabe zur Ausgabe gelangen muss, aber auf andere Weise Die von Ihnen angegebene Beziehung muss effektiv berechenbar sein (wichtiger Begriff, schlagen Sie nach, wenn Sie ihn nicht kennen). Ein anderer Ansatz ist die nicht deterministische Programmierung, die wirklich nur angibt, welche Bedingungen ein Ergebnis stark erfüllt, bevor Ihre Implementierung alle Pfade auf Versuch und Irrtum ausschöpft, bis es erfolgreich ist.

Rein deklarative Sprachen sind Haskell und Pure Prolog. Eine gleitende Skala von einem zum anderen wäre: Pure Prolog, Haskell, OCaml, Schema/LISP, Python, Javascript, C--, Perl, PHP, C++, Pascall, C, Fortran, Assembly

3
Zorf

Hier einige gute Antworten zu den genannten "Typen".

Ich reiche einige zusätzliche, "exotischere" Konzepte ein, die häufig mit der Menge der funktionalen Programmierer in Verbindung gebracht werden:

  • Domain Specific Language oder DSL Programmierung: Erstellen einer neuen Sprache zur Lösung des Problems.
  • Meta-Programming: wenn Ihr Programm andere Programme schreibt.
  • Evolutionäre Programmierung: Hier erstellen Sie ein System, das sich ständig verbessert oder nach und nach bessere Generationen von Unterprogrammen generiert.
3
msmithgu

Kurz gesagt, je mehr ein Programmierstil betont, was zu tun ist, umso mehr wird dieser Stil als deklarativ betrachtet, wenn die Details von Wie zu tun sind. Für den Imperativ gilt das Gegenteil. Funktionale Programmierung ist mit dem deklarativen Stil verbunden.

2
jchadhowell