Station - Beschreiben statt Befehlen

Ein Dialog über imperative und deklarative Programmierung

imperativ
Hallo! Ich vertrete hier die imperative Programmierung.

funktional
Hallo, und ich vertrete die funktionale Programmierung.

imperativ
Neulich hast du behauptet, dass man Programme ohne Variablen und Zuweisungen schreiben kann und dass man keine Schleifen benötigt.

funktional
Das stimmt - zumindest so ungefähr!

imperativ
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}

funktional
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)

imperativ
Sehe ich das richtig, dass da auch Variablen vorkommen?

funktional
Ja, aber nur als Parameter, um Daten an die Funktion zu übergeben. Der entscheidende Unterschied ist, dass sie ihre Werte nicht verändern.

imperativ
Das ist ja alles schön und gut. Aber, wozu soll das Ganze gut sein? Ich komme mit meiner Methode doch auch zum Ziel.

funktional
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.

imperativ
Das habe ich zwar noch nie so empfunden, aber eigentlich hast du recht. Und wie denkst du?

funktional
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.

imperativ
Das erinnert mich irgendwie an Funktionsdefinitionen in der Mathematik.

funktional
Ja, da macht man das ganz genauso.

imperativ
Und warum sollen wir beim Programmieren vorgehen wie Mathematiker? Hat das irgendwelche Vorteile?

funktional
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:

Korrektheit

imperativ
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?

funktional
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.

imperativ
Kannst du das an einem Beispiel klarmachen?

funktional
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“.

X

Fehler melden

X

Suche