<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Deklarative_Programmierung</id>
	<title>Deklarative Programmierung - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=Deklarative_Programmierung"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Deklarative_Programmierung&amp;action=history"/>
	<updated>2026-05-23T17:58:27Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=Deklarative_Programmierung&amp;diff=200206&amp;oldid=prev</id>
		<title>imported&gt;Prüm: /* Einzelnachweise */</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=Deklarative_Programmierung&amp;diff=200206&amp;oldid=prev"/>
		<updated>2024-04-15T04:20:31Z</updated>

		<summary type="html">&lt;p&gt;&lt;span class=&quot;autocomment&quot;&gt;Einzelnachweise&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Die &amp;#039;&amp;#039;&amp;#039;deklarative Programmierung&amp;#039;&amp;#039;&amp;#039; ist ein [[Programmierparadigma]], bei dem die Beschreibung des Problems im Vordergrund steht. Der Lösungsweg wird dann automatisch ermittelt. Im Gegensatz zur [[Imperative Programmierung|imperativen Programmierung]], bei der das &amp;#039;&amp;#039;Wie&amp;#039;&amp;#039; im Vordergrund steht, fragt man in der deklarativen Programmierung nach dem &amp;#039;&amp;#039;Was&amp;#039;&amp;#039;, das berechnet werden soll. Bekannte Vertreter deklarativer Programmiersprachen sind [[Haskell (Programmiersprache)|Haskell]], [[Lisp]], [[Prolog (Programmiersprache)|Prolog]], [[Extensible Application Markup Language|XAML]] und im weiteren Sinne auch [[SQL]] und [[XSL Transformation|XSLT]]. Den deklarativen Sprachen stehen die weiter verbreiteten imperativen Sprachen wie [[C (Programmiersprache)|C]], [[C++]] oder [[Java (Programmiersprache)|Java]] gegenüber.&lt;br /&gt;
&lt;br /&gt;
Die Unterschiede der beiden Herangehensweisen werden bei der [[Implementierung]] eines [[Algorithmus]] am deutlichsten, den man als Kombination von Arbeits- und Steuermechanismus betrachten kann:&lt;br /&gt;
* Deklarative Sprachen ermöglichen eine Trennung der beiden Bestandteile.&lt;br /&gt;
* Dagegen ist bei Verwendung einer imperativen Programmiersprache eine Trennung von Arbeits- und Steuermechanismus kaum möglich. Imperative Sprachen beschreiben Berechnungsabläufe; damit lassen sich imperative Programme als Anweisungen an die Maschine verstehen, auf der sie ablaufen.&lt;br /&gt;
&lt;br /&gt;
== Deklarative Sprachen ==&lt;br /&gt;
Zu den deklarativen Sprachen gehören:&lt;br /&gt;
* [[Abfragesprache]]n (z.&amp;amp;nbsp;B. [[SQL]])&lt;br /&gt;
* [[Datenflusssprache]]n (z.&amp;amp;nbsp;B. Val oder [[Linda (Programmiersprache)|Linda]])&lt;br /&gt;
* funktional-logische Sprachen (z.&amp;amp;nbsp;B. Babel, Escher, [[Curry (Programmiersprache)|Curry]], [[Oz (Programmiersprache)|Oz]])&lt;br /&gt;
* [[Funktionale Programmierung|funktionale Sprachen]] (z.&amp;amp;nbsp;B. [[ML (Programmiersprache)|ML]], [[Miranda (Programmiersprache)|Miranda]], [[Gofer]], [[Haskell (Programmiersprache)|Haskell]], [[Erlang (Programmiersprache)|Erlang]])&lt;br /&gt;
* [[Logische Programmierung|logische Sprachen]] (z.&amp;amp;nbsp;B. [[Prolog (Programmiersprache)|Prolog]])&lt;br /&gt;
* [[Synchrone Programmiersprache]]n (z.&amp;amp;nbsp;B. [[Lustre (Programmiersprache)|Lustre]])&lt;br /&gt;
* Aufbauwerkzeuge (z.&amp;amp;nbsp;B. [[make]] oder [[Apache Ant|Ant]])&lt;br /&gt;
* [[Transformationssprache]]n (z.&amp;amp;nbsp;B. [[XSL Transformation|XSLT]])&lt;br /&gt;
&lt;br /&gt;
== Beispiel ==&lt;br /&gt;
Der [[Quicksort]]-Sortierungsalgorithmus kann in der imperativen Programmiersprache [[Pascal (Programmiersprache)|Pascal]] folgendermaßen aufgeschrieben werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Pascal&amp;quot;&amp;gt;&lt;br /&gt;
procedure quicksort(l, r: Integer);&lt;br /&gt;
var&lt;br /&gt;
  x, i, j, tmp: Integer;&lt;br /&gt;
begin&lt;br /&gt;
  if r &amp;gt; l then&lt;br /&gt;
  begin&lt;br /&gt;
    x := a[l]; i := l; j := r + 1;&lt;br /&gt;
    repeat&lt;br /&gt;
      repeat&lt;br /&gt;
        i := i + 1;&lt;br /&gt;
      until a[i] &amp;gt;= x;&lt;br /&gt;
      repeat &lt;br /&gt;
        j := j - 1;&lt;br /&gt;
      until a[j] &amp;lt;= x;&lt;br /&gt;
&lt;br /&gt;
      // exchange a[j] and a[i]&lt;br /&gt;
      tmp := a[j]; a[j] := a[i]; a[i] := tmp;&lt;br /&gt;
    until j &amp;lt;= i;&lt;br /&gt;
&lt;br /&gt;
    // exchange a[j] and a[l]&lt;br /&gt;
    tmp := a[j]; a[j] := a[l]; a[l] := tmp;&lt;br /&gt;
    quicksort(l, j - 1);&lt;br /&gt;
    quicksort(j + 1, r);&lt;br /&gt;
  end&lt;br /&gt;
end;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Programmierer beschreibt, &amp;#039;&amp;#039;wie&amp;#039;&amp;#039; der Algorithmus ablaufen muss. Es wird der Lösungsweg vorgegeben, also welche einzelnen Schritte nacheinander ablaufen und wie Variablen zu verändern sind, um schließlich zum Ergebnis zu kommen.&lt;br /&gt;
&lt;br /&gt;
Ein ähnlicher Algorithmus kann in der deklarativen Programmiersprache [[Haskell (Programmiersprache)|Haskell]] folgendermaßen formuliert werden:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;Haskell&amp;quot;&amp;gt;&lt;br /&gt;
quicksort [] = []&lt;br /&gt;
quicksort (x:xs) = quicksort [n | n&amp;lt;-xs, n&amp;lt;x] ++ [x] ++ quicksort [n | n&amp;lt;-xs, n&amp;gt;=x]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Der Programmierer beschreibt, &amp;#039;&amp;#039;was&amp;#039;&amp;#039; das Programm mit einer Eingabe macht, also wie mit welcher Eingabe umzugehen ist, wobei der Berechnungsablauf nicht von Interesse ist. Die Berechnungen erfolgen dann durch Wertemanipulation. Hauptkontrollstruktur bildet die [[Rekursion]], aus Effizienzgründen besonders die [[Endrekursion]]. Es handelt sich hier aber nicht mehr um einen Quicksort-Algorithmus, da Quicksort ein [[in-Place]]-Verfahren ist, welches die bestehende Liste manipuliert und nicht wie der vorliegende Algorithmus eine neue Liste erzeugt.&lt;br /&gt;
&lt;br /&gt;
== Vorzüge ==&lt;br /&gt;
* Die Programme sind oft kürzer als vergleichbare imperative Programme.&lt;br /&gt;
* [[Beweis (Logik)|Beweise]] (z.&amp;amp;nbsp;B. [[Korrektheit (Informatik)|Korrektheitsbeweis]], Beweise über Programmeigenschaften) sind dank einfacherer mathematischer Basis (u.&amp;amp;nbsp;a. [[Lambda-Kalkül]]) leichter durchführbar, falls überhaupt möglich.&lt;br /&gt;
* Es gibt keine [[Wirkung (Informatik)|Nebenwirkungen]] aufgrund der [[Referentielle Transparenz|referentiellen Transparenz]]. Programme sind damit partiell auswertbar und ermöglichen so z.&amp;amp;nbsp;B. die Behandlung unendlicher Datenstrukturen.&amp;lt;ref&amp;gt;{{Internetquelle&lt;br /&gt;
| autor=Manuel M. T. Charkravarty&lt;br /&gt;
| hrsg=TU Berlin&lt;br /&gt;
| url=http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz&lt;br /&gt;
| format=.ps.gz 343KiB&lt;br /&gt;
| sprache=en&lt;br /&gt;
| titel=On the Massively Parallel Execution of Declarative Programs&lt;br /&gt;
| titelerg=Dissertation&lt;br /&gt;
| seiten=166&lt;br /&gt;
| datum=1997-02-14&lt;br /&gt;
| zugriff=2011-10-16&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Siehe auch ==&lt;br /&gt;
* [[Domain-driven Design]], ein Ansatz für den Entwurf des Domänenmodells, der ein deklaratives Design propagiert&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Programmierparadigma]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Prüm</name></author>
	</entry>
</feed>