Deklarative Programmierung

Im Informatik, deklarative Programmierung ist ein Programmierparadigma- Ein Stil des Aufbaus der Struktur und Elemente von Computerprogrammen - die die Logik von a ausdrückt Berechnung ohne seine zu beschreiben Steuerfluss.[1]

Viele Sprachen, die diesen Stilversuch anwenden, um zu minimieren oder zu eliminieren Nebenwirkungen durch Beschreibung was Das Programm muss in Bezug auf das erreichen Problemdomäne, anstatt zu beschreiben wie um es als Abfolge der Programmierung zu erreichen Sprachprimitive[2] (das wie der Sprache überlassen werden Implementierung). Dies steht im Gegensatz zu Imperative Programmierung, was implementiert Algorithmen in expliziten Schritten.[3]

Deklarative Programmierung berücksichtigt oft Programme als Theorien von a formelle Logikund Berechnungen als Abzüge in diesem Logikraum. Die deklarative Programmierung kann das Schreiben erheblich vereinfachen Parallelprogramme.[4]

Gemeinsame deklarative Sprachen umfassen diejenigen von Datenbankabfragesprachen (z.B., Sql, XQuery), Reguläre Ausdrücke, Logikprogrammierung, Funktionelle Programmierung, und Konfigurationsmanagement Systeme.

Definition

Die deklarative Programmierung wird oft als jeder Programmstil definiert, der nicht ist Imperativ. Eine Reihe anderer gemeinsamer Definitionen versuchen, es zu definieren, indem sie einfach mit einer imperativen Programmierung kontrastieren. Zum Beispiel:

Diese Definitionen überschneiden sich erheblich.

Die deklarative Programmierung ist ein nicht imperativer Programmstil, bei dem Programme ihre gewünschten Ergebnisse beschreiben, ohne explizit Befehle oder Schritte aufzulisten, die ausgeführt werden müssen. Funktional und Logische Programmierung Sprachen sind durch einen deklarativen Programmierstil gekennzeichnet. Im Logische Programmiersprachen, Programme bestehen aus logischen Aussagen, und das Programm wird ausgeführt, indem sie nach Beweisen der Aussagen suchen.

In einem reine funktionale Sprache, wie zum Beispiel Haskellalle Funktionen sind ohne Nebenwirkungenund Zustandsänderungen werden nur als Funktionen dargestellt, die den Zustand verändern, der ausdrücklich als a dargestellt wird erste Klasse Objekt im Programm. Obwohl reine funktionale Sprachen nicht imperativ sind, bieten sie häufig eine Funktion zur Beschreibung der Wirkung einer Funktion als Reihe von Schritten. Andere funktionale Sprachen, wie z. Lispeln, Ocaml und ErlangUnterstützen Sie eine Mischung aus prozeduraler und funktionaler Programmierung.

Einige logische Programmiersprachen, wie z. Prologund Datenbankabfragesprachen wie SQL, obwohl sie im Prinzip deklarativ deklarativ sind, unterstützen jedoch auch einen prozeduralen Programmstil.

Subparadigmen

Deklarative Programmierung ist eine Dachbegriff Das schließt eine Reihe von besser bekannt Programmierparadigmen.

Einschränkungsprogrammierung

Einschränkungsprogrammierung Staaten Beziehungen zwischen Variablen in Form von Einschränkungen, die die Eigenschaften der Ziellösung angeben. Der Satz von Einschränkungen ist gelöst Indem Sie jeder Variablen einen Wert geben, so dass die Lösung mit der maximalen Anzahl von Einschränkungen übereinstimmt. Die Einschränkungsprogrammierung ergänzt häufig andere Paradigmen: funktionale, logische oder sogar imperative Programmierung.

Domänenspezifische Sprachen

Bekannte Beispiele für deklarativ Domänenspezifische Sprachen (DSLS) enthalten die yacc Parser -Generator -Eingangssprache, QML, das Machen Spezifikationssprache erstellen, Marionette's Konfigurationsverwaltungssprache, Reguläre Ausdrückeund eine Untergruppe von Sql (Wählen Sie zum Beispiel Abfragen). DSLs haben den Vorteil, nützlich zu sein, während sie nicht unbedingt sein müssen Turing-Complete, was es leichter macht, dass eine Sprache rein deklarativ ist.

Viele Markup -Sprachen wie Html, Mxml, Xaml, Xslt oder andere Benutzerkennungs-Markup-Sprachen sind oft deklarativ. HTML zum Beispiel beschreibt nur, was auf einer Webseite erscheinen soll - es gibt keine an Steuerfluss Zum Rendern einer Seite oder der möglichen Seite der Seite Interaktionen mit einem Benutzer.

Ab 2013, einige Softwaresysteme[die?] Kombinieren Sie herkömmliche Markup-Sprachen (z. B. HTML) mit deklarativem Markup, das definiert, was (aber nicht wie) die Back-End-Serversysteme tun sollten, um die deklarierte Schnittstelle zu unterstützen. Solche Systeme, die typischerweise eine domänenspezifische Verwendung verwenden XML -Namespacekann Abstraktionen der SQL -Datenbanksyntax oder parametrisierte Aufrufe an Webdienste enthalten Repräsentationsstaatsübertragung (Ruhe und SEIFE.

Funktionelle Programmierung

Funktionale Programmiersprachen wie z. Haskell, Planen, und Ml Bewerten Sie die Ausdrücke über Funktionsanwendungen. Im Gegensatz zu den verwandten aber mehr Imperativ Paradigma von Verfahrensprogrammierung, Funktionaler Programmierung legt wenig Wert auf explizite Sequenzierung. Zum Beispiel in PlanenDie Reihenfolge der Bewertung vieler Arten von Unterexpressionen ist undefiniert oder implizit.[6] Stattdessen sind Berechnungen durch verschiedene Arten von rekursiver Arten gekennzeichnet Funktion höherer Ordnung Anwendung und Komposition, mit expliziten Hinweisen auf I/A und Daten sparsam erscheinen, und Zustandsmutation vermieden oder eingekapselt woimmer möglich.

Hybridsprachen

Makefiles geben beispielsweise Depecies auf deklarative Weise an,[7] Fügen Sie aber auch eine imperative Liste von Maßnahmen hinzu. In ähnlicher Weise gibt YACC eine kontextfreie Grammatik deklarativ an, enthält jedoch Codeausschnitte aus einer Hostsprache, die normalerweise unerlässlich ist (wie z. C).

Logikprogrammierung

Logische Programmiersprachen wie z. Prolog Zustand und Abfragebeziehungen. Die Einzelheiten von wie Diese Abfragen werden beantwortet, ist der Implementierung und ihrem Theorem -Prover, aber in der Regel die Form einer Art annehmen Vereinigung. Wie die funktionale Programmierung ermöglichen viele logische Programmiersprachen Nebenwirkungen und sind daher nicht streng deklarativ.

Modellieren

Modelle oder mathematische Darstellungen von physischen Systemen können in einem deklarativen Computercode implementiert werden. Der Code enthält eine Reihe von Gleichungen, nicht die imperativen Zuordnungen, die die Verhaltensbeziehungen beschreiben ("deklarieren"). Wenn ein Modell in diesem Formalismus ausgedrückt wird, kann ein Computer algebraische Manipulationen durchführen, um den Lösungsalgorithmus am besten zu formulieren. Die mathematische Kausalität wird typischerweise an den Grenzen des physikalischen Systems auferlegt, während die Verhaltensbeschreibung des Systems selbst deklarativ oder akaus ist. Deklarativ Modellierungssprachen und Umgebungen umfassen Analytica, Modelica und Gleichnis.[8]

Beispiele

Lispeln

Lispeln (1958) steht für "Listenprozessor".[9] Es ist auf den Prozess zugeschnitten Listen. Eine vollständige Struktur der Daten wird durch Erstellen von Listenlisten gebildet. Im Gedächtnis a Baumdatenstruktur ist gebaut. Intern kostet die Baumstruktur gut für rekursiv Funktionen.[10] Die Syntax zum Bau eines Baum Elemente innerhalb von Klammern. Das Folgende ist eine Liste von drei Elementen. Die ersten beiden Elemente sind selbst Listen von zwei Elementen:

((A b) (Hallo Welt) 94)

LISP hat Funktionen zum Extrahieren und Rekonstruktion von Elementen.[11] Die Funktion Kopf() Gibt eine Liste zurück, die das erste Element in der Liste enthält. Die Funktion Schwanz() Gibt eine Liste zurück, die alles außer dem ersten Element enthält. Die Funktion cons () Gibt eine Liste zurück, die die Verkettung anderer Listen ist. Daher gibt der folgende Ausdruck die Liste zurück x:

Nachteile (Kopf (x), Schwanz (x))

Ein Nachteil von Lisp ist, wenn viele Funktionen verschachtelt sind, können die Klammern verwirrend aussehen.[12] Modern LISP Umgebungen Helfen Sie mit der Übereinstimmung mit Klammern. Abgesehen davon unterstützt Lisp die Imperative Sprache Operationen der Zuordnungserklärung und Goto -Schleifen.[13] Ebenfalls, Lispeln ist nicht mit dem besorgt Datentyp der Elemente zur Kompilierung. Stattdessen weist es die Datentypen zur Laufzeit zu. Dies kann dazu führen, dass Programmierfehler nicht früh im Entwicklungsprozess erkannt werden.

Das Schreiben großer, zuverlässiger und lesbarer LiSP -Programme erfordert Voraussicht. Wenn das Programm ordnungsgemäß geplant ist, kann es viel kürzer sein als ein Äquivalent Imperative Sprache Programm.[12] Lispeln wird weit verbreitet in künstliche Intelligenz. Die Nutzung wurde jedoch nur akzeptiert, weil es hat Imperative Sprache Operationen, unbeabsichtigte Nebenwirkungen ermöglichen.[14]

Ml

Ml (1973)[15] steht für "Meta -Sprache". ML -Überprüfungen, um sicherzustellen, dass nur Daten desselben Typs miteinander verglichen werden.[16] Diese Funktion hat beispielsweise einen Eingabeparameter (eine Ganzzahl) und gibt eine Ganzzahl zurück:

Spaß times_10(n : int) : int = 10 * n; 

Ml ist nicht auf Klammernsektion wie Lispeln. Das Folgende ist eine Anwendung von times_10 ():

times_10 2

Es gibt "20: int" zurück. (Sowohl die Ergebnisse als auch der Datentyp werden zurückgegeben.)

Wie Lispeln, Ml ist auf Prozesslisten zugeschnitten. nicht wie LispelnJedes Element ist der gleiche Datentyp.[17]

Prolog

Prolog (1972) steht für "Programmierung in Logik". Es wurde entwickelt, um zu verarbeiten natürliche Sprachen.[18] Die Bausteine ​​eines Prolog -Programms sind Objekte und ihre Beziehungen zu anderen Objekten. Objekte sind gebaut, indem sie wahr sagen Fakten über sie.[19]

Mengenlehre Fakten werden gebildet, indem Sätze Objekte zugewiesen werden. Die Syntax ist setName (Objekt).

  • Katze ist ein Tier.
Tier (Katze).
  • Maus ist ein Tier.
Tier (Maus).
  • Tom ist eine Katze.
Katze (Tom).
  • Jerry ist eine Maus.
Maus (Jerry).

Adjektiv Fakten werden verwendet Adjektiv (Objekt).

  • Katze ist groß.
große Katze).
  • Maus ist klein.
kleine Maus).

Beziehungen werden unter Verwendung mehrerer Elemente in den Klammern gebildet. In unserem Beispiel haben wir Verb (Objekt, Objekt) und Verb (Adjektiv, Adjektiv).

  • Maus isst Käse.
Essen (Maus, Käse).
  • Große Tiere essen kleine Tiere.
Essen (groß, klein).

Nachdem alle Fakten und Beziehungen eingegeben wurden, kann eine Frage gestellt werden:

Wird Tom Jerry essen?
?- essen (Tom, Jerry).

Die Verwendung von Prolog hat sich zu einer zielorientierten Sprache erweitert.[20] In einer zielorientierten Anwendung wird das Ziel durch Bereitstellung einer Liste von Unterläufen definiert. Anschließend wird jedes Subziel definiert, indem eine Liste seiner Unterläufe usw. weiter bereitgestellt wird. Wenn ein Pfad der Untergürte keine Lösung findet, ist diese Subziele dann eine Lösung zurückgezogen und ein anderer Weg wird systematisch versucht.[19] Zu den praktischen Anwendungen gehört die Lösung der kürzestes Pfadproblem[18] und produzieren Stammbäume.[21]

Siehe auch

Verweise

  1. ^ Lloyd, J. W.,, Praktische Vorteile der deklarativen Programmierung
  2. ^ "Deklarative Sprache". Ordner. 17. Mai 2004. Abgerufen 26. Januar 2020.
  3. ^ Sebesta, Robert (2016). Konzepte von Programmiersprachen. Boston: Pearson. ISBN 978-0-13-394302-3. OCLC 896687896.
  4. ^ "Feuchter 2009: Workshop zu deklarativen Aspekten der Multicore -Programmierung". Cse.unsw.edu.au. 20. Januar 2009. Abgerufen 15. August 2013.
  5. ^ Chakravarty, Manuel M. T. (14. Februar 1997). Über die massiv parallele Ausführung von deklarativen Programmen (Doktorarbeit). Technische Universität Berlin. Abgerufen 26. Februar 2015. In diesem Zusammenhang ist das Kriterium für die Aufruf einer Programmiersprache deklarativ die Existenz einer klaren, mathematisch etablierten Korrespondenz zwischen Sprache und mathematischer Logik, so dass eine deklarative Semantik für die Sprache auf dem Modell oder der Proof -Theorie (oder beides) basiert werden kann. der Logik.
  6. ^ "Überarbeitet7 Bericht über das algorithmische Sprachschema " (PDF). Schema Arbeitsgruppe 1. Abgerufen 2020-12-05.
  7. ^ [1] Archiviert 23. Oktober 2007 bei der Wayback -Maschine
  8. ^ "Deklarative Modellierung". Simulistik. Abgerufen 15. August 2013.
  9. ^ Jones, Robin; Maynard, Clive; Stewart, Ian (6. Dezember 2012). Die Kunst der Lisp -Programmierung. Springer Science & Business Media. p. 2. ISBN 9781447117193.
  10. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 220. ISBN 0-201-71012-9.
  11. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 221. ISBN 0-201-71012-9.
  12. ^ a b Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 230. ISBN 0-201-71012-9.
  13. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 229. ISBN 0-201-71012-9.
  14. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 241. ISBN 0-201-71012-9.
  15. ^ Gordon, Michael J. C. (1996). "Von LCF bis Hol: eine kurze Geschichte". Abgerufen 2021-10-30.
  16. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 233. ISBN 0-201-71012-9.
  17. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 235. ISBN 0-201-71012-9.
  18. ^ a b "Geburt von Prolog" (PDF). November 1992.
  19. ^ a b Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 246. ISBN 0-201-71012-9.
  20. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 245. ISBN 0-201-71012-9.
  21. ^ Wilson, Leslie B. (2001). Vergleichende Programmiersprachen, dritte Ausgabe. Addison-Wesley. p. 247. ISBN 0-201-71012-9.

Externe Links