Zum Inhalt springen

Deklarative Programmierung

aus Wikipedia, der freien Enzyklopädie

Die deklarative Programmierung ist ein Programmierparadigma, bei dem die Beschreibung des Problems im Vordergrund steht. Der Lösungsweg wird dann automatisch ermittelt. Im Gegensatz zur imperativen Programmierung, bei der das Wie im Vordergrund steht, fragt man in der deklarativen Programmierung nach dem Was, das berechnet werden soll. Bekannte Vertreter deklarativer Programmiersprachen sind Haskell, Lisp, Prolog, XAML und im weiteren Sinne auch SQL und XSLT. Den deklarativen Sprachen stehen die weiter verbreiteten imperativen Sprachen wie C, C++ oder Java gegenüber.

Die Unterschiede der beiden Herangehensweisen werden bei der Implementierung eines Algorithmus am deutlichsten, den man als Kombination von Arbeits- und Steuermechanismus betrachten kann:

  • Deklarative Sprachen ermöglichen eine Trennung der beiden Bestandteile.
  • 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.

Deklarative Sprachen

Zu den deklarativen Sprachen gehören:

Beispiel

Der Quicksort-Sortierungsalgorithmus kann in der imperativen Programmiersprache Pascal folgendermaßen aufgeschrieben werden:

<syntaxhighlight lang="Pascal"> procedure quicksort(l, r: Integer); var

 x, i, j, tmp: Integer;

begin

 if r > l then
 begin
   x := a[l]; i := l; j := r + 1;
   repeat
     repeat
       i := i + 1;
     until a[i] >= x;
     repeat 
       j := j - 1;
     until a[j] <= x;
     // exchange a[j] and a[i]
     tmp := a[j]; a[j] := a[i]; a[i] := tmp;
   until j <= i;
   // exchange a[j] and a[l]
   tmp := a[j]; a[j] := a[l]; a[l] := tmp;
   quicksort(l, j - 1);
   quicksort(j + 1, r);
 end

end; </syntaxhighlight>

Der Programmierer beschreibt, wie 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.

Ein ähnlicher Algorithmus kann in der deklarativen Programmiersprache Haskell folgendermaßen formuliert werden:

<syntaxhighlight lang="Haskell"> quicksort [] = [] quicksort (x:xs) = quicksort [n | n<-xs, n<x] ++ [x] ++ quicksort [n | n<-xs, n>=x] </syntaxhighlight>

Der Programmierer beschreibt, was 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.

Vorzüge

          | )
          | {{#if:{{#ifeq:en|de||{{#if:en|1}}}}| ; 
              | )}}}}}}{{#if:Dissertation| Dissertation{{#invoke:Vorlage:Internetquelle|Endpunkt|titel=Dissertation}}}}}}}}{{#if:http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz}}%7C%7C}}}}{{#if:On the Massively Parallel Execution of Declarative Programs|{{#if:{{#invoke:WLink|isValidLinktext|1=On the Massively Parallel Execution of Declarative Programs|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: TU Berlin| TU Berlin{{#if: 1997-02-14166|,|{{#if: 2011-10-16 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: 1997-02-14| {{#if:{{#invoke:DateTime|format|1997-02-14|noerror=1}}
            |{{#invoke:DateTime|format|1997-02-14|T._Monat JJJJ}}
            |{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=1997-02-14|class=Zitationswartung}} }}{{#if: 166|,|{{#if: 2011-10-16 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: 166| S. 166{{#if: |,|{{#if: 2011-10-16 | {{#if:{{#invoke:TemplUtl|faculty|}}|;|,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:1661997-02-14TU Berlin|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:200206||(?)}}}}}}{{#if: 2011-10-16|;}}}}{{#if: 2011-10-16| {{#if:1661997-02-14TU Berlin{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2011-10-16 |ISO|noerror=1}} }}
       |4=im Jahr
       |7=im
       |10=am
       |#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2011-10-16|class=Zitationswartung}} }} {{#invoke:DateTime|format|2011-10-16|T._Monat JJJJ}}
    | {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:en|de||{{#if:en|1}}}}|{{#if:DissertationTU Berlin1997-02-14166{{#if: 2011-10-16 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
       |  (
       | {{#if:.ps.gz 343KiB | |  (}}
       }}{{#ifeq:{{#if:en|en|de}}|de||
          {{#invoke:Multilingual|format|en|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:en|en|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 1997-02-14166{{#if: 2011-10-16 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}en|{{#if: |: {{
 #if: 
 | {{
     #ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | Vorlage:Str trim
     | {{#invoke:Vorlage:lang|flat}}
     }}
 | {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
     | „Vorlage:Str trim“
     | {{#invoke:Text|quote
         |1={{#if: 
              | {{#invoke:Vorlage:lang|flat}}
              | {{#invoke:Vorlage:lang|flat}} }}
         |2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
         |3=1}} }}

}}{{#if:

   |  (<templatestyles src="Person/styles.css" />{{#if:  | :  }}{{#if:  | , deutsch: „“ }})
   | {{#if: 
       |  ({{#if:  | , deutsch: „“ }})
       | {{#if:  |  (deutsch: „“) }}
 }}

}}{{#if: {{{zitat}}}

   | {{#if: 
       | {{#if: {{{zitat}}}
           | Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
   | Vorlage:": Text= fehlt }}{{#if:  | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
             | Vorlage:": Ungültiger Wert: ref=
             | {{{ref}}} }}

}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:

   |0|=Vorlage:Toter Link/Core{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
       | {{#if:  | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
      | {{#if:{{#invoke:URLutil|isWebURL|http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
       | {{#if:{{#invoke:URLutil|isWebURL|http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: deadurl
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz }}|{{#switch: 
   |0|=Vorlage:Toter Link/Core{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
       | {{#if:  | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: 
           | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}
       |   (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.)
     }}{{#switch: 
         |no|0|=
         |#default={{#if:  ||  }}
    }}{{#invoke:TemplatePar|check
         |opt      = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
    }}{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
      | {{#if:{{#invoke:URLutil|isWebURL|http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz}}
          || {{#if:  ||  }} 
        }}
      | {{#if: 
           | {{#if:  ||  }}
           | {{#if:  ||  }}
        }}
    }}{{#if: 
       | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
         }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if:  | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. )  {{#if: 
            | {{#if:  | | Vorlage:Toter Link/archivebot }}
         }}Vorlage:Toter Link/Core{{#switch: 
          |no|0|=
          |#default= {{#if:  ||  }}
        }}{{#invoke:TemplatePar|check
         |all      = inline= url=
         |opt      = datum= date= archivebot= bot= botlauf= fix-attempted= checked=
         |cat      = Wikipedia:Vorlagenfehler/Vorlage:Toter Link
         |errNS    = 0
         |template = Vorlage:Toter Link
         |format   = 
         |preview  = 1
       }}{{#if: http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz
       | {{#if:{{#invoke:URLutil|isWebURL|http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz}}
          || {{#if:  ||  }} 
        }}
    }}{{#if: 
         | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}}
             || {{#if:  ||  }} 
           }}
    }}{{#switch: 
         |checked|deadurl|= 
         |#default=  {{#if:  ||  }}
    }}[http://www.cse.unsw.edu.au/~chak/papers/diss.ps.gz }} }}}}}}}}}}{{#if:|
        {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}

}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>

Siehe auch

  • Domain-driven Design, ein Ansatz für den Entwurf des Domänenmodells, der ein deklaratives Design propagiert

Einzelnachweise

<references />