coursada1-genielogiciel

Upload: michel-isamuna

Post on 17-Jul-2015

31 views

Category:

Documents


0 download

TRANSCRIPT

I.U.T. Aix Dpartement gnie informatique

Gnie logiciel1er trimestre 2002/2003 (semaines 1 4)

Cours Ada

Polycopi tudiants pour le cours premire partie (cours 1 5B)

Daniel Feneuille

Nom tudiant :

Panorama complet des 14 premires semaines (numrotes) et, en gris, les modules o intervient le langage AdaVoir page suivante le dtail du cours semaines 1 11 (4h/semaine). Cette grille sera commente en cours.TD-TP 4 heures TD-TP 4 heures Ada Bases (4h) Cours Ada 2 heures Cours Ada 2 heures

14 13 12 11 10 9 8 7 6 5 4 3 2 1

TD-TP 18 Ada TD-TP 17 Ada TD-TP 15 Ada TD-TP 14 Ada TD et TP Shell TD et TP Shell TD-TP 12A Ada TD-TP 11 Ada TD-TP 10 Ada algo-ada 9 TD-TP algo-ada 6,7 TDs algo-ada 3,4 TDs TD et TP Shell diteur V.I.

TD-TP 19 Ada TD-TP 18 Ada TD-TP 16 Ada TD-TP 13B Ada TD-TP 13A Ada TD-TP 12B Ada Numriques TD Rcursivit 2 Rcursivit 1 Algorithmique numrique algo-ada 8 TD TP 6, 7, 8 algo-ada 5 TD TP 3, 4, 5 algo-ada 1 TD-TP diteur V.I.

Type Direct Type squentiel Type Perso Type Date2 Type Date1 Type Texte Type Matrice Type String Type Tableau Type Vecteur Type Discret Type Caractre algo-ada 2 TD-TP algo-ada 0 TD-TP Express13

Interfaage 14 Numriques 2 Testabilit Numriques 1Cours 10 suite

Access12

Fichier 11 suite Fichier 11 Cours 10 Cours 8 Cours 6 Cours 5 Cours 3 Cours 1 (III) Cours 1 (I)

Cours 9 Cours 7 Cours 5 bis E/S Cours 4 Cours 2 Cours 1 (II)

2

Cours n1 Ada semaines 1 et 2 (gnralits) Objectifs des supports de cours du langage Ada :Les cours Ada sont faits en demi promotion (suivant la planification dtaille ci-dessous). Ils sont accompagns de polycopis (dont celui-ci est le premier exemplaire). Il nest pas question, pour les tudiants, de se satisfaire des documents accompagnant le cours car, sils reprennent bien lessentiel de ce qui y sera dit, ils sont insuffisants pour bien connatre le langage. Les supports de cours nont pas, non plus, la prtention de se substituer aux bons livres dont vous trouverez la liste plus loin (notez que pour chacun des titres proposs, au moins un exemplaire est en bibliothque endroit que je vous invite connatre et frquenter). Enfin le cours est troitement en synergie ave c les TD et les TP qui sont faits pendant tout le premier trimestre (14 semaines). L encore des documents seront distribus. Nous 1 vous aiderons en faire la synthse mais rien ne sera assimil sans un travail rgulier et une pratique sur ordinateur, elle aussi, rgulire et soutenue2 ! De nombreux ajouts seront proposs (sur le CDRom) sous forme de rfrence des fichiers quils vous restera lire ! Voici le contenu du cours Ada au premier trimestre (un aperu de 11 semaines en 22 pavs de 2 heures repris du planning gnral de lenseignement de linformatique en premire anne page prcdente) : Semaine 1Cours n1 Gnralits I Cours n1 Gnralits II

Semaine 2Cours n1 Gnralits III Cours n2 Types scalaires et attributs

Semaine 3

Semaine 4

Semaine 5

Semaine 6

Semaine 7

Cours n3 Cours n 5 Cours n6 Les instructions Sous programmes Types Articles Complments Cours n4 Cours n5 bis Cours n7 Types tableaux E/S simples Paquetages Ada hirarchiques.

Cours n8 Cours n10 Les exceptions C.O.O et T.A.D. Cours n9 La gnricit Cours n10 (suite) objets et classes

Semaine 8

Semaine 9

Semaine 10

Semaine 11

Semaine 12

Semaine 13

Semaine 14

Cours n11 Testabilit Cours n12 . Cours n13 E/S Ada.Text_Io (Bote Noire et Type Access Les expressions Bote Claire) drcursivit Cours numrique Cours n11 Cours numrique Cours 14 1 E/S (suite) 2 Interfaage Types digits, fichiers Convergence, delta Squent. et direct troncature et dcimaux

La partie en gris nest videmment plus le cours Ada . Voir la grille gnrale affiche ou sur le CDRom Remarque : Nous avons t obligs de faire un dcoupage de la matire enseigner, comme cela est propos partout, avec des thmes comme les paquetages, la gnricit, les tableaux, les exceptions, les pointeurs, les objets etc. Mais cest bien l une des difficults du langage Ada o, en fait, tout se tient, et o il faudrait pouvoir enseigner tout en mme temps (impossible !). Cest dans cet esprit que nous serons souvent amener voquer un thme de faon un peu superficielle pour mieux y revenir plus tard : par exemple nous parlerons vite des paquetages et les sousprogrammes cours gnralits III (semaine 2) pour les tudier plus en dtail plus tard (semaines 4 et 5).

Langage (Quid ?)Contrairement la notion de langue (o on sintresse au caractre vocal) la notion de langage fait rfrence la notion de signes. Pour le pilotage dun ordinateur par lhomme la communication passe aussi par un langage (dit artificiel) : le langage de programmation. Pour tre compris de lordinateur le pilotage utilise des instructions1

Nous : sous ce pronom se cachent aussi les noms de quelques collgues (alias les TWO_BE_THREE de linfo) qui formeront lossature, au premier trimestre, de lencadrement et du dmarrage Ada TD et TP (ainsi quen Algorithmique). 2 avertissement que, certains ne prennent pas au srieux! Voyez les redoublants sincres pour en savoir plus! D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

3codes : le programme. Avant dtre excutable le programme doit tre correct (comprhensible) cest lobjectif de la phase de compilation. Cette tape est en fait structure en tapes plus fines (souvent inaperues) : analyse lexicographique, analyse syntaxique et analyse smantique. Lordinateur nutilise en gnral pas le mme codage que celui du programmeur pour sexcuter (cela dpend du processeur) il est donc ncessaire de passer par une ultime phase de construction : ldition de liens (notez que ceci nest pas toujours vrai conne par exemple avec le langage Java). Pour plus de dtails voir la page 6 Langage informatique (complments lire). Ada est un des nombreux langages modernes de programmation et cest le premier que nous tudierons.

Un peu dhistoire (la petite !).Ada vous connaissez ce nom ? Cherchez bien, la pub un peu partout ! mais oui : le loueur de voitures. Hlas vous ny tes pas ! Si je vous dis, pour vous mettre sur la voie, que cest lhistoire dune femme. Alors l, des cinphiles vont penser la belle hrone de La leon de piano mais cest encore rat ! Non il sagit de Adlade Augusta Byron, fille du coquin pote Lord Byron (seule enfant dailleurs quil reconnut !). Elle tait passionne de mathmatiques, elle travailla avec le gnial inventeur Charles Babbage dont elle fut lgrie. Elle est considre comme le premier programmeur de lhistoire. Elle mourut ruine et alcoolique. Cest pour lui rendre hommage que son diminutif Ada fut donn comme nom au langage dont vous allez dcouvrir le contenu en quelques semaines. Si vous tes intresss pour en savoir plus, dans les bons ouvrages (liste un peu plus loin) voyez les introductions 3. Elles voquent souvent un peu de lhistoire de cette femme exceptionnelle. Voir aussi les deux pages 7 et 8 (complments lire).

La vraie histoire du langage Ada (rsum succinct) :Le concept de langage de programmation prsent rapidement ci dessus et aussi page 6 (dj signal) sera complt oralement en cours. Lhistoire du langage Ada remonte au milieu des annes 1970. Le puissant lobby amricain quest le DOD4 dcida de ne plus utiliser quun unique langage de programmation en lieu et place des centaines quutilisaient alors tous ses services. Les milieux bien informs saccordent en gnral sur le nombre de 400 500 langages ou dialectes informatiques utiliss cette poque par le DOD lui-mme ou par ses fournisseurs 5. De 1975 1983 se succdrent des runions de comit dexperts qui produisirent un cahier des charges (le gnie logiciel tait le principal objectif) suivi dun appel doffres en 19776. Les laurats proposrent en 1979 une premire bauche (avec une ossature de Pascal) puis de proche en proche on parvint la dfinition dune norme internationale en 1983 ! Norme que les vendeurs de compilateurs doivent respecter7. De ce fait les premiers compilateurs sortirent en 1985 et hlas cette inertie (de 10 ans !) entre les premires descriptions du langage et la possibilit de lutiliser joua des tours la promotion du langage. Aujourdhui, dans les milieux informatiques le langage Ada est incomparablement reconnu pour la production de logiciels trs haut niveau de fiabilit8 mais peu got des informaticiens qui programment dabord et rflchissent ensuite. En effet, cest bien contraignant Ada car il faut rflchir !9 et simposer des contraintes (en contradiction avec le narcissisme des tres humains). Mais quand on y souscrit on ne peut que sen fliciter : par exemple il nest pas rare de dcouvrir, avec ce langage, ds la phase de compilation, des erreurs conceptuelles que dhabitude avec un langage permissif on dcouvre trs tard dans la phase de tests 10. Ce plaidoyer, certainement inaccessible aux dbutants informaticiens, sera reformul et dmontr tout au long de ce premier trimestre 11. Pour conclure, un dernier regard sur le petit dernier il sagit de Ada95 (longtemps appel Ada9X) et qui est la rvision prvue du langage (ce processus prit plus de 5 annes : 90-95).3 4

par exemple, la page 18 du livre de Rosen le DOD est dj le crateur dans les annes 1960 du langage COBOL (encore, hlas! utilis en gestion) 5 L encore voir les introductions des bons ouvrages sur Ada (pages 17-19 Rosen et 1-3 Barnes). 6 appel doffres qui sera remport par une quipe dirige par un franais! cocorico! . 7 On verra, tous ensembles, en TP, ce quest un compilateur Ada qui est dailleurs, beaucoup plus, quun traditionnel compilateur car cest tout un environnement de dveloppement de logiciels. 8 Avionique, fuse (Ariane), conduite ferroviaire (train, mtro) etc. (par exemple le tunnel sous la Manche). 9 plus prcisment il faut beaucoup spcifier cest--dire expliciter ce que lon veut faire ! 10 cest--dire trs loin dans le dveloppement du logiciel donc avec un cot prohibitif. 11 Celles et ceux qui le souhaitent pourront dores et dj parcourir le cahier pdagogique n2 propos de gnie logiciel jy explique le choix pdagogique du langage Ada ( Aix) dans les premires heures de lapprentissage en I.U.T. en option gnie informatique (car telle est notre dnomination). Voir fichier cahier2.doc. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

4Cette dernire version intgre et permet les objets (concept que lon verra en dtail plus tard) mais concept important et incontournable en informatique daujourdhui12. Je ferais, au cours n10 (semaine 7), une prsentation des concepts modernes de programmation avec Ada95 et la classification (les objets).

De bons livres rcents sur Ada13 :La liste est videmment non exhaustive mais elle nomme les plus complets pour un bon dbut et .... que lon trouve en bibliothque (prt possible) ! Si vous avez quelques kopecks ce nest pas une dpense stupide. 1997 programmer en Ada 95 de BARNES. Cest lun des premiers livres (au propre comme au figur). Ce livre de lactuel prsident de Ada Europe a souvent t rdit. Louvrage est traduit en franais et prsente tout en plus de 700 pages ! Enorme mais trs trs bon bouquin ! Je ferai souvent rfrence mais la cinquime dition (attention) : cest la Bible (ou le Coran ! de tout Ada-tollah). 1995 Mthodes de gnie logiciel avec Ada 95 de Jean-Pierre Rosen. Excellente prsentation des concepts de composition (avec Ada 83) et de classification (avec Ada 95) par un excellent pdagogue. 1996 Vers Ada95 par lexemple de FAYARD et ROUSSEAU. Des exemples (sources sur Internet). 1999 Programmation squentielle avec Ada 95 de Brguet et Zaffalon aux Presses Polytechniques et Universitaires Romandes (Suisse).

Rappelons que ce cours polycopi est disponible sur le Net soit en ftp://paprika.iut.univ-aix.fr/pub/cours_ada_DF soit chez http://libre.act-europe.fe/french_courses (ACT est lorganisme permettant davoir le compilateur gnat.

Objectifs du langage Ada :Comme on la pressenti ce langage avait une vocation dunicit et donc de langage gnraliste (il fallait pouvoir remplacer tous les langages et dialectes des annes 70 !). Mais il fallait en faire un langage durable et professionnel qui intgrait les besoins des annes venir, en clair qui permette de mettre en uvre les concepts de gnie logiciel : concevoir et raliser des composants logiciels . Bien sr, ce moment de la lecture, peu dentre vous peuvent imaginer ce que signifie ces concepts. Cest ce que nous dcouvrirons ensemble pendant tout ce cours associ des TD et TP. Les matres mots retenir sont ceux de modules, de rutilisabilit, de spcifications dclares et contrles, de portabilit, de gnricit, de scurit de fonctionnement, ... etc.

Le concept de norme (pourquoi normaliser ?) :Un langage de programmation comme tout langage (au sens gnral du terme) sert dialoguer, se faire comprendre (non seulement par le biais dun ordinateur particulier mais aussi de tous les ordinateurs et ... de tous les programmeurs qui utilisent les ordinateurs !) Evident ? Pas sr ! Un langage est soumis des rgles de syntaxe (ah la grammaire franaise pour ne citer quelle !). Ces rgles sont dfinies et regroupes dans un manuel de rfrence14 (L.R.M. en anglais) dcrivant la norme 15. Eh bien, il existe trs peu de langages informatiques normaliss ! Et quand la norme existe, il y a peu de compilateurs (normes logiciels (hyper programmes) chargs de vrifier si un programme crit dans le langage en question respecte la norme) qui respectent eux-mmes la norme. Ceci signifie par exemple quun programme valable sur une machine A contrl avec un compilateur B peut ne plus ltre sur une machine C avec le compilateur D. Trs fcheux quand on veut faire du gnie logiciel cest--dire de la production industrielle de logiciels ! Ada est lun des rares langages qui oblige les vendeurs de compilateurs faire agrer chaque anne leur compilateur (par une srie de tests de validit). A titre danecdote sil est vrai que le langage C (le plus connu et utilis actuellement) est normalis il est aussi vrai que rien noblige les compilateurs respecter cette norme (ce qui hlas arrive trs souvent). Et lactualisation moderne du C (nomme C++) langage moderne dit objet que lon tudiera aprs Ada (au deuxime trimestre) et trs en vogue, nest normalis que depuis peu !

12

pour Ada95 lerreur de compilateurs tardifs na pas t reconduite. Il existe mme un compilateur totalement gratis free in english le GNAT copiable via internet (service ftp). Voir fichier Ada_Web.html sur le CDRom. 13 le premier vrai livre sur Ada remonte 1982 et cest : le manuel de rfrence en anglais (of course!) 14 disponible gratuitement en ftp (attention beaucoup de pages !). En ligne avec linterface AdaGide (gnat). 15 Voir, l encore, la page 6 sur la notion de langage informatique. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

5 La notion de composants logiciels :De plus en plus, on peut acqurir (gratuitement ou contre argent comptant) des logiciels ou des briques de logiciels quil suffit de savoir assembler entre eux (ou composer serait plus juste) de la mme faon que lon peut acheter des composants lectroniques assembler. Cette notion est assez nouvelle et promise un avenir vident mme si des informaticiens (trop conservateurs 16) accrochs leurs connaissances antrieures et pas actualises ne veulent rien savoir17. La diffusion (et linformation) de ces composants ont subi un norme coup dacclrateur grce aux services dInternet18 (ftp, Web et E -mail). Voir le fichier Ada_et_le_Web.html. Savoir construire et proposer des composants srieux et fiables est donc une des missions les plus importantes pour linformaticien de demain. Cest ce que nous emploierons montrer dans ce cours et raliser en TD-TP. Disons le tout net, Ada nous sera dune grande commodit pour cet objectif pdagogique19. Voir aussi les pages 5 9 de Barnes (5ime dition). Remarque : Ce support de cours gnralits I valable pour la premire semaine (2 heures) se prolonge (en premire semaine : 2 heures galement, et en deuxime semaine : 2 heures encore) avec les documents suivants gnralits II et III ( suivre dans cet ordre) et ci aprs : Diagrammes syntaxiques (D.S.) Les littraux numriques Ada pour illustrer les D.S. Des exemples de programmes (et de composants) comments, ils sont tirs, au dbut, des codages des algorithmes conus dans le cours dalgorithmique qui est enseign en parallle. Rsum : Planning des cours Ada Langage de programmation (notion) Historique de Ada Bibliographie Norme et gnie logiciel Composants logiciels Pages supplmentaires ( lire) : pour le CDRom commencez par la page Intro_cdrom.html Texte : Langage (page 6), Byron.et babbage. (pages 7 et 8) Fichier Ada_et_le_Web.html (2 pages) sur le CDRom. Fichier Cahier2.doc (8 pages) sur le CDRom. Fichier AdaFranceTAILL.doc sur le CDRom.

Daprs CABU !

16 17

et pas forcment vieux comme on le croit gnralement ! ah mon cher ! Le COBOL, il ny a que cela de vrai. Ils y reviendront, vous verrez, au COBOL ! 18 le rseau des rseaux. On verra cela plus tard (de faon thorique et pratique). Osez surfer! 19 cest lAda-tollah qui parle (oppos aux C-rtiques)! D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

6LANGAGE (informatique) : complments de cours La notion de langage ne doit pas tre confondue avec celle de langue. Avec la notion de langue on doit tenir compte de la double articulation monme-phonme ainsi que du caractre vocal. Le concept de langage est, lui par contre, li la notion de signe. Un langage est communment dfini comme un systme de signes propre favoriser la communication entre les tres, quels quils soient, mmes les tres inanims qui ont peut-tre une me ! Mais on sgare du sujet ! Trois lments fondamentaux interviennent dans la dtermination du signe : le signifiant, le signifi et le rfrent. Do les trois aspects dun langage : laspect syntaxique (champ des signifiants), laspect smantique (relations signifiants-signifis) et laspect pragmatique, qui a pour mission de rendre compte du contexte de la communication (champ des rfrents). Les langages artificiels et, en particulier, les langages informatiques qui interviennent dans la communication homme-machine nchappent pas ces distinctions. Ainsi, en programmation, des considrations syntaxiques permettent de dfinir en quoi un programme est correct, cest--dire conforme aux rgles dcriture imposes par la norme du langage (mais ceci ne signifie pas quil marche ). La syntaxe est ici lensemble des rgles permettant la formation dexpressions valides partir dun alphabet (vocabulaire) qui varie selon le langage. Ces rgles sont elles-mmes prsentes dans un autre langage ! On parle alors de mtalangage ! Il doit tre le plus clair et le moins ambigu possible (voir ci dessous). On distingue trois grandes techniques dcriture de rgles : avec des phrases trs verbeuses expliquant en langage naturel (utilises avec le langage COBOL par exemple), des dessins ou diagrammes syntaxiques (souvent utiliss dans les manuels de PASCAL et parfois en Ada) et enfin la notation BNF (trs prise dans les descriptions des langages tels Algol, C, Ada etc.). En Ada, la grammaire du manuel de rfrence utilise la notation BNF (voir par exemple dans laide de lIDE AdaGide Language RM annexe P). Dans les langages de programmation, laspect smantique est mis en vidence par les performances du programme, cest--dire par les relations qui existent entre un ensemble dinstructions syntaxiquement correctes et un ensemble de rsultats. Laspect pragmatique des langages utiliss en informatique, moins net, trouve quant lui son illustration dans des situations spcifiques : relations programmes-machines, programmescompilateurs, machines virtuelles, etc. La communication entre lhomme et la machine ne se fait pas directement, mais par tapes qui impliquent les interventions successives du programmeur et de programmes spcifiques (assembleur, macro-assembleur, compilateur, diteur de liens, chargeur, interprteur) ; elle fait donc intervenir plusieurs niveaux de langages. Lintervention du programmeur, lors de la rdaction du programme, a pour objet de traduire le langage naturel (criture de spcifications) en un langage appel langage source, qui peut tre : un langage symbolique (langage assembleur ), le plus loign du langage naturel, caractris par une syntaxe rigide ; un macro-langage, utilisant des macro-instructions , aux fonctions plus complexes que celles des instructions proprement dites ; un langage volu (Fortran, Algol, APL, Cobol, Basic, PL/1, Pascal, Ada, Eiffel, C, C++, Prolog, Java, etc.), orient vers les problmes et dont la structure est la plus proche de celle du langage naturel, avec une syntaxe et un alphabet qui est une extension de lalphabet naturel (lettres, signes, chiffres, expressions). Tous ces langages forment ce quon appelle la classe des langages de programmation. On note aussi les langages dits de requte qui servent la consultation de bases de donnes (SQL, par exemple, pour Structure Query Language) et en micro-informatique, des langages spcifiques, comme Dbase (en baisse !), pour utiliser des gestionnaires de donnes et Microsoft Access plus rcent (membre de la trilogie Bilou). Enfin les langages dits de commande (SHELL) permettent un oprateur dchanger des informations et des rponses avec la machine permettant entre autres de piloter les diffrentes tapes de cration dun programme excutable voques plus haut. Ces commandes sont aujourdhui plus agrables utiliser grce aux interfaces graphiques (WINDOWS) utilisant en harmonie icnes, textes, clavier, cran et souris. En parallle aussi les langages de script qui fleurissent de faon continue (Javascript, PHP, Python etc.). Texte crit partir dune page modifie et complte de lencyclopdie Universalis . Pour en savoir plus il faut lire les deux pages suivantes sur Ada Byron et Babbage. Pour connatre lhistoire de linformatique voir le texte Une trs brve histoire de linformatique ladresse Internet http://dept-info.labri.u-bordeaux.fr/~dicky/HistInfo.html

D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

7La petite histoire de linformatique I.

La famille de Ada Byron.Et quelle famille mes aeux ! Les Byron descendaient dune trs ancienne famille de Vikings. Le premier baron Byron, gnral fidle aux Stuart, fut anobli en 1643. Le grand-pre de Ada tait un inconscient prodigue et sduisant. Il avait enlev, fait divorcer et pous en premires noces la marquise de Carmarthen, qui mourut en 1784, laissant une fille, Augusta Byron (1783-1851)21. Il se remarie avec Catherine Gordon de Gight, descendante de lancienne famille royale dcosse. Ce mariage fut malheureux ; les deux poux se sparrent bientt laissant un fils George Gordon Byron22. George navait pas trois ans quand son pre mourut, laissant sa femme dans la misre. Lenfant fut lev par cette mre instable, passionne, irascible, la tendresse tyrannique. Il tait pied-bot, soit de naissance, soit la suite dune paralysie infantile, et cette infirmit laffligea profondment. Ils vcurent dans la gne. A la mort de son grand-oncle, George devint le sixime baron Byron et hrita dun pauvre domaine. Le chteau, ancien prieur normand, tait en ruine, et les terres lourdement hypothques. Envoy en pension, George Byron y acquit une solide connaissance du latin et du grec, une grande admiration pour les lettres classiques et la littrature anglaise du XVIIIe sicle, un got trs vif pour la posie et lhistoire. Il y frquenta des jeunes gens de son rang et, malgr son infirmit, pratiqua avec brio la natation, le cricket et lquitation. Son dveloppement affectif fut prcoce ; len croire, il navait que dix ans lorsquil tomba amoureux dune cousine ! Plus tard il sprit plus srieusement dune autre cousine un peu plus ge que lui. Plus tard, aprs avoir pris possession de son sige la Chambre des lords (13 mars 1809), Byron, sembarque pour son grand tour , le 2 juillet 1809. Au plus fort des guerres napoloniennes, il traverse le Portugal et lEspagne, gagne Malte, puis lAlbanie. En dcembre 1809, il arrive Athnes do il repart pour lAsie Mineure. Le 3 mai 1810, il traverse, tel Landre, lHellespont la nage, exploit sportif dont il est trs fier. Il sjourne deux mois Constantinople et regagne Athnes en juillet 1810. Il demeure en Grce jusquen avril 1811, voyageant, tudiant, crivant. son retour Londres, en juin 1811, il rapportait plusieurs pomes et une sorte de journal de voyage quil publia. La russite, jointe la jeunesse du pote, la beaut, llgance et lexcentricit du dandy, fit de lui lidole du jour et lui valut de faciles succs fminins. Certaines admiratrices passionnes simposrent littralement lui ; matresses indiscrtes, elles entranrent le jeune auteur la mode, gris de sa popularit, dans des intrigues compliques. Ces aventures, colportes, embellies, avilies par des confidences indiscrtes, contriburent crer le personnage lgendaire de bourreau des curs. Au cours de lt 1813, il revit, aprs plusieurs annes de sparation, sa demisur Augusta. Quils aient eu lun pour lautre une affection passionne et trangement fraternelle ne fait pas de doute, comme en tmoignent ses pomes Augusta. Y eut-il inceste ? Medora Leigh, fille dAugusta, ne le 15 avril 1814, en fut-elle le fruit ? Il ny eut lpoque que de trs vagues soupons. La destruction de ses Mmoires, aussitt aprs sa mort, donna penser quil y avait un scandale cacher. En dpit du succs de ses ouvrages et en raison dun train de vie ruineux, le noble lord tait pauvre et cribl de dettes. Il chercha redorer son blason en pousant une riche hritire. Le mariage eut lieu le 2janvier 1815. Cette union fut malencontreuse : la msentente conjugale fut aggrave par des difficults financires. Le 10 dcembre 1815, lady Byron donnait naissance une fille, Ada23 ; le 15 janvier 1816, lord Byron chassait sa femme de chez lui. Puis, regrettant cette dcision, il tenta vainement dobtenir une rconciliation. Il dut se rsigner en avril signer un acte de sparation qui le dpouillait de sa femme, de sa fille 24 et de la moiti de sa fortune. Laffaire fit scandale, et la socit qui lavait adul se dchana contre lui.... On arrte l le rcit de cette saga ! On pourra en savoir plus dans les bonnes encyclopdies notamment Universalis dont sont extraites (aprs puration ou arrangements) ces quelques lignes. On verra avec le papier sur Babbage (page suivante) que la vie de notre Ada nest pas mal non plus ! Tel pre telle fille! Pour en savoir plus voir : http://www.mo5.com/MHI/HISTOIRE/lovelace.htm et aussi en http://www.mo5.com/MHI/HISTOIRE/babbage.htm .20

20 21

On se contentera du grand-pre et du pre et cest dj pas si mal ! Elle ce nest pas notre Ada mais sa demi-tante comme on va le voir. 22 Pre de notre Ada ! Le plus connu de cette illustre famille (dandy et pote romantique). Coquin ses heures ! 23 L oui, cette Ada cest la ntre : Augusta Adelade Byron future comtesse de Lovelace. 24 La seule enfant, donc, quil reconnut. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

8La petite histoire de linformatique II.

Babbage : le gnial inventeur et Ada : la premire programmeuse.Babbage, Charles (1791-1871), mathmaticien et thoricien de l'organisation industrielle britannique, dont les travaux sur la mcanisation du calcul sont l'origine de l'ordinateur. Dans les annes 1820, Babbage conut une machine diffrences, un appareil mcanique pouvant effectuer des calculs mathmatiques simples avec une prcision pouvant atteindre 31 chiffres. Cependant, il dut abandonner sa construction pour des raisons financires. Dans les annes 1830, il conut une machine analytique cartes perfores, afin d'effectuer des calculs plus compliqus, mais nouveau cet instrument ne vit jamais le jour. Cette rflexion sur la mcanisation du calcul annonce l'informatique. l'origine des thories de l'organisation industrielle, Babbage est l'auteur d'un Trait de l'conomie des machines et des manufactures (1832) analysant la production automatique des manufactures et la division du travail, ce qui lui vaut d'tre souvent cit par Karl Marx dans le Capital. Ses Reflections on the Decline of Science (1830) reprennent la

Extraits de lencyclopdie Encarta (texte ci-contre et image). tradition leibnizienne du calcul infinitsimal.

Fils de banquier, Charles Babbage ne suivra pas la carrire de son pre. Il tait trop pris de mathmatique, dastronomie et de mcanique. En 1814 il pouse une jeune brunette qui lui fera une grande famille 25. A lorigine cest pour palier les erreurs de calcul qui encombrent les tables astronomiques et nautiques quil envisage une machine calculer plus proche dune machine dhorlogerie que des calculateurs actuels ! Aprs de nombreux checs et beaucoup dargent perdu il fait une pause en 182726. Un an plus tard il reprend ses travaux. Malgr des aides ministrielles la machine diffrence sera condamne. Loin de se rsigner il prpare sur papier cette fois une autre machine plus simple la machine analytique . Elle ne fut jamais construite de son vivant mais sera fabriqu vers 1990 ! et expos au Science Museum de Londres. Les 300 plans et 7000 pages de notes laisss par Babbage permettent de classer cette machine parmi les anctres de lordinateur actuel. En 1833 il rencontre une brune aux yeux de jais : Ada Byron comtesse de Lovelace . Passionne de mathmatiques, elle aussi, elle devint sa collaboratrice27 en 1842. Elle crivit pour la machine analytique fictive de Babbage des programmes 28 destins tourner ds que lengin serait oprationnel. Il ne vit jamais le jour de son vivant comme on la signal. Des informaticiens samusrent, plus tard, coder les algorithmes de la comtesse29. Ils tournrent parait-il du premier coup ! On voit ainsi en Ada Lovelace le premier programmeur de lhistoire ! La comtesse mourut 36 ans dun cancer aprs stre beaucoup adonn lalcool, lopium et aux courses de chevaux ! Babbage lui mourut bien plus tard 80 ans en 1871. Pour la petite histoire soixante quinze ans plus tard (en 1946), en Pennsylvanie, naissait le premier vrai calculateur lectronique baptis ENIAC (Electronic Numerical Integrator And Calculator). Pour en savoir plus consulter http://dept-info.labri.u-bordeaux.fr/~dicky/HistInfo.html .

25 26

Un an avant la naissance de Ada Byron ne en 1815. Date laquelle il perd son pre et sa femme. 27 On dit aussi grie ou inspiratrice. En aucune faon elle ne fut sa matresse ni sa femme comme lcrivent, parfois, certains textes sensation sur le langage Ada. 28 pour calculer les nombres de Bernouilli notamment. 29 Cods en langage PL/1 (produit IBM destin remplacer FORTRAN et COBOL) et qui neut pas de succs. D. Feneuille I.U.T. 2002 (cours n1 fichier COURS1.DOC) 30/06/02

DIAGRAMMES SYNTAXIQUES (D.S.) ou diagramme de CONWAY Ada est un langage de programmation (on vient de le voir dans les gnralits). Comme tous les langages, celui-ci obit des rgles grammaticales prcises (syntaxe) qui peuvent tre dcrites : soit par des phrases (elles sont souvent lourdes et difficiles comprendre) cest le cas des prsentations dun vieux langage : le COBOL (dfinitions verbeuses !). soit par des schmas, comme des Diagrammes Syntaxiques (en abrg D.S.). Cette description est trs utilise dans la prsentation du langage PASCAL (voir un livre correspondant). soit par une troisime description dite B.N.F. Utilise en Ada dans le manuel de rfrence (document accessible sur le Web ou dans AdaGide). B.N.F. est vu aprs les D.S. en page 3. I - Dfinition des symboles utiliss pour crire un D.S. (Diagrammes Syntaxiques) cartouche arrondie ou ronde : le symbole est prendre " la lettre". Symbole dit : terminal. cartouche rectangulaire : renvoie une syntaxe dfinie ailleurs (avant ou aprs). flche : dfinit le parcours du diagramme (aide sa lecture). II - Diagramme de base. a) schma squentiel : Dclaration d'une constante universelle en Ada (voir exemples page 4 en bas)

exemple :

liste didentificateurs

:

constant

:=

expression statique universelle

b)

schma alternatif : Dfinition de type tableau en Ada (vue au cours Ada n3)

exemple :

dfinition de tableau contraint

dfinition de tableau non contraint

exemple : oprateur de relation Ada :

= /= < > =

Cours n1 (Gnralits II) fichier Cours1_B.DOC 30/06/02

2

Exercice 1 : Etablir les trois D.S. correspondant aux dfinitions (seul le 2ime est corrig !) : lettre : toutes les lettres de 'A' 'Z' puis les lettres de 'a' 'z' (idem pour les chiffres). oprateur multiplicatif : un oprateur multiplicatif est un des 4 symboles suivants : *, /, mod, rem type prdfini : les 6 types suivants sont prdfinis (c'est--dire connus sans qu'il soit besoin d'en donner la dfinition) : INTEGER, FLOAT, CHARACTER, STRING, BOOLEAN, DURATION.

*

/

mod

rem

c)

schma rptitif : exemple : dfinition d'un littral chane :

C'est une suite (ventuellement vide) de caractres encadrs de guillemets. Le diagramme syntaxique est le suivant : Littral-chane

"caractre

"

Observez bien le sens des flches ! La notion de caractre sera vue plus loin. Le problme du caractre guillemet dans un littral chane est rsolu part et nest pas dcrit dans ce D.S. Exercice 2 : (aprs la pause dintercours !) Donner le D.S. correspondant la dfinition suivante : suite de lettres, de chiffres ou de _ (soulign), le premier caractre tant une lettre, le _ ne finissant pas la suite de symboles et napparat pas deux fois conscutivement (c'est la dfinition d'un identificateur da il faudra s'en souvenir !). Voir corrig page 4. Exercice 3 : Ecrire le D.S. correspondant la dfinition suivante : Un commentaire Ada est une squence (ventuellement vide) de n'importe quel caractre prcd par les deux caractres -Exemples : --ceci est un commentaire ceci est un commentre

le deuxime commentaire est galement correct (les accents sont accepts et lorthographe nest pas contrle !)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

3

III - Notations B.N.F. Une reprsentation trs utilise en thorie des langages (voir cours correspondant niveau BAC + 3) est la notation dite B.N.F. (Backus-Naur-Form). Outre son aspect purement descriptif d'une grammaire, elle est sous-tendue par une thorie mathmatique qui la rend indispensable. De plus elle peut tre directement utilise par un traitement de texte sans graphisme ou un analyseur syntaxique. Malgr cela nous ne l'utiliserons pas dans ce cours car elle est moins lisible que les diagrammes syntaxiques. Cependant elle est utilise dans le manuel de rfrence Ada (voir par exemple Barnes pages 595 609) et de ce fait doit tre connue. Sept symboles particuliers (mta-symboles) sont utiliss : ::= | [ ] { } ' ' qui signifie "est dfini comme" qui signifie ou bien , ce symbole marque donc lalternative. qui signifie que les lments entre les crochets peuvent tre prsents 0 ou 1 fois, qui signifie que les lments entre les accolades peuvent tre prsents 0, 1 ou plusieurs fois, qui encadrent des lments terminaux, (correspondant aux cartouches arrondis des diagrammes syntaxiques), < > qui encadrent des lments non terminaux (correspondant aux cartouches rectangulaires des diagrammes syntaxiques), ( ) qui permettent de regrouper des parties de dfinition, ces parenthses sont utilises chaque fois qu'il y a ambigut.

Par exemple, les 4 diagrammes syntaxiques ci-dessous : diag1: ident1 Diagrammes voqus au tableau

ident2

ident3 diag2 : ident1 ident3

ident2 diag3 : ident1 ident2

ident3 diag4 : ident1

ident2

ident3

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

4

s'crivent, respectivement en notation B.N.F : observez bien le rle des parenthses! Et .... la compacit de la prsentation! ::= ::= ( ) ::= ( ) ::= ( ) Exemples : (retrouvez ou donnez les D.S. quivalents) ::= {'elsif''then'] 'end if' ';' ::= [ ' : '] [ 'end loop' [ ] ';'

Exemples de constante universelle Ada ( revoir !) : MAX : constant := 30 -- la valeur est un littral numrique

PI_3 : constant := abs (PI ** 3); -- la valeur est une expression statique JOUR : constant := LUNDI; -- la valeur est un littral numratif

corrigs exercice 2 de la page 2 en DS puis en BNF ( retenir) :

lettre

lettre

_ chiffre

exercice : mettre ce diagramme en B.N.F. (corrig page suivante)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

5

corrigs exercice 5 (voir cours n 3 des exemples de codage Ada utilisant if et loop) :

instruction if :

if

expression

then

suite dinstructions

elsif

expression

then

suite dinstructions

else

suite dinstructions

end if

;

instruction loop :

nom simple de boucle

:

schma ditration

loop

suite dinstructions

end loop

;

nom simple de boucle

remarques : on verra des applications des D.S. dans le fascicule de cours : les littraux numriques Ada page suivante. Nous utiliserons souvent les D.S. pour illustrer des concepts Ada. Barnes utilise, par contre, la notation BNF dans son livre (dj cit pages 595 609) Le manuel de rfrence utilise lui aussi la notation BNF (dj dit)

Corrig de lexercice bas de page 4 : ::= { [_] ( ) }

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

6

LES LITTERAUX NUMERIQUES Ada

Avertissement : Ce module de cours fait suite celui des Diagrammes Syntaxiques (D.S.) quil enrichit en lillustrant. Cest loccasion aussi de faire de lAda sans en avoir lair. Il sinscrit donc bien dans le dbut du cours sur le langage Ada (gnralits II). Le concept de littral numrique Ada. Pour dfinir ce concept on pourrait dire qu'il s'agit de la faon de dnoter (ou reprsenter) en Ada une valeur numrique. Cette dnotation est bien sr assujettie des rgles strictes que l'on peut noncer sous forme explicite ou ... sous forme de D.S. ou en BNF (et nous voil revenus au module de cours prcdent!). Exemples d'criture : a) les littraux entiers : (criture o il ny a pas de point dcimal) 13 est un littral numrique entier (c'est vident). Mais 1_993 est aussi un entier (plus tonnant ! non ? mais ceci est vu en BNF pages 4 et 5!) Et que dire galement des quatre suivants : 7 # 123 # E2 2 # 01_0010 # 16# 2A3C # 12E+8 Les trois premiers sont dits entiers bass et le quatrime dnote un grand entier ( revoir). b) les littraux rels : (on note la prsence d'un point dcimal) 3.14159_2653 est un littral numrique rel (facile ?) mais aussi les deux suivants : 6.02E-24 et 2 # 101.01 #E1 tout ceci mrite des explications et donc ... des rgles! Remarques : (avant de se lancer dans les diagrammes de CONWAY ou D.S.) 1_993 vaut 1993 et 3.14159_2653 vaut 3.141592653. Ceci signifie que le trait bas (dit aussi le soulign) est uniquement un instrument de lisibilit de la valeur numrique (entire ou relle). A utiliser donc sans restriction si cela doit rendre le nombre plus lisible. On distingue deux classes de littraux (et ceci na rien voir avec la classification en entier ou en rel) : les littraux dits bass et les autres. Les littraux bass se caractrisent par une valeur (dite base) encadre par deux dises (#), la valeur de la base prcde le premier dise, le deuxime dise tant ventuellement suivi d'une valeur "exposant". Nous allons y revenir. Ainsi : (voici une bonne rvision sur la numration !) valeur de lexposant (ici 2) . 7 # 123 # E2 valeur du littral en criture base (123 mais en base 7, attention !) (les dises annoncent une valeur base) valeur de la base (ici 7) do : 7 # 123 # E2 = (1*72 + 2* 71 + 3 * 70) * 72 = 3234 (mais cette fois en base 10)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

7

Dautres exemples : 2 # 01_0010 # entier bas, de base 2, valeur 010010 dans la base, pas dexposant soit : 1 * 24 + 1 * 21 = 16 + 2 = 18 en dcimal 16 # 2A3C # = 2 * 163 + 10 * 162 + 3 * 161 + 12 * 160 = 10812 12 E8 = 12 * 108 En labsence de base (donc de dise) la base est 10 implicitement ! 6.02E-24 = 6.02 * 10-24 2 # 101.01 #E1= (1*22 + 1 * 20 + 1*2-2) * 21 = (5 + 0.25) * 21 = 10.5 autre remarque : la valeur de la base (devant le premier dise) est toujours en criture entire dcimale (mais pas forcment la valeur base) et l'exposant (repr par le E ou un e) est toujours associ la base (mais la valeur de lexposant s'exprime, comme pour la valeur de la base, en dcimal !). Comment formaliser ces rgles ? (les corrigs sont la fin du document page 11) a) on distingue d'abord les 2 classes (bases ou non) d'o la premire rgle : un littral numrique est : soit un littral bas ou soit un littral dcimal. exercice : crire le D.S. correspondant. Voir corrig page 11. b) un littral bas est form : d'une base, suivie d'un dise, suivi d'un entier bas (ventuellement suivi d'un point et d'un autre entier bas) suivi d'un deuxime dise (ventuellement suivi d'un exposant). exercice : crire le D.S. correspondant. c) un entier bas est une suite de chiffres gnraliss et de souligns (le soulign _ ne pouvant ni commencer ni finir l'entier bas, ni tre 2 fois conscutivement). exercice : crire le D.S. correspondant. d) un chiffre gnralis est soit un chiffre soit une lettre. exercice : crire le D.S. correspondant. e) un exposant est form d'un E (minuscule ou majuscule) suivi d'un entier dcimal (l'entier tant ventuellement prcd d'un + ou d'un -) exercice : crire le D.S. correspondant. f) un entier la mme dfinition qu'un entier bas (o l'on remplace chiffre gnralis par chiffre tout simplement). g) un littral dcimal est un entier (suivi ventuellement d'un . et d'un entier) ventuellement suivi(s) d'un exposant (voir le BNF dun entier pages 4 et 5). Exercice : crire le D.S. correspondant. Fin semaine 1 ! (4 heures de cours)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

8

Exercice n 1 (dbut semaine 2) Dans la liste ci-dessous dterminez tous les littraux illgaux et dites pourquoi ? Pour tous les littraux lgaux distinguez les entiers et les rels. Voir corrig page 10. a) e) h) k) 25.7 2#1101 e+7 b) .7 f) 3.14167_345678 g) i) 16#FFf# 2#111#e-1 c) 16E2 d) 16 e-2

13#ABCD# j) 1_0#1_0#e1_0

23.7e_7 l)

Exercice n 2 (tir de Barnes voir pages 79 83) : Quelle est la valeur dcimale des littraux numriques suivants (corrig page 10) : a) c) 16#E#E1 2#1.1111_1111_111#e11 b) d) 2#11#e11 16#F.FF#E+2

Les oprateurs Ada sur les numriques (littraux ou variables ; entiers ou rels)

Prliminaires Les oprations prdfinies applicables aux types entiers et/ou rels sont : + et * / + et rem mod abs ** oprateurs binaires (deux oprandes entiers ou deux oprandes rels) deux oprandes entiers ou deux oprandes rels division (idem *) oprateurs unaires (un seul oprande entier ou rel) reste de la division entire (oprandes entiers uniquement) le modulo (oprandes entiers) valeur absolue (oprateur unaire et oprande entier ou rel) exponentiation (le premier oprande est entier ou rel et le deuxime est entier)

Ces oprateurs sont donns ci-dessous par ordre de priorit croissante.

+ -

* /

+ - (unaires)

mod rem

abs **

Les quotients entiers : (exemples expliqus page suivante) 7 / 3 donne 2 (-7) / 3 donne -2 7 / (-3) donne -2 (-7) / (-3) donne 2

A = B * Q + R soit : A rem B A/B = Q

Car si on note : Q le quotient entier de A/B, on peut crire A = B*Q + Reste. (Reste se note rem en Ada) avec : A et B*Q sont de mme signe et abs (A) abs (B*Q)

D. Feneuille I.U.T. Aix 2001 (cours n1 Gnralits II fichier Cours1_B.DOC) 30/06/02

9

Les restes : (nots rem) consquence de la dfinition du quotient ci-dessus 7 rem 3 = 1 c'est vident mais les autres ? (-7) rem 3 = -1 car (-7 / 3) * 3 + R = -7 = (-2) * 3 + R 7 rem (-3) = 1 (-7) rem (-3) = -1 Remarques : Le signe du reste est toujours le mme que celui du premier oprande A (le dividende) Mettez les parenthses car rem est prioritaire sur loprateur unaire (page prcdente). car (7 / (-3)) * (-3) + R = 7 = (-2) * (-3) + R car ((-7) / (-3)) * (-3) + R = -7 = 2 * (-3) + R

Modulo : not mod (dfinition voir mathmatique notion de classes dquivalence !) n mod p (n + i * p) mod p (o i est un nombre relatif) exemple : 7 mod 3 10 mod 3 13 mod 3 etc..... 4 mod 3 1 mod 3 -2 mod 3 etc.....

Pour choisir LE reprsentant de la classe on arrte quand (n+ip) est inclus dans [0;p[ (si p>0) ou ]p;0] (si p suite dinstructions

| choix :

nom simple de composant

intervalle discret

expression simple

others

Cette structure permet de choisir entre plusieurs squences d'instructions pour plusieurs valeurs d'une expression discrte. C'est la valeur de l'expression discrte qui fixe la squence choisie. Une instruction choix multiple a la forme gnrale suivante (toutes les possibilits sont prsentes) : case expression is when valeur_1 => .......... when valeur_2 | ........... | valeurs_n => ........... when valeur_dbut..valeur_fin => ............ when others => ............. end case; Lexpression et les choix ou cas (conditions du when) doivent tre d'un mme type discret. Toutes les valeurs possibles de l'expression doivent figurer une fois et une seule. Le choix others doit tre utilis dans la dernire branche pour couvrir toutes les valeurs qui n'ont pas t donnes dans les alternatives prcdentes. Si toutes les valeurs ont t examins le choix others nest pas obligatoire. Si certains choix ne ncessitent aucune instruction, l'instruction null doit tre utilise. Rappelons que le type discret exclut les rels; ne pas confondre le type discret avec le type scalaire (qui regroupe type rels et type discret). D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

7Exemple : type T_MENTION is (MAUVAIS, PASSABLE, ASSEZ_BIEN, BIEN, TRES_BIEN);

NOTE LA_MENTION case

: INTEGER; -- dclaration pas terrible. : T_MENTION;

NOTE is when 0 | 1 | 2 | 3 | 4 when 5 | 6 | 7 | 8 when 9..12 when 13 | 14 | 15 when 16..20 when others

=> => => => => =>

LA_MENTION := MAUVAIS; LA_MENTION := PASSABLE; LA_MENTION := ASSEZ_BIEN; LA_MENTION := BIEN; LA_MENTION := TRES_BIEN; null; -- obligatoire car NOTE est -- dclare INTEGER!

end case; Autre exemple (plus intelligent !) : subtype T_UNE NOTE is INTEGER range 0..20; -- c'est mieux LA_NOTE LA_MENTION : T_UNE NOTE; : T_MENTION;

case LA_NOTE is when 0..4 when 5..8 when 9..12 when 13..15 when 16..20 end case;

=> => => => =>

LA_MENTION LA_MENTION LA_MENTION LA_MENTION LA_MENTION

:= := := := :=

MAUVAIS; PASSABLE; ASSEZ_BIEN; BIEN; TRES_BIEN;

La branche others n'est maintenant pas utilise, car toutes les valeurs du type numratif T_UNE_NOTE sont envisages. Ce ne serait pas une faute de laisser le others (mais il ne sert rien !).

Linstruction bloc :Voyons un bon exemple connu (lecture valide dun type discret cf. Paquetage P_E_SORTIE) : loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); VAR_DISCRET := T_DISCRET'VALUE(TO_STRING(CHAI)); exit; exception when others => null; -- ou message ECRIRE("xxxxx"); end; end loop; Linstruction bloc est, ici, encapsule dans une structure rptitive loop.

D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

8Le D.S. : instruction bloc :

nom simple de bloc

:

declare

partie dclarative

begin

suite dinstructions

exception

traite exception

end

;

nom simple de bloc

Le chemin minimum (obligatoire) est en trait plus gras! On remarque que lon peut nommer un bloc (comme pour une boucle loop ), que lon peut dclarer des objets momentanment (cest--dire dans la porte du bloc entre les begin et end). Le traitement dexception (compliqu) sera tudi en dtail dans le cours n8.

Dclarations des objets (pour aujourdhui : types, variables et constantes).Un des endroits privilgis pour dclarer ces objets est la partie dite dclarative dun bloc (voir ci-dessus) mais aussi dans la partie dclarative dune procdure ou dune fonction entre le profil et le begin (dbut du corps). On verra le D.S. de ces deux concepts au cours n5 voyons schmatiquement lendroit : procedure NOM_DE_LA_PROCEDURE is partie dclarative begin ........ end NOM_DE_LA_PROCEDURE; profil

corps de la procdure

Les dclarations de types (ou de sous types) sont prcds du mot cl type (ou subtype!). Les dclarations de variables commencent par lcriture de lidentificateur suivi de : , quant la dclaration dune constante elle a t vue en D.S. (constante universelle). Voyons dautres exemples : dclarations de constantes types : DIX_MILLE RACINE_2 DEPART VRAIE : : : : constant constant constant constant INTEGER FLOAT CHARACTER BOOLEAN := := := := 10_000; 1.414; A; TRUE;

les constantes universelles (absence de type) ont t vues : en illustration des DS au cours n1! D. Feneuille I.U.T. Aix 2001 (cours n3 fichier COURS3.DOC) 30/06/02

9dclarations de variables : CLASSE TAUX_TVA CARCOU NB_DE_LE : : : : BOOLEAN; FLOAT CHARACTER; T_COMPTEUR

:= 20.5; := 0;

On peut initialiser a priori la variable avec une valeur particulire (bonne habitude).

Quelques exercices faciles : (travaillez, prenez de la peine!)Exercice n 1 : Montrez que la squence suivante : for IND in 1..5 loop ..... traitement utilisant IND end loop; ne peut pas toujours se traduire par : IND := 1; while IND , =) si le type des < composants des tableaux est un type discret (ce qui exclut les rels ) et on a aussi loprateur de concatnation (&) voir exemple plus loin. De plus si le type des composants est un type boolen, alors les oprations comprennent aussi l'oprateur logique (unaire) not et les oprateurs logiques and, or, et xor. Oprateur d'galit (rgle) : Pour deux valeurs tableaux l'oprande de gauche est gal l'oprande de droite si pour chaque composant de l'oprande de gauche il existe un composant homologue de l'oprande de droite qui est identique. Oprateur de relation (rgles) : Un tableau vide sera toujours infrieur un tableau contenant au moins un composant. Pour des t ableaux non vides l'oprande de gauche est infrieur celui de droite ds que le premier composant de l'oprande de gauche est infrieur son homologue de loprande de droite. On peut donc comparer des tableaux unidimensionnels de tailles diffrentes mais de composants discrets (rappel !). D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

3Par exemple (les littraux chanes caractres tant aussi des tableaux !) : Anticonstitutionnellement est infrieur Zoulou ! cf. le dictionnaire ! de mme (et cest a priori plus surprenant) : 320 est suprieur 2999. Attention ne pas confondre avec les valeurs numriques 320 et 2999 ! Exemples (dclarations et utilisations) : type T_VECT_CAR subtype T_INDICE subtype T_MOTS PREMOT, MOTCOU : is array is is (POSITIVE range ) of CHARACTER;

POSITIVE range 1..20; T_VECT_CAR (T_INDICE);

T_MOTS;

PREMOT et MOTCOU sont alors des objets tableaux de 20 caractres indics de 1 20. Quelques exemples (ici 4 exemples) doprations possibles : PREMOT (11..13):= PREMOT (14) & MOTCOU (18..19); PREMOT(8) := PREMOT (2); if PREMOT (2..4) /= MOTCOU (4..6) Tranches diffrentes ! then ..... exit when MOTCOU (1..8) > MOTCOU (3..6);

Tableaux de tableaux.Exemples : type T_LIGNE is array (POSITIVE range ) of CHARACTER; subtype T_INDICE_COLONNE is POSITIVE range 1..80; type T_ECRAN is array (POSITIVE range ) of T_LIGNE (T_INDICE_COLONNE); subtype T_INDICE_LIGNE is POSITIVE range 1..24; ECRAN LIGNE On peut crire : : T_ECRAN (T_INDICE_LIGNE); T_LIGNE (T_INDICE_COLONNE); Notez bien : (3) (2) diffrent du multiindiage ( suivre)

ECRAN(2) ECRAN(3) (2)

:= LIGNE; -- 2ime ligne := 'A'; -- 3ime ligne et

2ime caractre

Remarque : le composant (dans un tableau de tableaux) est donc lui mme un tableau ! A la dclaration du tableau de tableaux le composant doit tre un tableau contraint.

Multi-indice.Une dclaration de type tableau peut faire intervenir plusieurs indices ( ne pas confondre avec le tableau de tableaux vu prcdemment). Notez la virgule entre les indices dans la parenthse. Cest traditionnellement en mathmatiques (ou analyse numrique) limplmentation idale pour travailler avec des matrices . Exemple : type T_MAT subtype subtype is array (INTEGER range , INTEGER range ) of FLOAT; is POSITIVE is POSITIVE : range range 1..20; 1..10; Notation MATRICE(3,2) pour utiliser la troisime ligne et deuxime colonne

T_COL T_LIG

MATRICE, MAT1, MAT2

T_MAT (T_LIG, T_COL);

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

4 Attributs portant sur les tableaux :Les attributs sont intressants pour travailler, a priori, avec des variables tableaux dont le type dindice est retard, plus prcisment pour travailler avec des paramtres tableaux non contraints. On verra cela ds le cours n5 avec les sous-programmes. Pour le moment on admettra que lon peut faire rfrence des travaux portant sur des objets tableaux non contraints cest--dire des tableaux dont la plage dindices nest p as encore fixe compltement. Cette plage sera fixe plus tard et on va, avec les attributs faire rfrence cette situation par anticipation ! Les attributs sont cependant aussi utilisables systmatiquement avec des objets (ou instances) de tableaux contraints. Mais ils perdent de leur puissance puisque la contrainte est connue. Liste des attributs permettant les oprations sur les tableaux (mais en fait ils portent sur les indices) : FIRST LAST FIRST(N) LAST(N) RANGE LENGTH RANGE(N) LENGTH(N) VECT_B et VECT_N sont dfinis et dclars page 2 !

FIRST rend la valeur de l'indice du premier composant. Exemple : VECT_BFIRST vaut A LAST rend la valeur de l'indice du dernier composant. Exemple : VECT_NLAST vaut 10 RANGE rend lintervalle des indices du tableau. Utile pour une boucle for. A voir plus bas. LENGTH rend le nombre d'lments du tableau (nombre effectif de composants). Exemple : VECT_BLENGTH vaut 20 (nombre dindices dans lintervalle A..T) Remarque importante : Les attributs portent sur les (ou font rfrence aux) instances de type tableau (c'est nouveau !1) mais ils agissent en fait sur le type des indices du tableau en question mais ... quand lindice sera contraint. On note toujours lopration avec lapostrophe mais le prfixe nest plus un type (comme au cours n2) cest (le plus souvent) lidentificateur du tableau. Dur, dur ! Voyons cela. Exemples : PREMOT'RANGE est l'intervalle entier 1..20 (type T_MOTS page prcdente) mais n'est pas identique T_INDICE car ce nest ni un type ni un sous type. De mme : PREMOT'FIRST vaut 1 et PREMOT'LAST vaut 20. Avec ces notations il n'est pas ncessaire de connatre ou de se rappeler l'identificateur (ici T_INDICE) du sous type intervalle d'indice contraint ! Si lon change la ligne suivante telle que : subtype T_INDICE is POSITIVE range 4..19;

sans modifier les autres dclarations on a alors respectivement les nouvelles valeurs 4..19, 4, 19 pour les trois attributs prcdents et 16 pour lexpression : PREMOTLENGTH. Attention : 'RANGE ne donne pas un type mais un intervalle (dj dit). Cest une erreur courante des tudiants. On ne peut pas par exemple crire PREMOT'RANGE'SUCC(IND) ni IND : PREMOT'RANGE; Si un tableau possde plusieurs indices (par exemple les objets prcdemment dclars MAT1 ou MAT2), il faut indiquer le numro de la dimension pour les 3 attributs FIRST, LAST et RANGE. Exemples : MAT1'FIRST(1) vaut MAT1'RANGE(2) vaut ou encore MAT1'LAST(1) MAT2'LAST(2)1

1 1..20

vaut vaut

10 20

Jusqu maintenant les attributs tait dnots sur des types (exemple : CHARACTERRANGE) D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

5 L'agrgation et les agrgats.C'est une opration spcifique aux types composites (ici donc sur les types tableaux). Elle est souvent utilise pour donner des valeurs initiales aux objets composs. On peut aussi lutiliser, dans lalgorithme, pour modifier des valeurs dun objet tableau. Il sagit, en fait, avec lagrgat, de littraux (comme on a pu le voir avec les autres types scalaires) mais cette fois ce sont des littraux tableaux (voir exemples plus bas). On travaille, avec lagrgation, sur le tableau en entier ou sur la tranche. Il est inutile de recourir aux agrgats pour initialiser un ou quelques composants isols car lagrgation oblige tous les citer. Lcriture dun agrgat ressemble celle dun numratif. Cest normal, car il faut numrer toutes les valeurs attendues. L'association (cest--dire la correspondance entre une valeur et un composant) ne doit tre faite quune seule fois dans lnumration. L'association se fait (il y a deux cas sexcluant) : 1) par position (dans lordre) TABLE(1..6):=(0,-2,7,4,5,-9); -- lordre est respect TABLE (3..5):=(5,8,12); 2) par nomination (on cite lindice puis la valeur associe aprs le symbole =>) TABLE(4..6):=(5..6 => 0,4 => 1); -- il ny a plus dordre TABLE(1..6):=(1..3 => 0,4..6 => 1); ou en ajoutant others (avec position ou avec nomination) mais une seule fois et la fin (voire seul !). TABLE TABLE TABLE TABLE TABLE : : : : : = = = = = (-2,4,9, others => 0); (others => 1);-- quivaut : (T_TABLE'FIRST..T_TABLE'LAST => 1); (1|3 => 0,2 => 1, others => 0); (1..3 => 1, others =>0);

On utilise le caractre | pour indiquer des positions non contigus. Attention dans les agrgats de tableaux on ne peut pas mlanger position et nomination. Les rgles de comportement ne sont pas simples. On va voir des exemples mais pour en savoir plus voyez une bonne rfrence : Barnes pages 123 128. Exemples quand le type tableau a plusieurs indices. type T_MATRICE(POSITIVE range , POSITIVE range ) of INTEGER; ici un double indice : MATRI : T_MATRICE(1..3,1..4); -- matrice de 3 lignes et 4 colonnes MATRI := (others => (others => 0));-- tout est mis zro ou autre initialisation (diffrente de la mise zro totale) : MATRI : = ((1,2,3), (4,0,0), (5,0,0), (6,0,0));

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

6ou initialisation quivalente : MATRI : = ((1,2,3), (4,others => 0), (5,others => 0), (6,others => 0));

ou, toujours identique : MATRI := ((1,2,3), (1 = > 4,2..3 =>0), (1 = > 5,2..3 =>0), (1 = > 6,2..3 =>0));

Les STRING (chanes de caractres) type prdfiniL'utilisation des types non contraints est une activit assez frquente, en particulier lorsque l'on manipule des chanes de caractres. Jusqu' maintenant nous avons vit de manipuler le type prdfini STRING et mme aprs lavoir dcouvert nous lui prfrerons le plus souvent le type Unbounded_String. Nous en reparlerons. Il est temps d'examiner ce fameux type chane de caractres prdfini Ada, c'est--dire le type STRING pour une critique srieuse on peut consulter le cahier pdagogique n 4 (fichier cahier4.doc dans le CDRom) mais la lecture pour un dbutant nest pas vidente ! Le type STRING est prdfini par les dclarations suivantes (qu'il ne faut pas crire ! Puisque prdfini ). Cette dclaration (prdfinie) est faite, comme toujours, dans le paquetage STANDARD (on est pri de consulter le polycopi paquetages . !) : subtype type POSITIVE is STRING is INTEGER range 1..INTEGER'LAST; array (POSITIVE range ) of CHARACTER;

On remarque ainsi que STRING est un type tableau de caractres non contraint ( cause du range ). Pour manipuler des variables du type STRING il faut tout d'abord contraindre les indices. Par exemple : subtype T_STR is STRING(1..80);

puis instancier les objets : A, B : T_STR; ou directement instancier avec un type muet A, B : STRING(1..80); -sous-type anonyme

ou ventuellement avec initialisation (rappel des agrgats!) : A, B : STRING(1..80) := (others => ' ' ); -- mis blanc !

On peut galement crire des constantes STRING donc types : E : constant STRING := ""; -- vide! F : constant STRING := (1..0 => 'a'); -- vide aussi! HELLO : constant STRING := "Bonjour"; Lintervalle dindice pour les constantes STRING est dduit de laffectation ! pour HELLO cest 1..7. Pour les deux autres cest 1..0 (intervalle vide) ! Les valeurs extrmes des indices sont rarement utiles retenir (pour les utiliser), car les attributs FIRST et LAST suffisent les nommer. Il est possible de ne pas commencer le premier indice d'un STRING par 1 (il suffit dimaginer la manipulation dune tranche !) mais cest une utilisation rare car peu pratique.

D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

7Remarque : Les oprateurs associs au type STRING sont ceux permis pour les types tableaux composants discrets (ce qui est bien le cas du type CHARACTER !) donc on a les 7 oprateurs =, /=, , = et & (concatnation de caractres). Premiers problmes (on verra plus tard cours n5 ceux des paramtres STRING) 1) La saisie dun STRING nest pas vidente. Il existe dans le paquetage Ada.Text_Io deux procdures : GET ( rejeter) et GET_LINE (plus pratique). On en reparlera dans le cours 5 bis sur les entres-sorties. Utilisez pour le moment le LIRE de P_E_SORTIE mais sachez quil y a un ajout despaces si la saisie ne sature pas la variable (cest--dire si lon na pas tap autant de caractres que linstanciation en a dclars). Il reste un problme si on a tap exactement le nombre de caractres dclars mais ceci est une autre histoire ! 2) Les oprations traditionnelles sur les chanes de caractres reviennent souvent manipuler des tranches de tableaux de caractres. Il est possible d'affecter une tranche de tableau une autre tranche de tableau mais il faut (affectation oblige !) des tranches de mme taille (pas forcment de mme plage dindices). Il faut donc connatre les intervalles de ces tranches. Ce n'est pas toujours le cas, de faon simple. Voyons un exemple : Comment affecter une chane une autre chane si on ne connat pas, a priori, sa longueur ? Soit lexpression trs utilise : T_JOUR'IMAGE (JOUR)vue au cours 2. Cette criture donne un STRING puisque cest le rsultat de lattribut IMAGE (voir aussi le document attributs prdfinis I : fichier attribut1.doc). Ce rsultat ne porte pas en lui sa longueur ! Et cest bien le problme ! Comment affecter cette chane une variable CHAINE_80 de type T_STR sans savoir le nombre de caractres ? En deux instructions : LONG_CHAINE := T_JOUR'IMAGE(JOUR)'LENGTH;-- rcupre la taille du STRING CHAINE_80 (1..LONG_CHAINE) := T_JOUR'IMAGE (JOUR); -- vraie affectation La premire calcule la longueur de la chane image , la deuxime fait laffectation dans une tranche. On utilise, hlas, deux fois lopration T_JOUR'IMAGE(JOUR). C'est peut-tre lourd mais fort puissant et ... dynamique (c'est dire non fig et s'adaptant toute variable !). Cependant CHAINE_80 nest pas sature despaces la fin et il faut retenir (mmoriser) la valeur LONG_CHAINE pour travailler plus tard avec la longueur utile ! Dur ! Pour aider les programmeurs susceptibles dutiliser les chanes de caractres STRING Ada met leur disposition des paquetages (ressources) trs utiles : Ada.Strings et Ada.Strings.Fixed (une trentaine de sous programmes connatre et voir dans le polycopi paquetages ). Il existe aussi un paquetage trs simple mais tout aussi utile pour le traitement des caractres : Ada.Characters.Handling ( voir aussi). Recommandation : On essaiera rapidement (surtout quand on utilisera des variables de type chanes de caractres) de se servir du type Unbounded_String (qui transporte la longueur utile avec la variable et qui est extensible sans limite) voir la ressource (paquetage) Ada.Strings.Unbounded (analogue au paquetage Ada.Strings.Fixed cit ci-dessus). Le type Unbounded_String est identique dans son comportement au STRING du langage PASCAL (o la longueur utile est transporte dans le STRING lui-mme et non limit 255 caractres !) Si, par exemple, on a dclar une variable : CHAINE : Unbounded_String; en lieu et place d'un STRING comme CHAINE_80, il suffit d'crire en une instruction seulement : CHAINE := To_Unbounded_String (T_JOUR'IMAGE(JOUR)); La longueur est gre implicitement ! Plus souple non ? De mme la saisie dun Unbounded_String est extrmement facile utiliser : CHAINE := Get_Line ; -- cest tout ! Avec cette instruction le systme attend la frappe dautant de caractres que vous voulez jusqu la frappe de la touche Entre (synonyme de fin de saisie). Le nombre de caractres transports par CHAINE peut tre connu tout moment grce la fonction LENGTH (sorte dattribut !) avec lexpression LENGTH(CHAINE). D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

8Exercice n2 du cours 2 (corrig) :with Ada.Strings.Unbounded_String, P_E_Sortie; procedure EXO2_TD2 is type T_MOIS is (JANVIER,FEVRIER,MARS,AVRIL,MAI,JUIN,JUILLET, AOUT,SEPTEMBRE,OCTOBRE,NOVEMBRE,DECEMBRE); subtype T_ANNEE is POSITIVE range 1582..9999; MOIS : T_MOIS; ANNEE : T_ANNEE; begin P_E_SORTIE.ECRIRE ("entrez le mois s.v.p.:"); -- modle de saisie d'un numratif (cf. paquetage P_E_SORTIE) loop declare use Ada.Strings.Unbounded_String; REPONSE : Unbounded_STRING ; begin LIRE(REPONSE) ; MOIS := T_MOIS'VALUE(To_String(REPONSE)); -- ici exception possible exit; -- ici tout va bien exception when others => ECRIRE("pas valable recommencez:"); A_LA_LIGNE; end; end loop; -- fin du modle de saisie d'un numratif -- test de la rponse if (MOIS = AVRIL) or (MOIS = JUIN) or (MOIS = SEPTEMBRE) or (MOIS = NOVEMBRE) then P_E_SORTIE.ECRIRE("ce mois a 30 jours"); elsif MOIS = FEVRIER then loop declare use P_E_SORTIE; begin -- pour l'exception ECRIRE(" entrez l'anne : "); LIRE(ANNEE);-- ici tout va bien exit;-- sortie de boucle exception when others => ECRIRE("non conforme entre 1582 et 9999"); A_LA_LIGNE; end; -- ici reprise de boucle end loop; if ((ANNEE rem 4 = 0) and then (ANNEE rem 100 /= 0)) or else (ANNEE rem 400 = 0) then Voir le fichier P_E_SORTIE.ECRIRE ("ce mois a 29 jours"); cahier1.doc else P_E_SORTIE.ECRIRE ("ce mois a 28 jours"); end if; else -- tous les autres mois P_E_SORTIE.ECRIRE ("ce mois a 31 jours"); end if; P_E_SORTIE.A_LA_LIGNE; end EXO2_SUP; -- tester srieusement (prparer un jeu de test dans un fichier)

Exercice sur cet exercice remplacer le if par un case (facile). Remarques : Notez les portes du use limite au bloc dans lequel il est dclar (il sagit dun effet de style pour dmonstration). Une anne bissextile est multiple de 4 sans tre multiple de 100 moins dtre multiple de 400. Ainsi 1900 nest pas bissextile tandis que 2000 lest. 2004 est bissextile (voir cahier n1.doc). Cet exercice est intressant car il propose et prsente un grand nombre de concepts et dcriture dinstructions et de dclarations Ada. A comprendre et consulter sans modration ! D. Feneuille I.U.T. Aix 2002 (cours n4 fichier COURS4.DOC) 30/06/02

1 Cours 5 Ada sous programmes (3 heures) semaine 4"La programmation est la branche la plus difficile des mathmatiques appliques". DIJKSTRA.

Thme : les sous programmes.Avec le concept de sous programmes nous allons largir nos connaissances en outils de gnie logiciel. Nous avons dj voqu le fort typage Ada comme composante de lart de produire du logiciel fiable. La structuration en sous programmes renforcera cette technique en llargissant considrablement. Les notions que nous allons voir sont en interaction forte avec le cours dalgorithmique puisque nous allons facilement implmenter les modules si chers la structuration modulaire dun algorithme. Ce faisant nous allons aussi commencer comprendre le concept de rutilisation mais partiellement cependant car il sera largement complt avec les paquetages et surtout avec la gnricit. Vus plus tard (cours n9), un peu de patience donc !

Lapproche modulaire (rappel ?)Nous en sommes, dans le module denseignement dalgorithmique vers la fin des exercices avec la machine Moucheron. Nous avons donc dj, de faon implicite mais aussi explicite, montr combien il tait commode de dcomposer un problme en sous-problmes allant du gnral au particulier. La lecture des fiches (notamment celle de WIRTH le pre du langage Pascal) nous y invite. Le principe est de concevoir son algorithme laide de structures de contrle rptitives, alternatives, de schmas squentiels dactions et de bloc de programmes (appels procdures, modules ou actions complexes). Sil est possible de glisser des assertions bien spcifiques aux endroits stratgiques on tend vers une conception de programmes optimum qui dans les annes 70-80 a t dnomme la programmation structure . Au dbut (en 1970) cette approche a t dune grande porte car auparavant on programmait de faon sauvage avec des outils tels que lorganigramme qui obligeait le langage dimplmentation utiliser le goto1, perfide instruction permettant de faire presque nimporte quoi. Vers les annes 1980 la programmation structure a montr ses limites cause surtout de la dimension impressionnante de certains logiciels (centaines de milliers dinstructions voire des millions !). La rutilisation grande chelle simposait et la modularit ntait plus suffisante, on allait vers la gnricit, la drivation de classes donc vers les objets . En 1983 Ada proposera avec les paquetages et la gnricit une premire tape : lapproche objet (par composition) nous nous y entranerons bientt. Puis autour de 1990 arrivent les langages objets tels Eiffel et C++2. Depuis 1995, et pour rester au top, Ada (renomm Ada95) permet les objets ainsi que de bien belles autres choses 3 (notamment pour la gestion et le temps rel) nous y reviendrons. Pour le moment restons modestes et voyons les lments de programmation modulaire.

Dune squence dactions au sous programme non paramtr.En nous appuyant sur une squence dj vue nous allons introduire simplement le concept de procdure qui sera approfondi ensuite. Soit le module de lecture dun objet LA_VALEUR dun type discret (schma bien connu prsent dans P_E_SORTIE) form dun loop engobant un bloc. loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); LA_VALEUR := T_DISCRET'VALUE(TO_STRING(CHAI)); exit; exception when others => null ou message !; end; end loop;

1

Les concepteurs de Ada, la mort dans lme (mais pour des raisons de conversion de programmes) ont, eux aussi, conserv lhorrible goto! 2 Respectivement : srement le meilleur (Eiffel) et videmment le plus utilis (C++) 3 Cest toujours lAda-tollah qui parle! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

2On a une structure rptitive ( cause des erreurs ventuelles) qui permet de recommencer la saisie et un bloc interne qui dclare chaque fois une variable UNBOUNDED_STRING qui est transforme aprs lecture en la valeur discrte quivalente (cette notion a t explique dans un cours prcdent). On dsire deux ou plusieurs endroits dun algorithme mettre en vre cette squence . Voyons le programme utilisateur EXEMPLE : u procedure EXEMPLE is Dclarations des ....... objets locaux la begin procdure EXEMPLE ...... loop declare Code ou begin instructions ....... dupliqus end; end loop; ...... ...... loop declare begin ....... end; end loop; ...... end EXEMPLE; On remarque bien les deux squences identiques qui gonflent anormalement lalgorithme. On va crire une fois pour toute la squence (mais ailleurs), lidentifier puis lutiliser en la nommant autant de fois que ncessaire sans la rcrire. Les .... marquent un peu partout dautres instructions possibles ou manquantes. Schmatiquement il vient : procedure EXEMPLE is ....... begin ...... ...... LIRE; ...... utilisation ...... ...... LIRE; ...... ...... end EXEMPLE; LIRE est dfinie quelque part (o ? A voir !) : procedure LIRE is begin loop declare begin ........ end; end loop; end LIRE

procedure LIRE is begin loop declare CHAI : UNBOUNDED_STRING; begin LIRE (CHAI); LA_VALEUR := ; exit; exception when others => null; end; end loop; end LIRE;

Amlioration de la procdure (ou module) LIRE qui scrit de faon plus dtaille a priori

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

3Aprs amlioration (explique plus loin) la procdure devient : On remarque la procedure LIRE is dclaration qui a CHAI : UNBOUNDED_STRING; chang de place begin loop begin surcharge de LIRE (CHAI); lidentificateur LA_VALEUR := T_DISCRETVALUE(TO_STRING(CHAI)); LIRE ( revoir) exit; ce nest pas le exception when others => null ou message ; mme ! end; end loop; end LIRE; La dclaration de la variable chane de caractres CHAI qui avait lieu chaque reprise de boucle peut tre faite une seule fois (partie dclarative de la procdure) nous y reviendrons. On verra aussi la notion trs importante en Ada de surcharge qui permet didentifier sans ambigut plusieurs objets avec le mme nom.

Quest-ce quun module (premire approche simple) ?Cest une entit de programme, en gnral simple (au sens o elle est susceptible dtre analyse isolment) que lon peut utiliser dans un programme (et mme plusieurs fois) voire rutilisable dans un autre programme. Par exemple dans les exercices dalgorithmique lincontournable SAUTER_LES_BLANCS. Mthodes et principes (comment faire et que faire?) Pour tre efficace la dcomposition en modules doit simplifier la conception et la ralisation de lalgorithme (vident !) mais aussi sa lisibilit (donc sa validation mme partielle) et enfin sa maintenance cest--dire son volution et son adaptabilit au cours du temps (vaste projet !). Pour parvenir toutes ces qualits il faut que chaque module soit sous -tendu par une ide claire (on parle dabstraction), ide elle-mme sous-jacente au problme initial. Il convient aussi que la prsentation du module ( lutilisateur potentiel) cest--dire sa dnomination soit explicite et associe des commentaires dcrivant la fonction interne (spcifications). La ralisation du module peut aussi parfaitement rester cache lutilisateur qui sintresse au pourquoi et pas au comment (notion de masquage et dencapsulation). Enfin le nombre de modules structurant un module plus gnral (voire lalgorithme lui-mme) doit tre raisonnable . Le nombre de 7 modules maximum est le plus souvent cit par les bons manuels ; cette valeur 7 ne vient pas dune quelconque croyance en la magie de ce nombre mais tout simplement dtudes faites par les cogniticiens sur les capacits de la mmoire grer efficacement des tches (tant sur le plan mnsique que cognitif). En terme de volume dinstructions par module on saccorde aussi ne pas dpasser (si possible) une page de listing (une cinquantaine de lignes) ou parfois une page dcran (un peu juste !). Un autre problme (plus ardu encore) est le critre de faible couplage. Quid ? On a vu que deux modules qui se suivent dans un algorithme taient en gnral dpendants lun de lautre (principe mme de la squentialit). Le faible couplage consiste minimiser le plus possible la dpendance entre les modules. Lidal serait quils soient totalement indpendants et alors ils pourraient mme sexcuter en parallle ! Voici en gros et en bref la technique de conception modulaire appliquer : Tenter disoler, de reconnatre les grandes ides . Prciser leur nature, leur rle. Les identifier pour les reprer et les retenir (faire un choix mnmonique). Soigner linterface entre les modules. Dcrire avec clart leur fonction ce qui permettra une meilleure comprhension. Enfin, et seulement aprs, analyser de faon plus fine le module en ritrant la mthode ou en recourant une dcomposition en squences de contrles lmentaires.

Ces choses l sont rudes, il faut pour les comprendre avoir fait des tudes. Victor Hugo.

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

4Droulement et enchanement des modules (utilisateurs et utiliss). Schmatiquement on a remarquables : procedure UTILISATRICE is .......(1) begin .... .... UTILISEE;(2) ...... (5) ..... end UTILISATRICE;(6) 6 points

procedure UTILISEE is ......(3) begin .... .....(4) end UTILISEE;

Les points importants ont t numrots soit : en (1) les variables dclares dans le module utilisateur (dites locales) sont cres (laboration) lexcution de la procdure UTILISATRICE. Les instructions sexcutent jusqu linstruction nomme UTILISEE (2), cet endroit logiquement on quitte la procdure UTILISATRICE (momentanment) pour excuter la procdure UTILISEE avec, de nouveau, laboration de variables locales (3) puis excution des actions jusquen (4), au retour vers la procdure UTILISATRICE il y a disparition des variables locales cres en (3)4; enfin on retourne excuter les instructions qui suivent lidentificateur UTILISEE de (5) jusqu (6) : fin de la procdure et fin des variables locales dclares en (1). Gnralisation et complexit : comme un bon dessin vaut mieux quun long discours voyons un exemple simple ? : procedure PRINCIPALE is ..... SPROG1; ... SPROG2; ... SPROG1; ... SPROG4; ... end PRINCIPALE; procedure SPROG1 is ... SPROG3; ... SPROG4; .. end SPROG1; procedure SPROG2 is ... SPROG4; ... end SPROG2;

procedure SPROG3 is ... ... end SPROG3; procedure SPROG4 is ... .... end SPROG4;

Lexcution de ces utilisations (ou appels) est dans lordre :PRINCIPALE, SPROG1, SPROG3, SPROG4, SPROG2, SPROG4, SPROG1, SPROG3, SPROG4, SPROG4.

Je vous laisse imaginer la complexit quil y a suivre donc comprendre lorganisation dutilisations plus professionnelles ce qui est le cas de tous les algorithmes vrais dignes de ce nom !

Le paramtrage.Introduction. Revenons notre problme simple du dbut savoir : lecture dun objet LA_VALEUR de type T_DISCRET. Compliquons : il ne sagit plus de lire 2 fois le mme objet LA_VALEUR mais de lire une fois cet objet et une autre fois un autre objet L_AUTRE_VALEUR mais tout deux de mme type T_DISCRET. En reprenant notre programme EXEMPLE on aurait deux fois la (presque) mme squence cest--dire la squence dite de lecture o changerait seulement la ligne daffectation de la chane lue CHAI la variable en question respectivement LA_VALEUR et L_AUTRE_VALEUR. Schmatiquement :

4

Cest la mme ide que pour le paramtre dune boucle for qui nexistait plus la sortie : end loop! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

5procedure EXEMPLE is ....... begin ...... loop declare begin ....... LA_VALEUR := ..... end; end loop; ...... ...... loop declare begin ....... L_AUTRE_VALEUR := .... end; end loop; ...... end EXEMPLE;

code presque identique

Lide (pour factoriser) reste la mme : crire une seule fois la procdure LIRE et lutiliser souvent. Le problme cest de ne plus nommer la variable ( lire) de son vrai nom (impossible puisquil change !) mais dutiliser un nom formel (cest--dire abstrait sans signification particulire) et de lui substituer au moment de lutilisation le nom effectif qui doit remplacer le nom formel. Cest la notion de procdure paramtre. On parle alors de paramtre formel et de paramtre effectif (on verra comment seffectue lassociation). Schmatiquement (mais on reviendra l dessus) : procedure EXEMPLE is ....... begin ...... ...... LIRE(LA_VALEUR); ...... ...... ...... LIRE (L_AUTRE_VALEUR); ...... ...... end EXEMPLE;

procedure LIRE (V_Formel : ...) is CHAI : UNBOUNDED_STRING; begin loop begin .... V_FORMEL := ... ; ... end; end loop; end LIRE;

La procdure LIRE est dfinie ( droite) avec un paramtre formel nomm ici V_FORMEL et elle est utilise ( gauche) avec des paramtres effectifs (respectivement LA_VALEUR et L_AUTRE_VALEUR). On dit que lon a rendu paramtrable lobjet sur lequel portait lalgorithme (il nest pas fig mais dynamique). Attention cette faon de procder convient pour des objets de mme type (ici discret). La question (la bonne question !) est : ne pourrait-on pas faire la mme chose avec des objets diffrents et de type diffrent ? La rponse (la bonne rponse Ada !) est oui (mais cest la gnricit) patience a viendra !

Caractristiques dun objet par rapport un module.En algorithmique on a observ que des assertions bien places aux endroits stratgiques permettaient de mieux comprendre leffet (la fonction) du module. Les bons endroits se situent au dbut (antcdent) du module et la fin (consquent). En effet si lon ramne la description du module (au moment de lutilisation) son identificateur on peut lire la squence suivante : D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

6assertions avant NOM_DU_MODULE assertions aprs traduit en Ada : -- commentaires sur lantcdent NOM_DU_MODULE; -- commentaires sur le consquent Les assertions (ou leur traduction en commentaires programme) doivent porter sur les objets intressants au dbut : sur les objets utiles, ncessaires au module pour sa mise en vre (on parle dobjet donne) cest u lantcdent. la fin : sur les objets que le module a modifis ou initialiss (on parle dobjet rsultat) cest le consquent. Quand un objet se trouve tre, la fois, un objet donne et un objet rsultat on parle dobjet donne-rsultat tout simplement. Lobjet apparat dans lantcdent et le consquent. la lecture compare des assertions autour de lutilisation du module aide comprendre son effet

La grande scurit (le meilleur contrle) pour une programmation optimale est de transmettre systmatiquement les objets donnes et les objets rsultats en paramtre du module (sous-programme). Donc en Ada, les objets intressants seront mis entre parenthses : soit de faon formelle dans la dfinition de la procdure soit de faon effective dans lutilisation de la procdure. Ainsi la lisibilit et le contrle se trouvent facilits. Mais comme cest une activit trs contraignante alors beaucoup de programmeurs la transgressent un peu 5. Dailleurs on pourra remarquer que dans les exercices dalgorithmique nous avons trop nglig cette systmatisation (faute de pratique et faute de connaissance sur le sujet il est vrai !). On peut remarquer que les objets donnes (exclusivement donnes) ne sont pas modifis par le module (ou plutt ne devraient pas ltre). De mme les objets rsultats (exclusivement rsultats) ne sont que modifis on ne sintresse pas leur valeur lentre du module. En Ada le programmeur est oblig de marquer la caractristique (appel mode dutilisation) du paramtre : donne avec in, rsultat avec out ou donne-rsultat avec in out et ceci dans la dfinition du module cest--dire dans la liste des paramtres formels. Cette contrainte permet au compilateur de vrifier quaucun paramtre formel annonc in (donc donne) ne se trouve gauche du signe := cette vrification est, notez le, dune grande scurit. En effet, dans la conception de lalgorithme vous postulez quun objet est donne et vous le signalez en mettant in puis vous transgressez cette hypothse dans la programmation en mettant cet objet gauche dun signe daffectation par exemple. Donc de deux choses lune : ou vous avez mal programm ou bien votre hypothse est fausse : Ada vous le signale dans la phase de contrle syntaxique (cest--dire ds la premire tentative dimplmentation). On a l une erreur de type conceptuel signale la compilation 6. De mme aucun paramtre formel out (donc rsultat) ne devrait se trouver droite du signe := cette proprit tait contrle avec la version 83 de Ada elle ne lest plus (hlas) avec la nouvelle norme : une variable rsultat peut donc tre consulte ! Si elle nest pas initialise cest la catastrophe ! Il ny a aucun contrle syntaxique sur les objets de caractristique in out ce qui est normal.

Variables globales, variables locales dun module.Notez, avant tout, que la proprit nomme globale ou locale pour une variable est une notion relative et sapplique par rapport un module particulier ; par exemple un objet peut tre local un module et peut tre global par rapport un autre module comme on va le voir dans des exemples. Variable locale : Une variable est locale un module lorsquelle nexiste pas avant la mise en vre du module (donc avant u son utilisation) et quelle est utile au module. La variable locale est solidaire de son module. On dit que sa porte est circonscrite au module, dailleurs la variable locale est dclare dans le module, elle prend naissance (laboration voir ce terme dans le glossaire : fichier glossaire.doc) avec lutilisation du module et elle disparat avec le module quand celui-ci est achev.5 6

et pour dautres cest beaucoup, voire passionnment! Alors quil faudrait : pas du tout! cest beau Ada! D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

7Une variable est dite globale un module quand elle nest ni locale, ni paramtre du module. Elle existe avant la mise en vr e du module, elle est utilise et/ou modifie dans le corps du module et elle existera encore u aprs lutilisation du module. Ce sont en fait des donnes-rsultats non signales. Ce sont des variables extrmement dangereuses pour la qualit du logiciel. On contrle trs mal leur effet puisquelles sont modifiables tout moment. On parle deffet de bord devant une modification intempestive et mal contrle dune variable globale. La qualit dun logiciel pourrait se mesurer (entre autres choses) son nombre minimum de variables globales. En algorithmique CARCOU tait (hlas !) un objet global ! On a lallure gnrale suivante (dclaration et dfinition dune procdure) : panorama et explication des paramtres

procedure S_P (liste des paramtres formels) is .... dclaration des variables .... locales la procdure begin ...... ...... end S_P; Exemple simple :

porte des variables locales; les variables qui ne sont ni locales ni paramtres et utilises ici sont globales DANGER!

On dsire crire un module COMPTER qui, dans un objet chane de caractres (STRING), va compter le nombre doccurrences dun caractre particulier. En Ada on crirait les spcifications de la procdure ainsi (on est toujours du ct formel) : procedure COMPTER (CAR : in CHARACTER; VEC : in STRING; NB : out NATURAL); Il est clair que : seule est intressante la valeur du caractre CAR chercher donc cest une donne in de mme le vecteur VEC nest pas modifi et seul son contenu nous intresse in enfin le nombre de caractres NB trouv est typiquement un rsultat out Pour lutilisation on pourrait mettre en vre la procdure avec des objets vrais ou effectifs qui u remplaceront les objets fictifs ou formels ainsi : COMPTER (L,PREMOT(1..12),NB_DE_L); COMPTER (A,MOTCOU(4..10),NB_DE_A); Paramtres effectifs

Notez : les points virgules sparent les paramtres formels, les virgules sparent les paramtres effectifs, le point virgule aprs la dclaration de COMPTER (ici ce nest pas une dfinition). Il annonce seulement le profil de la procdure. La dfinition, qui reste faire, est caractrise par le remplacement du point virgule par un is suivi du bloc comme on va le voir plus loin sur les diagrammes syntaxiques (corps ). La taille des tranches de PREMOT et de MOTCOU sont diffrentes. Voir la ralisation (page 15) de COMPTER Autre exemple de procdure paramtre bien connue (TD n2 page 4 algorithmique) : procedure NB_DE_CARAC (CAR : in CHARACTER) is begin COMPTEUR := 0; loop exit when FIN_RUBAN; LIRE; if CARCOU = CAR then COMPTEUR := COMPTEUR + 1; end if; end loop; ECRIRE_COMPTEUR; end NB_DE_CARAC; CARCOU et COMPTEUR sont hlas globales, il ny a pas de variables locales, CAR est paramtre donne. D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.DOC) 30/06/02

8 Les sous -programmes Ada (dtails).On vient de voir quun sous programme est crit afin de rsoudre un sous-problme apparu lors de l'analyse dun problme plus gnral. Il peut donc tre mis au point sparment et, au besoin, se diviser lui-mme en sous-programmes. Un sous-programme est appel une unit de programme donc peut tre rutilis dans d'autres programmes. Les sous-programmes peuvent tre regroups de manire logique avec d'autres sousprogrammes ou d'autres entits dans un paquetage (exemple : P_E_SORTIE) voir dtails au cours n 7. Il existe deux sortes de sous-programmes : les procdures. les fonctions. Un sous programme, comme toute entit du langage : constantes, type, variables ... etc. (on verra dautres entits), est introduit par une dclaration. Cette dclaration de sous programme apparat, en gnral, dans une partie dclarative soit dun autre sous-programme soit dun paquetage soit dune autre unit. L'criture d'un sous-programme se fait (devrait se faire) en deux tapes spares : dclaration du sous-programme c'est--dire son en-tte (profil ou spcification). dfinition du sous-programme avec prsentation de son corps (ou ralisation).

Spcification de sous-programme. Une spcification de sous-programme constitue l'interface entre le sous-programme et les units utilisatrices de ce sous-programme. La spcification prcise ce qu'il est ncessaire de savoir pour utiliser le sousprogramme. Son nom, la liste de ses paramtres (paramtres formels), plus prcisment : leur identificateur, leur mode dutilisation (caractristique) et leur type, enfin le type de lobjet retourn dans le cas d'une fonction. Cet ensemble d'informations est unique et s'appelle le profil du sous-programme. Mais la spcification ne dit rien sur ce que fait le sous-programme. Un commentaire srieux permettra de complter la spcification. La spcification est llment essentiel de la dclaration du sous programme cest un contrat. Exemples de spcifications : procedure PLACER (LIGNE, COLONNE : in T_COORDONNEE); -- positionne le curseur sur un cran procedure TRIER (A,B : in FLOAT; MIN,MAX : out FLOAT); -- trie deux nombres A et B: MIN le plus petit, MAX le plus grand function "*" (X,Y : in MATRICE ) return MATRICE; -- effectue le produit de deux matrices (hard !) function LE_PLUS_GRAND (A,B : in FLOAT) return FLOAT; -- MAX ! -- action identique lattribut MAX ! spcification de sous programme :

procedure

dsignateur

partie formelle

function

dsignateur

return

marque de type

partie formelle

D. Feneuille I.U.T. Aix 2002 (cours n 5 fichier COURS5.D