Station - Beschreiben statt Befehlen
Ein Dialog über imperative und deklarative Programmierung
Hallo! Ich vertrete hier die imperative Programmierung.
Hallo, und ich vertrete die funktionale Programmierung.
Neulich hast du behauptet, dass man Programme ohne Variablen und Zuweisungen schreiben kann
und dass man keine Schleifen benötigt.
Das stimmt - zumindest so ungefähr!
Ich kann mir das immer noch nicht so recht vorstellen. Wie soll das z.B. bei einem ganz
einfachen Algorithmus wie dem folgenden funktionieren?
ALGORITHMUS Summenberechnung:
{vorher: n ∈ N}
setze s auf 0
setze i auf 0
SOLANGE i <= n:
erhöhe s um i
erhöhe i um 1
{nachher: s = 0+1+2+...+n}
Umdenken ist die Devise! Der Algorithmus benutzt Befehle, um die Daten zu verarbeiten. Die Daten werden
dabei mit Hilfe von Variablen verwaltet. Ich mache das ganz anders. Ich konzipiere eine Funktion, die
das Gewünschte leistet, und definiere sie mit Hilfe von Regeln.
FUNKTION summe: {Fall 1:} n == 0: summe(n) -> 0 {Fall 2:} n > 0: summe(n) -> n+summe(n-1)
Sehe ich das richtig, dass da auch Variablen vorkommen?
Ja, aber nur als Parameter, um Daten an die Funktion zu übergeben. Der entscheidende Unterschied ist,
dass sie ihre Werte nicht verändern.
Das ist ja alles schön und gut. Aber, wozu soll das Ganze gut sein? Ich komme mit meiner Methode
doch auch zum Ziel.
Stimmt, wir kommen beide zum Ziel, aber mit ganz unterschiedlichen Methoden.
Du benutzt Algorithmen, die letztlich aus Anweisungen bzw. Befehlen bestehen. Diese Befehle richten sich
an eine tatsächliche oder gedachte Maschine. Bei der Entwicklung von Algorithmen musst du also denken
wie eine Maschine.
Das habe ich zwar noch nie so empfunden, aber eigentlich hast du recht.
Und wie denkst du?
Ich entwickle Beschreibungen anstatt Befehle zu erteilen.
Ich beschreibe das gewünschte Berechnungsverhalten mit einer Funktion, die den Ausgangsdaten die
Zieldaten zuordnet. Anschließend lege ich mit Hilfe von Regeln die Zuordnung präzise fest.
Das erinnert mich irgendwie an Funktionsdefinitionen in der Mathematik.
Ja, da macht man das ganz genauso.
Und warum sollen wir beim Programmieren vorgehen wie Mathematiker? Hat das irgendwelche Vorteile?
Beim Programmieren macht man leicht Fehler. Gib zu, dass du auch schon mal die Anweisung "erhöhe i um 1"
vergessen hast. Wenn man funktional programmiert, kann man sich leichter von der Korrektheit der
Programme überzeugen. Ich mache mir die Korrektheit von Regeln immer anhand typischer Beispiele klar:
Ok, das sehe ich ein!
Aber, wenn ich mich so umschaue, stelle ich fest, dass fast alle imperativ programmieren wie ich.
So richtig durchgesetzt hast du dich noch nicht, oder?
Viele kennen mich halt nicht - das ist irgendwie schade.
Die, die mich kennen, benutzen meinen deklarativen Ansatz beim Entwickeln von Prototypen.
Es geht hier darum, schnell ein System zu entwickeln, das korrekt arbeitet bzw. das gewünschte Verhalten zeigt.
Es kommt nicht darauf an, das Laufzeitverhalten zu optimieren oder Benutzerfreundlichkeit
zu gewährleisten.
Kannst du das an einem Beispiel klarmachen?
Gerne, aber erst im nächsten Abschnitt.
Imperative und deklarative Programmierung
Imperative Programmierung besteht darin, eine (mehr oder weniger abstrakte) Maschine mit Hilfe von Anweisungen zu steuern.
Dabei wird beschrieben, wie die Ergebnisse berechnet werden sollen. Zentrale Bausteine imperativer Programme sind Wertzuweisungen, die i.a. den momentanen Variablenzustand (Speicherzustand) verändern. Imperative Programmierung ist wegen der Möglichkeit, Seiteneffekte zu produzieren, recht fehleranfällig.
Deklarative Programmierung besteht darin, den Problemkontext (die Miniwelt) mit gegebenen Mitteln zu beschreiben. Funktionale Programmierung - als eine Form der deklarativen Programmierung - benutzt hierzu Funktionen.
Bei der deklarativen Programmierung wird somit beschrieben, was in der Modellwelt gelten soll.
Die funktionale Programmierung arbeitet dabei ohne Speichervariablen. Variablen kommen hier nur als Funktionsvariablen zur Übergabe von Funktionsargumenten vor. Seiteneffekte sind demnach in der funktionalen Programmierung nicht möglich. Das Verhalten einer Funktion wird vollständig durch die Funktionsdeklarationen festgelegt.
Funktionale Programmierung erfolgt auf einem höheren Abstraktionsniveau: Es ergeben sich dadurch Programme, die kürzer, leichter zu durchschauen und weniger fehleranfälliger sind.
Funktionale Programmierung eignet sich zum „Prototyping“.