CSI3525: Concepts des Langages de Programmation Notes # 11: Sous-Programmes ( Lire Chapitre 8 )
2 Introduction Au depart, les sous-programmes (procedures et fonctions) ont ete concus comme un mecanisme de re-utilisation de code. Maintenant, ils sont consideres comme un mecanisme fondamental dabstraction. Un sous-programme est un bloc nomme, ayant une porte locale et encapsulant un algorithme. Au niveau semantique, un sous-programme est une operation complexe qui peut etre initiee (appelee) comme une operation elementaire. On parle dabstraction de processus.
3 Elements dun Sous- Programme I Un sous-programme: est defini grace a des operations de plus bas niveau, a un nom, a une methode qui lui permet daccepter des arguments et de delivrer des resultats (passage de parametres et communications a travers des objets non-locaux). est evalue en suspendant le programme dappel, en executant les instructions du bloc et en retournant au programme dappel.
4 Elements dun Sous- Programme II L entete dun sous-programme est representee par: un nom, des modes de passage de parametres, un type correspondant au type de valeur quil retourne si le sous-programme est une fonction. Le corps dun sous-programme est represente par: une sequence dinstructions. Un sous-programme peut etre defini (ou declare), mais jamais appele. Par ailleur, il peut aussi etre appele tres souvent et meme rcursivement.
5 Vue Abstraite des Sous- Programmes Une procedure etend le langage: cest un nouveau type dinstruction. De meme, une fonction est un nouveau type doperation. Les parametres dun sous-programme sont la generalization dobjets manipules par les instructions du sous-programme: un sous-programme doit fonctionner de la meme facon pour toutes les valeurs parametriques. On parle aussi de dummy variables. Lorsquon parle de passage de parametre, on veut dire remplacement dentites generalisees dans la declaration du sous-programme (parametres formels) avec des objets existants (parametres actuels).
6 Passage de Parametre Le mode de passage dun parametre determine: 1. Quelle partie de largument est donnee au sous- programme: 1. Seulement sa valeur 2. Seulement son addresse 3. Et sa valeur et son addresse. 2. Quelles restrictions sont appliquees sur lusage de largument: 1. Permission de lire 2. Permission decrire 3. Permission de lire et decrire.
7 Passage par Valeur Seule la valeur du parametre est donnee au sous- programme. Pour sauvegarder cette valeur, on utilise une variable locale qui devient son addresse. Ceci est implemente en calculant et copiant la valeur du parametre actuel dans lespace de memoire du sous-programme. Ceci peut couter cher si le parametre est un obet large tel quun tableau. Le passage par valeur est utilise en Ada par le parametre in, par le parametre-valeur du Pascal; et par tous les parametres en Algol-68 et en C.
8 Passage par Resultat Laddresse (mais pas la valeur) du parametre est rendue disponible au sous-programme seulement pour acces par ecriture. En principe, ce parametre est considere comme un objet local qui ne peut pas apparaitre dans des expressions. Le passage par resultat est utilise en Ada par le parametre out; il nest pas disponible en Pascal.
9 Passage par Valeur-Resultat (egalement: Passage par Copie) Lorsque le sous-programme est active, la valeur du parametre est copie dans un objet local. La valeur finale de cet objet est re-copiee dans le parametre. Le passage par valeur-resultat est utilise en Ada par le parametre in-out; il nest pas disponible en Pascal. Note: Les passages par resultat et par valeur- resultat peuvent, dans des situations assez bizarres, etre sensitifs a lordre dans lesquels les parametres sont evalues.
10 Passage par Reference I. (egalement Passage par Addresse) Aussi bien les addesses que les valeurs sont disponibles aux instructions du sous-programme. Ceci est implemente par reference indirecte: le parametre actuel est laddresse dune variable dans le programme dappel. Il nest pas necessaire de copier la valeur. Lun des grands problemes causes par le passage par reference est la declaration dalias. Par exemple, on peut passer la meme variable comme deux parametre actuels differents. De meme, une variable non-locale referenciee dans le sous-programme et passee comme parametre.
11 Passage par Reference II. (egalement Passage par Addresse) Le passage par reference est utilise en Pascal par le parametre var; il est utilise par tous les parametres dans le vieux FORTRAN; il nest pas disponible en Ada. Note 1: En quoi le mode de passage par reference differe du passage par valeur- resultat? Note 2: Un parametre passe par resultat, valeur-resultat et reference doit etre une variable.
12 Model Simplifie de Procedures in out in-out in-out reference reference Note: la classification de parametres formels basee sur les addresses et les valeurs nest significative que dans les langages a variables modifiables. Exemple: elle nest pas applicable au Prolog ou les addresses ne sont jamais disponibles (puisquil ny a pas daffectation).
13 Passage par Nom. (egalement: Evaluation Delayee) Le parametre actuel remplace le parametre formel: imagine la modification du sous-programme en inserrant le parametre actuel plutot que le parametre formel. Si la location dun parametre est necessaire (exemple: pour une affectation), elle est re-evaluee a chaque reference. Si la valeur dun parametre est necessaire, elle est aussi re-evaluee a chaque fois quelle apparait dans le corps modifie du sous-programme. Levaluation delayee dune expression demande lacces a ses variables (i.e., son environement)
14 Fonctions I Une fonction produit une valeur, retournee par une instruction telle que: return expression ou assignee au nom de la fonction (comme en Pascal). Lorsquune fonction est utilisee dans une expression, elle enrichie le langage en introduisant (dans un certain sens) de nouveaux operateurs.
15 Fonctions II Les effets secondaires dans les fonctions sont problematiques. Le mieux serait de ne permettre que des parametres in et aucun effet secondaires. Cela refleteraient vraiement les fonctions Mathematiques. Si des effets secondaires sont reellement necessaires, une procedure devrait etre utilisee avec un parametre reserve pour la transmission de la valeur que la fonction retournerait. Probleme de Conception: Quels types dobjets devraient-on permettre a une fonction de retourner?
16 Passage de Sous-Programmes comme Parametres Lidee est simple: un algorithme qui depend dun autre algorithme. Lexample typique est celui de lintegration. Il consiste a trouver la surface contenue sous la courbe decrite par une fonction. Le sous-programme integration doit etre capable de calculer lintegrale de nimporte quelle fonction. Voir lexample.
17 Les Sous-Programmes Surcharges Ceci est similaire a lidee de surchargement doperateurs. En particulier, une procedure ou une fonction peut etre definie plusieures fois avec le meme nom du moment que le type de tous les parametres ne sont pas les memes. Ceci est permis en Ada et en C++. Voir lexemple.