Fonction informatique
En informatique, une fonction est une routine qui retourne une valeur.
En programmation impérative, une fonction comporte une séquence d'instructions réalisant un calcul ou une tâche. En programmation fonctionnelle, la fonction est l'artifice qui permet de découper le problème global en éléments plus simples. Le terme de routine est aussi utilisé pour les fonctions de bas niveau des systèmes d'exploitation.
La définition d'une fonction comporte des paramètres d'entrée. Au moment de l'exécution et afin d'éviter toute confusion, on les nomme arguments. Travaillant sur ces arguments, elle retourne généralement une valeur de sortie.
Quand une fonction possède des paramètres d'entrée, elle en prend dans les implémentations actuelles (2013) une copie, au lieu de travailler sur les véritables variables[1]. Les fonctions demandent cependant souvent l'adresse mémoire des variables plutôt que leurs valeurs[2]. Ce mécanisme utilise un pointeur (ou une référence, en C++, Perl ou PHP). Une fonction, contrairement à un sous-programme, ne renvoie jamais de valeur par modification de ses arguments[3]. Elle peut renvoyer soit un résultat[4], soit un code d'erreur, ou 0, ou une valeur nulle, si tout s'est bien terminé.
Anatomie d'une fonction
Une fonction possède :
- Un nom ;
- Des paramètres comportant chacun un nom et un type (explicite ou implicite) ;
- Un type de sa valeur de retour ;
- Un bloc de code qui est celui de la fonction ;
- L'affectation d'un résultat à une variable qui est sa valeur de retour.
Selon le langage considéré, tous ces éléments n'apparaissent pas forcément.
int max(int a, int b)
{
return a > b ? a : b;
}
…
printf("%d", max(123,456));
|
Cette fonction écrite en C a pour nom max , pour paramètres a et b qui sont de type int et retourne un int . Les accolades { et } délimitent le bloc d'instructions de la fonction. On remarque que le nom de la fonction décrit son résultat : elle retourne la valeur maximale entre a et b . Ce n'est pas une obligation du langage, mais constitue une bonne pratique de programmation : le nom de la fonction n'a d'importance que mnémotechnique : son comportement ne dépend que des instructions délimitées dans le bloc (donc ici entre accolades). Dans certains langages, le nom de la fonction a un sens : en C++, les constructeurs doivent porter le nom de la classe correspondante.
Plus bas, on voit comment la fonction peut être utilisée (on parle « d'appel de fonction ») : |
Caractéristiques des fonctions
- Une fonction sans effets secondaires (parfois improprement nommés « effets de bord »), et qui renvoie systématiquement la même valeur de retour pour les mêmes paramètres, est une fonction pure. C'est une fonction au sens mathématique du terme. Exemple de fonctions non pures : appel de la date, ou de l'heure, ou d'un nombre aléatoire[5].
- Une fonction s'appelant elle-même se nomme fonction récursive. Deux exemples sont la fonction factorielle (où la récursivité est seulement didactique, le programme n'en ayant pas vraiment besoin), et le tri récursif, genre quicksort. FORTRAN IV n'autorisait pas la récursivité. PL/I la permettait, mais exigeait dans ses premières versions qu'on déclare la fonction comme telle.
- Une fonction qui ne renvoie aucun résultat se nomme procédure (ou sous-programme).
- Pascal exige d'effectuer la distinction.
- C ne l'exige pas, sauf dans sa version ANSI.
- En Algol W, tout sous-programme renvoie une valeur, qu'on peut utiliser ou non.
- PL/I ne considère un sous-programme que comme une fonction dont le résultat n'est pas mémorisé. Une fonction pouvant ne pas y avoir de paramètres, il est commode en cours de développement d'utiliser une variable (par exemple TIME) là où on utilisera ensuite une fonction TIME sans avoir à modifier en quoi que ce soit le code source.
- La programmation orientée objet permet d'attacher des fonctions à des classes ; ces fonctions sont alors appelées fonctions membres ou méthodes.
- Une fonction qui n'a pas de nom se nomme fonction anonyme. Tous les langages ne permettent pas d'écrire des fonctions anonymes. Exemple de fonction anonyme en haskell qui renvoie le nombre passé en argument multiplié par 2 :
(\x → 2*x)
.
- Une fonction définie à l'intérieur d'une autre fonction est une fonction imbriquée. Exemple en python :
def pourcentages(a,b,c):
def pc(x):
return (x*100.0)/(a+b+c)
return pc(a),pc(b),pc(c)
Le mérite des fonctions imbriquées est le contrôle très strict de leur visibilité (scope) par le reste du programme. Elles sont très utilisées en PL/I.
Comparaison avec les fonctions mathématiques
Une fonction en informatique se distingue principalement de la fonction mathématique du fait de l'interaction entre la fonction et son environnement.
En mathématiques, le résultat d'une fonction est unique lorsque la valeur de ses arguments est fixée ; en informatique, ce n'est pas le cas général : deux appels successifs à une fonction peuvent produire des résultats différents.
Le respect de cette propriété est appelée la transparence référentielle.
En outre, en plus de calculer un résultat, la fonction informatique peut agir sur son environnement (par exemple afficher un message) : on appelle cela un effet secondaire ou effet « de bord ».
Une fonction qui n'a pas d'effet de bord est appelée une fonction pure.
Programmation fonctionnelle
La programmation fonctionnelle considère le calcul en tant qu'évaluation de fonctions mathématiques et n'admet ni changement d'état ni modification des données. Elle décrit l'application des fonctions, contrairement au modèle de programmation impérative qui souligne les changements d'état.
Cette caractéristique rapproche les langages fonctionnels du modèle mathématique. Les types sont ainsi des ensembles d'arrivée et de départ. Une fonction est alors une application d'un type vers un autre. Une fonction Haskell peut très bien désigner un ensemble infini (par exemple : « l'ensemble des nombres pairs »), car c'est la relation de définition qui est stockée et non des valeurs.
Bibliothèque logicielle
Une bibliothèque logicielle est une collection de fonctions.
Notes et références
- ↑ Ce qui n'était pas toujours vrai dans les années 60, par exemple en FORTRAN IV.
- ↑ Une exception notable — et catastrophique en efficacité — étant le passage de structures par valeurs en C.
- ↑ En FORTRAN, cela est même interdit par les spécifications du langage et détecté par les compilateurs.
- ↑ Ce résultat pouvant être de grande taille, comme une chaîne de caractères en PL/I ou une structure en C.
- ↑ En Linux, par ce qui y est nommé une « réserve d'entropie », où sont enregistrés des événements non reproductibles à l'identique entre deux appels.
Voir aussi
- Fonction (mathématiques)
- Méthode (informatique)
- Module (programmation)
- Programmation fonctionnelle
- Portail de la programmation informatique