In vielen Artikeln, die die Vorteile der funktionalen Programmierung beschreiben, habe ich funktionale Programmiersprachen wie Haskell, ML, Scala oder Clojure gesehen, die als "deklarative Sprachen" bezeichnet werden und sich von imperativen Sprachen wie C / C ++ / C # / Java unterscheiden. Meine Frage ist, warum funktionale Programmiersprachen deklarativ und nicht imperativ sind.
Eine häufig anzutreffende Erklärung für die Unterschiede zwischen deklarativer und imperativer Programmierung ist, dass Sie bei der imperativen Programmierung dem Computer sagen, wie etwas zu tun ist, und nicht, was in deklarativen Sprachen zu tun ist. Das Problem, das ich mit dieser Erklärung habe, ist, dass Sie ständig beides in allen Programmiersprachen tun. Selbst wenn Sie zur Baugruppe der untersten Ebene gehen und dem Computer immer noch sagen, was zu tun ist, weisen Sie die CPU an, zwei Zahlen hinzuzufügen. Sie weisen sie nicht an, wie das Hinzufügen durchgeführt werden soll. Wenn wir uns dem anderen Ende des Spektrums zuwenden, einer hochgradig reinen funktionalen Sprache wie Haskell, sagen Sie dem Computer tatsächlich, wie eine bestimmte Aufgabe zu erfüllen ist. Das ist, was Ihr Programm ist eine Folge von Anweisungen, um eine bestimmte Aufgabe zu erreichen, die der Computer nicht allein zu erreichen weiß. Ich verstehe, dass Sprachen wie Haskell, Clojure usw. offensichtlich höher sind als C / C ++ / C # / Java und Features wie Lazy Evaluation, unveränderbare Datenstrukturen, anonyme Funktionen, Currying, persistente Datenstrukturen usw. bieten funktionale Programmierung möglich und effizient, aber ich würde sie nicht als deklarative Sprachen klassifizieren.
Eine reine deklarative Sprache wäre für mich eine, die ausschließlich aus Deklarationen besteht. Ein Beispiel für eine solche Sprache wäre CSS (Ja, ich weiß, CSS wäre technisch gesehen keine Programmiersprache). CSS enthält nur Stildeklarationen, die von HTML und Javascript der Seite verwendet werden. CSS kann nichts anderes als Deklarationen erstellen, es kann keine Klassenfunktionen erstellen, dh Funktionen, die den anzuzeigenden Stil auf der Grundlage einiger Parameter bestimmen, Sie können keine CSS-Skripten ausführen usw. Das beschreibt für mich eine deklarative Sprache (ich habe nicht deklarativ gesagt) Programmiersprache ).
Aktualisieren:
Ich habe in letzter Zeit mit Prolog herumgespielt und für mich ist Prolog die Programmiersprache, die einer vollständig deklarativen Sprache am nächsten kommt (zumindest meiner Meinung nach), wenn es nicht die einzige vollständig deklarative Programmiersprache ist. Die Programmierung in Prolog wird durch Deklarationen ausgeführt, die entweder eine Tatsache (eine Prädikatfunktion, die für eine bestimmte Eingabe true zurückgibt) oder eine Regel (eine Prädikatfunktion, die für eine gegebene Bedingung / ein gegebenes Muster basierend auf den Eingaben true zurückgibt), Regeln angeben werden mit einer Mustervergleichstechnik definiert. Um irgendetwas in Prolog zu tun, fragen Sie die Wissensbasis ab, indem Sie eine oder mehrere Eingaben eines Prädikats durch eine Variable ersetzen, und Prolog versucht, Werte für die Variable (n) zu finden, für die das Prädikat erfolgreich ist.
Mein Punkt im Prolog ist, dass es keine zwingenden Anweisungen gibt. Sie sagen dem Computer im Grunde, was er weiß, und fragen dann nach dem Wissen. In funktionalen Programmiersprachen geben Sie weiterhin Anweisungen, dh nehmen Sie einen Wert, rufen Sie die Funktion X auf und fügen Sie 1 hinzu usw., auch wenn Sie nicht direkt die Speicherorte manipulieren oder die Berechnung Schritt für Schritt ausschreiben. Ich würde nicht sagen, dass die Programmierung in Haskell, ML, Scala oder Clojure in diesem Sinne aussagekräftig ist, auch wenn ich mich irre. Ist richtige, wahre, reine funktionale Programmierung deklarativ in dem Sinne, wie ich es oben beschrieben habe.
(let [x 1] (let [x (+ x 2)] (let [x (* x x)] x)))
(Hoffe du hast das verstanden, Clojure). Meine ursprüngliche Frage ist, was dies von diesem Int unterscheidet. x = 1; x += 2; x *= x; return x;
Meiner Meinung nach ist es größtenteils dasselbe.