Funktion (Programmierung)
Eine Funktion ist in der Informatik die Bezeichnung eines Programmierkonzeptes. Die genaue Bedeutung hängt von der Art der verwendeten Programmiersprache ab:
- Imperative Programmiersprachen: Hier bezeichnet eine Funktion ein Unterprogramm.
- Funktionale Programmiersprachen: Hier ist eine Funktion, ähnlich wie in der Mathematik, eine Abbildungsvorschrift.
Funktionen in der imperativen Programmierung
In der imperativen Programmierung sind Funktionen ein wichtiges Mittel zur Modularisierung. Oft benötigter Code kann in Funktionen zusammengefasst werden und über den Namen der Funktion nach Bedarf aufgerufen werden. In der Regel erzeugt der Compiler für jeden Funktionsaufruf einen neuen Bereich auf dem Stack. Dort werden die Parameter, die lokalen Variablen der Funktion sowie der Rückgabewert abgelegt.
Funktionen können einen oder mehrere Aufrufparameter haben und liefern nach ihrem Ende einen Funktionswert zurück. Funktionen werden typischerweise in Bibliotheken thematisch gebündelt. Neben Standardfunktionen, mit denen man zum Beispiel an die Schnittstellen des Betriebssystems ankoppeln kann, gibt es auch eigenständige Funktionen, die lediglich Daten verarbeiten und wiederkehrende Aufgaben, wie das Suchen einer Zeichenkette in einem Text, übernehmen.
Je nach Programmiersprache werden für Funktionen unterschiedliche Bezeichnungen verwendet. So werden Funktionen in Java als Methoden bezeichnet, um ihre Zugehörigkeit zu einem Objekt (siehe Objektorientierte Programmierung) zu betonen. Andere Bezeichnungen sind sub (von Subroutine) in Perl oder allgemein Routine. In einigen Programmiersprachen unterscheidet man zwischen Funktionen, die einen Wert als Ergebnis einer Berechnung zurückliefern, und Routinen, die nur Code ausführen. Letztere werden auch als Prozeduren bezeichnet.
Funktionen können, je nach Art der Parameterübergabe, auch Parameterwerte verändern, z. B. wenn inc(x) das Argument um eins erhöht (Inkrement). Funktionen, deren Aufruf ihre Argumente und ihre Umgebung niemals verändern, heißen nebeneffektfreie Funktionen.
Beispiele
C
In C spricht man generell von Funktionen; Prozeduren sind Funktionen mit dem Rückgabetyp „void“.
Argumente werden prinzipiell immer als Wert übergeben (by value); soll eine übergebene Variable verändert werden, übergibt man ihre Adresse, also einen Pointer.
Alle Funktionen in C sind global; sie sind also nicht schachtelbar.
Beispiel einer Funktionsvereinbarung in C:
int Summe(int a, int b)
{
return a + b;
}
Beispiel eines Funktionsaufrufs in C:
ergebnis = Summe(1, 2);
Pascal
Pascal unterscheidet strikt zwischen Funktionen und Prozeduren:
- Funktionen werden mit dem Schlüsselwort „FUNCTION“ deklariert und haben einen festgelegten Rückgabetyp; sie werden durch ihre Verwendung in Ausdrücken aufgerufen, also z. B. in einer Zuweisung. Im Code der Funktion ist eine Zuweisung an den Funktionsnamen erforderlich.
- Prozeduren werden mit dem Schlüsselwort „PROCEDURE“ deklariert und haben keinen Rückgabewert.
Beispiel einer Funktionsvereinbarung in Pascal:
function Summe(a: Integer; b: Integer): Integer;
begin
Summe := a + b;
end;
Beispiel eines Funktionsaufrufs in Pascal:
ergebnis := Summe(1, 2);
Funktionen und Prozeduren sind in Pascal (im Gegensatz zu C) schachtelbar.
Argumente werden normalerweise als Wert übergeben (by value); der Wert einer Variablen, die einer Funktion (oder Prozedur) als Argument übergeben wird, wird durch deren Ausführung nicht verändert (es sei denn, es erfolgt eine explizite Zuweisung außerhalb der Funktion). Es ist aber auch möglich, mit dem Schlüsselwort „VAR“ die Übergabe als Referenz (by reference) festzulegen, so z. B. bei der Prozedur INC („increase“):
procedure inc(var i: integer);
begin
i := i + 1
end;
Dadurch wird nicht der Wert der Variablen i übergeben, sondern die Variable i an sich, sodass diese nach Aufruf der Prozedur tatsächlich einen um 1 erhöhten Wert hat.
QuickBasic/PowerBASIC
Beispiel einer Funktionsvereinbarung in PowerBASIC:
Function Summe(a AS Integer, b AS Integer) AS Integer
Summe = a + b
End Function
Alternativ lässt PowerBASIC für genau die selbe Funktion eine knappere Schreibweise zu:
Function Summe%(a%, b%)
Summe% = a% + b%
End Function
Oder gar noch einfacher:
DefInt i, j 'alle mit i od. j beginnende Variablen sind Integer
Function Summe%(i, j)
Function = i + j
End Function
Beispiel eines Funktionsaufrufs in PowerBASIC:
ergebnis = Summe(1, 2)
Python
In Python gibt es keinen Unterschied zwischen Funktionen und Prozeduren: Jede Prozedur hat einen Rückgabewert; wenn sie nicht explizit (mit „return“) einen Wert zurückgibt, ist dieser None. Dementsprechend kann jede Funktion aufgerufen werden, auch ohne ihren Rückgabewert zu verwenden. Jedoch erlangt in Python die Bezeichnung Methode eine Bedeutung, indem sie für Funktionen von Objekten verwendet wird.
REXX
In REXX wird eine Prozedur dadurch zur Funktion, dass sie einen Wert zurückgibt. Da es sich bei der Deklaration prinzipiell nur um eine Sprungmarke handelt, muss darauf geachtet werden, dass jede Prozedur oder auch Funktion die Anweisung RETURN ausführt; ansonsten könnte die Ausführung unbeabsichtigt in der nächsten Funktion fortgesetzt werden.
Prozeduren werden mit dem Schlüsselwort CALL ausgeführt; gibt die Prozedur einen Wert zurück (ist sie also eine Funktion), so wird dieser in der speziellen Variablen RESULT gespeichert. Etwaige Argumente stehen dabei nicht in Klammern.
Normalerweise werden Funktionen hingegen durch ihre Verwendung in einem Ausdruck aufgerufen; dabei muss unmittelbar nach dem Namen der Funktion die geöffnete Klammer der Argumentliste notiert werden. Gibt die Funktion keinen Wert zurück, tritt zur Laufzeit ein Syntaxfehler auf.
Funktionen in der funktionalen Programmierung
In der funktionalen Programmierung stellen Funktionen Abbildungsvorschriften dar. Eine Funktion besteht dann aus einer Reihe von Definitionen, die diese Vorschrift beschreiben. Im Gegensatz zur imperativen Programmierung sind Funktionen also keine zusammengefassten Codeblöcke. Viel mehr entspricht die Funktion hier eher der mathematischen Definition einer Funktion.
Beispiele
In Haskell würde man z. B. schreiben
Summe :: Int -> Int -> Int Summe a b = a + b
Eine weitere Funktion wäre
max :: Int -> Int -> Int max a b | a > b = a | otherwise = b
Diese Schreibweise erinnert an die mathematische Definition des Maximums zweier Zahlen.
Ein funktionales Programm besteht ausschließlich aus Funktionsdefinitionen und besitzt keine Kontrollstrukturen wie Schleifen. Wichtigstes Hilfsmittel für die funktionale Programmierung ist daher die Rekursion.
Funktionen sind in funktionalen Programmiersprachen Objekte, mit denen wie mit Variablen gearbeitet werden kann. Insbesondere können Funktionen also als Argument oder Rückgabewert einer anderen Funktion auftreten. Man spricht dann von Funktionen höherer Ordnung.