fit 2002 > Programmmiersprachentypen > Konzepte und Techniken > Funktionale Sprachen

Überblick


Applikative Sprachen kommen i.a. mit einer einfachen Semantik aus, da die wesentlichen Konstrukte nur Funktionsdefinition und Funktionsanwendung (auch Applikation, daher der Name applikative Programmierung) sind.

Programme in (rein) funktionalen Programmiersprachen verursachen wegen des Fehlens traditioneller Variablen keine Seiteneffekte und sind referenziell transparent; die Funktionswerte werden also allein durch die übergebenen Parameter bestimmt. Dadurch sind funktionale Programme im Gegensatz zu den bisher beschriebenen Paradigmen einfacher wart- und verifizierbar.

Die Darstellung von Programmen mittels Funktionen impliziert keine streng sequentielle Ausführungsreihenfolge, wie dies bei imperativen Programmen der Fall ist. Deshalb können funktionale Programme wesentlich leichter (und ohne daß der Programmierer selbst Hand anlegen muß) parallelisiert werden.

Funktionale Sprachen eignen sich besonders im Bereich der künstlichen Intelligenz, für mathematische Beweissysteme und Logikanwendungen.

Zu den Nachteilen der funktionalen Programmierung gehört wiederum die ineffizientere Ausführung auf heutigen Rechnern. Ursache ist zum einen die intensive Verwendung der Rekursion und die damit verbundenen Funktionsaufrufe bis in tiefe Verschachtelungsebenen hinab und zum anderen die häufige dynamische Anforderung und Freigabe von Speicher; dies macht eine aufwendigere dynamische Speicherverwaltung nötig. Dieser Nachteil könnte aber durch die Entwicklung neuer Rechnerarchitekturen umgangen werden.

Ein anderes Problem sind Aufgabenstellungen, die sich nicht direkt auf Funktionen abbilden lassen, wie z.B. die Ein- und Ausgabe von Daten. Eine Funktion, die eine Benutzereingabe entgegennimmt und zurückliefert wäre ein krasser Verstoß gegen das Prinzip, daß Funktionswerte nur von den Parametern und nicht von anderen "äußeren" Einflüssen (hier: Benutzereingaben) abhängen dürfen

Zugrundeliegende Idee

Hier werden Programme und alle vorkommenden Prozeduren als Funktionen interpretiert, die abhängig von ihren aktuellen Parametern einen Rückgabewert berechnen. Die Programmausführung besteht dann aus ständigen wechselseitigen Aufrufen mehr oder weniger komplexer Funktionen. Die theoretische Grundlage der funktionalen (oder applikativen) Programmierung bildet der l-Kalkül, ein "mathematischer Formalismus zur Beschreibung von Funktionen durch Rechenvorschriften mit möglichst wenig Grundkonzeptionen" . Zu den funktionalen Sprachen zählen unter anderem LISP, ML oder Miranda.

Charakteristische Merkmale

Das wichtigste Merkmal funktionaler Programme sind Funktionen. Funktionen berechnen aus ihren Argumenten (und nur aus diesen) einen Rückgabewert, wobei sie sich eventuell anderer Funktionsaufrufe bedienen. Wichtig ist, daß die Ein- und Ausgaben von Funktionen selbst wieder Funktionen sein können. So entstehen Funktionen höherer Ordnung, wie z.B. die Verkettung (Komposition) oder Integral und Differential.

Ein weiteres zentrales Konzept ist die Rekursion, also der Aufruf einer Funktion durch sich selbst. Die Rekursion ist in funktionalen Sprachen die einzige Art, Wiederholungen auszudrücken; sie ersetzt somit die Iteration (for-, while-Schleifen) vollständig.

In der Reinform der applikativen Programmierung gibt es außerdem weder Variablen noch Zuweisungen (im imperativen Sinn). Damit kann es auch keine Zustände wie in der objektorientierten Programmierung geben, die ja eine Art von Gedächtnis voraussetzen würden.

Die Fakultätsfunktion, diesmal in ML (MetaLanguage), soll die Konzepte wieder verdeutlichen:
    > fun fakultaet n = if n=0 then 1
                               else n * fakultaet(n - 1);
n ist hierbei keine Variable im imperativen Sinn, sondern lediglich ein formaler Parameter.

Stärken und Schwächen

Applikative Sprachen kommen i.a. mit einer einfachen Semantik aus, da die wesentlichen Konstrukte nur Funktionsdefinition und Funktionsanwendung (auch Applikation, daher der Name applikative Programmierung) sind.

Programme in (rein) funktionalen Programmiersprachen verursachen wegen des Fehlens traditioneller Variablen keine Seiteneffekte und sind referenziell transparent; die Funktionswerte werden also allein durch die übergebenen Parameter bestimmt. Dadurch sind funktionale Programme im Gegensatz zu den bisher beschriebenen Paradigmen einfacher wart- und verifizierbar.

Die Darstellung von Programmen mittels Funktionen impliziert keine streng sequentielle Ausführungsreihenfolge, wie dies bei imperativen Programmen der Fall ist. Deshalb können funktionale Programme wesentlich leichter (und ohne daß der Programmierer selbst Hand anlegen muß) parallelisiert werden.

Funktionale Sprachen eignen sich besonders im Bereich der künstlichen Intelligenz, für mathematische Beweissysteme und Logikanwendungen.

Zu den Nachteilen der funktionalen Programmierung gehört wiederum die ineffizientere Ausführung auf heutigen Rechnern. Ursache ist zum einen die intensive Verwendung der Rekursion und die damit verbundenen Funktionsaufrufe bis in tiefe Verschachtelungsebenen hinab und zum anderen die häufige dynamische Anforderung und Freigabe von Speicher; dies macht eine aufwendigere dynamische Speicherverwaltung nötig. Dieser Nachteil könnte aber durch die Entwicklung neuer Rechnerarchitekturen umgangen werden.

Ein anderes Problem sind Aufgabenstellungen, die sich nicht direkt auf Funktionen abbilden lassen, wie z.B. die Ein- und Ausgabe von Daten. Eine Funktion, die eine Benutzereingabe entgegennimmt und zurückliefert wäre ein krasser Verstoß gegen das Prinzip, daß Funktionswerte nur von den Parametern und nicht von anderen "äußeren" Einflüssen (hier: Benutzereingaben) abhängen dürfen.

Weiterführende Informationen


>[introduction]
Introduction to Functional Programming
>[programming] Functional Programming

>Entstehungskontext | Konzepte und Techniken | Entwicklung und Auswirkungen | Praxis | Bewertung