EineFunktion (englischfunction) ist in derInformatik und in verschiedenenhöheren Programmiersprachen die Bezeichnung eines Programmkonstrukts, mit dem derProgramm-Quellcodestrukturiert werden kann, sodass Teile derFunktionalität desProgrammswiederverwendbar sind. Das besondere Merkmal einer Funktion (im Vergleich zum ähnlichen Konstrukt derProzedur) ist, dass die Funktion ein Resultat direkt zurückgibt und deshalb inAusdrücken verwendet werden kann. Die genaue Bezeichnung und Details ihrer Ausprägung sind in verschiedenenProgrammiersprachen unterschiedlich.
Funktionen gelten als spezielle Varianten vonUnterprogrammen.
Nicht zu verwechseln ist das Programmkonstrukt ‚Funktion‘ mit anderen Bedeutungen des Ausdrucks ‚Funktion‘, beispielsweise mit Funktionen im Sinn derOrganisation oder derSystemtheorie oder mitFunktion im Sinne von Aufgabe.
Das Konzept einerFunktion im Sinne der Mathematik ist in derfunktionalen Programmierung am deutlichsten umgesetzt. Hier stellen Funktionen Abbildungsvorschriften dar. Eine Funktion besteht dann aus einer Reihe von Definitionen, die diese Vorschrift beschreiben.
InHaskell würde man zum Beispiel schreiben:
max::Int->Int->Intmaxab|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 dieRekursion.
Funktionen sind in funktionalen Programmiersprachen Objekte, mit denen wie mit Variablen gearbeitet werden kann. Insbesondere können Funktionen also alsArgument oder Rückgabewert einer anderen Funktion auftreten. Man spricht dann vonFunktionen höherer Ordnung. Ein Beispiel hierfür ist dasmap
-Funktional:
map::(a->b)->[a]->[b]mapf[]=[]mapf(x:xs)=fx:mapfxs
map
nimmt als Argument eine Funktion vona
nachb
, wobeia
undb
beliebige Typen sind (Typvariablen) und liefert als Ergebnis eine neue Funktion, die Listen vona
in Listen vonb
abbildet, indem nämlichf
auf jedes Element der Liste angewendet wird.
Zwar dienen auch in der imperativen Programmierung Funktionen im Prinzip dazu, aufgrund einer Reihe vonArgumenten einResultat zu berechnen, aber durch die Verwendung vonglobalen Variablen kann eine Funktion mehr Argumente empfangen, als aus ihrer Argumentliste ersichtlich ist, und kann auf diesem Weg auch mehr als ein Resultat abliefern. Änderungen in den globalen Variablen einer Funktion werden häufig alsNebeneffekt bezeichnet. Damit gerät das Konzept der Funktion in die Nähe derProzedur, bei der solche „Nebenwirkungen“ in Wirklichkeit die beabsichtigten Hauptwirkungen sind (siehe dazuWirkung in der Informatik). Das führt dazu, dass Programmiersprachen oft eine irreführende Terminologie verwenden: InC wird beispielsweise generell nur von Funktionen gesprochen; Prozeduren sind dort Funktionen mit dem Rückgabetypvoid
; inModula-2 dagegen werden auch Funktionen mit dem Schlüsselwortprocedure
definiert.
Im Gegensatz zu Prozeduren geben Funktionen einen Wert zurück, der direkt verwendet werden kann. Prozeduren, die keinen Rückgabewert haben, können nur indirekt Ergebnisse liefern, indem entwederReferenzparameter oder globale Variablen verändert werden.
Die ProgrammiersprachePascal bietet eine explizite Unterscheidung für Funktionen und Prozeduren. Eine Funktionincrement
, welche eine Zahl um eins erhöht, kann folgendermaßen definiert werden:
functionincrement(variable:Integer):Integer;beginincrement:=variable+1;end;
Bei einer Prozedur kann das Berechnungsergebnis nur indirekt zurückgegeben werden wie beispielsweise über Referenzparameter.
procedureincrement(variable:Integer,varreference:Integer);beginreference:=variable+1;end;
Während das Ergebnis bei einem Funktionsaufruf direkt genutzt werden kann, muss das Ergebnis bei einer Prozedur zuerst in einer Variablen gespeichert werden, da die Variable als Parameter übergeben wird.
programmain;varvariable:Integer;begin// Aufruf einer Funktionwriteln(increment(3));// Aufruf einer Prozedurincrement(3,variable);writeln(variable);end;
Pascal unterscheidet zwischen Funktionen und Prozeduren:
function
deklariert und liefern einen Rückgabewert mit einem definierten Typ. Funktionsaufrufe stehen innerhalb von Ausdrücken. Die Festlegung des Rückgabewerts erfolgt durch eine (Pseudo-)Zuweisung an den Funktionsnamen. Als Nebenwirkung können Funktionen aber den Zustand des Programms verändern, indem nämlich globale Variablen neue Werte erhalten.procedure
deklariert und haben keinen definierten Rückgabewert. Ihre Wirkung kann sich deshalb nur in den Änderungen globaler Variablen zeigen.Beispiel einer Funktionsvereinbarung in Pascal:
functionsumme(a:Integer;b:Integer):Integer;beginsumme:=a+b;end;
Beispiel eines Funktionsaufrufs in Pascal:
ergebnis:=summe(1,2);
Funktionen und Prozeduren sind in Pascal im Gegensatz zu C schachtelbar. Dies bedeutet, dass sie weitere Funktionen und Prozeduren enthalten können.
Argumente werden normalerweise alsWertparameter übergeben(call / pass by value). Der Wert einer Variablen, die einer Funktion (oder Prozedur) als Argument übergeben wird, wird durch deren Ausführung nicht verändert. Es ist aber auch möglich, mit dem Schlüsselwortvar
die Übergabe alsReferenz (call by reference) festzulegen. Dadurch wird nicht der Wert einer Variablen übergeben, sondern ihre Adresse.
Argumente werden prinzipiell immer alsWertparameter übergeben(call / pass by value). Soll eine übergebene Variable verändert werden, so übergibt man deren Adresse, also einenPointer. Die Bestimmung des Rückgabewertes geschieht durch einereturn
Anweisung. Funktionen in C sind nicht schachtelbar. Allerdings liefern einige C-Compiler nicht standardisierte Erweiterungen aus, welche eine Schachtelung ermöglichen.
Beispiel einer Funktionsvereinbarung inC:
intsumme(inta,intb){returna+b;}
Beispiel eines Funktionsaufrufs in C:
ergebnis=summe(1,2);
In der Automatisierungstechnik werden bei derSPS-ProgrammierungFunktionen (FCs) sowieFunktionsbausteine (FBs) alsbibliotheksfähige Bausteine verwandt.