MASTER ACADEMIQUE
Transcription
MASTER ACADEMIQUE
N° d‟ordre : N° de série : République Algérienne Démocratique et Populaire Ministère de l’Enseignement Superieur et de la Recherche Scientifique UNIVERSITÉ D’EL-OUED HAMA MAKHDHER FACULTÉ DES SCIENCES ET DE TECHNOLOGIE Mémoire de fin d’étude MASTER ACADEMIQUE Domaine: Mathématiques et Informatique Filière: Informatique Spécialité: Systèmes Distribués et Intelligence Artificielle Présenté par: Melle KEDADRA Roua Melle REZZAG BARA Intissar Thème Les approches formelles pour les applications JAVA Soutenu le 04 juin 2015 Sous la supervision de : Mr. Meftah Mohammed Charaf Eddine Année universitaire 2014 – 2015 Remerciements Avant tous, je remercie Allah le tout puissant de m’avoir donné le courage et la patience pour réaliser ce travail malgré toutes les difficultés rencontrées. J’adresse mes vifs remerciements à mon encadreur Mr.Charaf aldine MEFTAH pour son effort et ses conseils Mes remerciements s’adressent aussi à tous les enseignants et les professeurs qui ont contribué à ma formation et à tous ceux qui m’ont aidé pendant la réalisation de ce travail. Aussi à mes collègues de la promotion 2014-2015 Master Informatique Je remercie également tous ceux qui ont participé de près Ou de loin à élaborer ce travail. Enfin, je remercie les membres du jury qui ont bien accepté de juger et d´évaluer ce travail. 2 Dédicaces Je remercie tout d’abord notre dieu tout puissant J’ai tant rêve du jour ou je pourrais réaliser une de mes ambitions et celle de mes très chers parent, à cette occasion j’en profite pour dédier mon travail avec un très grand plaisir : A l'âme de mon grand-père cher,je t'aime je te souhaité le paradis et la miséricordede Dieu Tout-Puissant. A ma grand-mère , Dieu protège et vous guérir, et la longueur de votre âgemameilleur grand-mère. A ma mère, Est la plus belle et la meilleure et la mère de nostalgie sur la terre je vous remercie de veiller pour moi et tous les sacrifices que je le dis: Je t'aime tellement, ma chère mère et cher vous êtes vraiment merveilleuxje vous souhaite la santé et la longévité et bonheur. A mon père, Merci, cher père sur tout ce que vous loin, mais sera toujours près de moi, je vous souhaite la santé et la longévité. A mon seul oncle, Abd.Alrazak Merci à vous et je vous souhaite la santé. A mes tante,Fatiha, Salima, Karima, Saida, kaltoum, Meriem. A mes oncles, P.Mohamed , Hachani , khazani , Nouri , Lmouldi , Mohamed Et Tous leurs maris, leurs enfants, et leurs filles chacun de son nom. A mes fréres et mes soeurs, spécialement Tamadheret son mari Mohamed, YoucraKhadija, Mohamed,Tasnimet surtout les bébé : Nouhet Abd.Alkader Et : Bachir et son marie Hanan et ton bébé Moudi, Asma, brahim et son mari Rima, Sara,Oussama, Chaima, Chaima, Manelet son mari Ahmed et tes filles : Riham , Rinad , Ritan. Et Bachir , Oussama , Abir , Samah, Youcra, Amani. A mon fiancé, Yahia et tout les familles. A mon binome , Wouroud qui a fournit des efforts immeenses. A mes cher Amis,Wouroud ,Safa ,Iintissar , Nadjah, Insaf , Imane , Intissar.K. j'aime très beaucoupW.ROSANA.I4. A toute la promotion informatique 2013. 3 J’en suis vraiment reconnaissante. Roua Dédicaces Avant tous, je remercie dieu le tout puissant de m’avoir donné le courage et la patience pour réaliser ce travail malgré toutes les difficultés rencontrées. Je dédie notre ouvrage à : Ma très chers parents adorés qui m‘ont fait bénéficier, grâce à leur invocation et à leur bénédiction, à avoir la confiance et l'espoir au cours de la rédaction de ce travail. Je le dédie aussi A mes souers: Soumaia, Meriem, Haifa, Malak. A mes frères : Yacine, Haitham, Med Iyade. A mon grand-père, mes tantes et leurs enfants. A mes oncles et leurs enfants Et à toute la famille. A mon binome Roua. A mes meilleurs amis : najah, intissar, amira, insaf, safa, wouroud, imane. A tous les étudiants de la faculté Informatique surtout les étudiants de la 2ième année master promotion 2015 Intissar 4 Résumé Le langage java est une technologie récente et un domaine de recherche très actif, en particulier par sa capacité étonnante de modélisation des différents types de systèmes. Cependant, le potentiel des systèmes Multi-Agent ne devrait pas cacher les difficultés liées à la conception et la vérification des systèmes Multi-Agents qui peuvent causer la crédibilité scientifique de ce domaine. Dans le but de pallier ce type de problème, il devient donc crucial d'avoir des méthodes rigoureuses de spécifications et de vérification formelles pour assurer le développement sûr des systèmes Multi-Agents. Notre projet de recherche s'inscrit dans ce contexte et nous tentons de vérifier un ensemble de propriétés pertinentes des systèmes Multi-Agents, en se basant sur l‟utilisation de la logique de réécriture et la technique de vérification formelle Mots clés : langage java, méthode formelle, méthode B, java swing, la validation, atelier B, la logique, machine abstraite. 5 Abstract Java is one of the modern technology and an active area of research, particularly through the amazing ability to model different types of system. However, the possibilities owned by the Java language that does not hide the difficulties relating to the design and verification of these systems that can cause the scientific credibility of this area, and from here we consider the formal approach is to treat the complexities of programs, through verification of software and available applications. In order to overcome these difficulties, it is important to have strict formal methods of verification and specifications to ensure the safe development of the use of the B method. In this context, our research falls in the attempt to convert a specific application and is limited to the language of Java to B method and to ensure the investigation and a set of properties for this application through specific conditions with respect to the arrangement of the modeled well free of errors. Our research falls in the attempt of proposing a formal approach for java application. Keywords: java language, formal method, B Method, validation, abstract machine. 6 ملخص لغةةةةةح جافةةةةةا تعتثةةةةة هةةةةةي التكٌْلْجيةةةةةا الحديثةةةةةح ّهٌطقةةةةةح ًشةةةةةطح فةةةةةل ه ةةةةةا خةةةة القةةةةد ج الوذُلةةةةةح لٌوذجةةةةح أًةةةةةْا هختلفةةةةح هةةةةةي الٌظةةةةامّ .هةةةةك ,لةةةةة الثحةةةةةْ ّال سةةةةةيوا هةةةةةي فةةةة ى إهكاًيةةةةةاخ التةةةةل تولكِةةةةةا لغةةةةةح جافةةةةةا ال تخفةةةةةل الصةةةةةةعْتاخ الوتعلقةةةةةح تالتصةةةةةوين ّالتحقةةةةة هةةةةةةي ُةةةةةذٍ االًظوةةةةةح التةةةةةل يوكةةةةةةي أى تسةةةةةثة الوْثْقيةةةةةح العلويةةةةةح لِةةةةةذا الو ةةةةةا ّ ,هةةةةةي ٌُةةةةةا ا تث ًةةةةةا الةةةةةٌِس ال سةةةةةول ُةةةةةْ لعةةةةة الث اهس هي خ تعقيةةةةةداخ التحق هي الث ه ياخ ّالتطثيقاخ الوتاحح. هةةةةةةةي أجةةةةةةة التغلةةةةةةةة لةةةةةةة ُةةةةةةةذٍ الوشةةةةةةةكلح يصةةةةةةةث هةةةةةةةي األُويةةةةةةةح أى تكةةةةةةةْى أسةةةةةةةالية صةةةةةةةا هح ّهْاصفاخ سويح للتحق ّ لضواى التٌويح اآلهٌح تاستعوا الط يقح -ب- فةةةةل ُةةةةذا السةةةةياا يٌةةةةد تحثٌةةةةا فةةةةل هحاّلةةةةح تحْيةةةة تطثيةةةة هعةةةةيي ّ هحةةةةدّي هةةةةي لغةةةةح جافةةةةا الةةةةل ط يقةةةةةةح -ب ّ -التأكةةةةةةد ّ التحقيةةةةةة هةةةةةةي ه وْ ةةةةةةح الخصةةةةةةا هحديج هك احت ام الت تية لوذجتَ تشك جيد خا هي األخطاء. الكلمات المفتاحية :الط يقح ال سويح الط يقح -ب -التحق هي صحح. 7 لِةةةةةةذا التطثيةةةةةة هةةةةةةي خةةةةةة ةةةةةة ّط Sommaire Glossaire ................................................................................................................. 10 01 Listes des figures et des tables ..............................................................................11 00 Introduction ............................................................ Error! Bookmark not defined. 1.Contexte général et Problématique...................... ................................................. 13 2.Objectifs............. ................................................................................................... 14 3. L'organisation du mémoire……………………………………………………... .................................................................................. Error! Bookmark not defined. Chapitre I: La Langage JAVA I.Introduction ……………………………………..………………………………...16 II.La Logique Réécriture.... ...............................................Error! Bookmark not defined. II.1. Théorie de réécriture ......................................................................................... 16 II.2. Les systèmes de réécriture conditionnels ......................................................... 17 II.3. Règles de Déduction ........................................ Error! Bookmark not defined. II.4. Réécriture concurrente ...................................... Error! Bookmark not defined. II.5. Langages Basés sur la Logique de Réécriture .................................................. 19 III.Système Maude .... .........................................................Error! Bookmark not defined. III.1. Les caractéristiques du Maude ....................... Error! Bookmark not defined. III.2. Différents Modules de MAUDE ..................... Error! Bookmark not defined. III.2.1.Modules Fonctionnels................................ Error! Bookmark not defined. III.2.2.Modules systèmes ...................................... Error! Bookmark not defined. III.2.3.Modules orientés objet............................... Error! Bookmark not defined. IV.Exécution et Analyse formelle sous Maude.... .........Error! Bookmark not defined. IV.1. Analyse formelle et vérification des propriétés ............. Error! Bookmark not defined. IV.2. Le Model Checker LTL de Maude ................. Error! Bookmark not defined. V.Conclusion................. ..................................................................................................... 38 8 Chapitre II: La méthode formelle I.Introduction........................................................................Error! Bookmark not defined. II.Méthodes de Vérification des systèmes… ..................Error! Bookmark not defined. II.1 Méthodes Classiques ........................................ Error! Bookmark not defined. II.2 Méthodes Formelles ......................................... Error! Bookmark not defined. III.Model-Checking………………………………………..……………………..... Error! Bookmark not defined. III.1. Principe ........................................................... Error! Bookmark not defined. 35 III.2. Concepts liés par Model-checking ................ Error! Bookmark not defined. III.3. Quelques Model-Checkers .............................. Error! Bookmark not defined. III.3.1. SMV (Symbolic Model Verifier) ............. Error! Bookmark not defined. III.3.2. SPIN.......................................................... Error! Bookmark not defined. III.3.3. LTL de MAUDE ...................................... Error! Bookmark not defined. IV. Le Model Checker LTL de Maude ...........................Error! Bookmark not defined. V.Conclusion...................... .................................................Error! Bookmark not defined. Chapitre III: Méthode B I.Introduction ....................... .............................................Error! Bookmark not defined. II.Agent................................. .................................................Error! Bookmark not defined. II.1. Définition .......................................................... Error! Bookmark not defined. II.2. Caractéristique d'un agent ................................ Error! Bookmark not defined. II.3. Types des agents ............................................... Error! Bookmark not defined. II.3.1. Les agents cognitifs ................................... Error! Bookmark not defined. II.3.2. Les agents réactifs ..................................... Error! Bookmark not defined. II.3.3. Les agents hybrides ................................... Error! Bookmark not defined. III.Système Multi-Agent.....................................................Error! Bookmark not defined. III.1.Définition ......................................................... Error! Bookmark not defined. III.2. La Communication dans les Systèmes Multi-Agents ... Error! Bookmark not defined. 9 III.2.1.Les Modes de Communication .................. Error! Bookmark not defined. IV.Applications des systèmes Multi-agents ...................Error! Bookmark not defined. V.Spécification Formelle des Systèmes Multi-Agents .Error! Bookmark not defined. VI.Conclusion……………….. ...........................................Error! Bookmark not defined. Chapitre IV: Eude de cas et Implémentation I.Introduction........................................................................Error! Bookmark not defined. II.Méthode de vérification .................................................Error! Bookmark not defined. II.1. Spécification du système .................................. Error! Bookmark not defined. II.1.1 Spécification du Modèle ............................. Error! Bookmark not defined. II.1.2 Spécification des propriétés du système ..... Error! Bookmark not defined. II.2. Spécification des propriétés à vérifier .............. Error! Bookmark not defined. II.3. Processus de vérification .................................. Error! Bookmark not defined. III.Définition des propriétés à vérifier ............................Error! Bookmark not defined. IV.Conclusion…………………………………………………………………..…... Error! Bookmark not defined. Conclusion générale... .........................................................Error! Bookmark not defined. Annexe I ……………. .........................................................Error! Bookmark not defined. Annexe II …………….. ......................................................Error! Bookmark not defined. Bibliographie……………….. ........................................................................................... 88 Webographie………………..............................................................................................111 88 01 Liste des figures et des table Chapitre I Figure I.1 : Représentation graphique des règles de déduction .................................... 22 Chapitre II Figure II.1 : Principe du model checking. ........................................................................ 35 Figure II.2 : Exemple de structure de Kripke. ............................................................ 37 Figure II.2 : L‟architecture du model-checker de MAUDE. ...................................... 38 Chapitre III Figure III.1 : Architecture d'un agent cognitif. ......................................................... 46 Figure III.2: Architecture d'un agent réactif. .............................................................. 46 Figure III.3 : Système Multi-Agents. ......................................................................... 48 Figure III.4: La technique du tableau noir. ................................................................. 49 Figure III.5 : Communication par envoi de messages. .............................................. 50 Tableau III.1: Différence entre les agents cognitifs et réactifs................................... 47 Chapitre IV Figure IV.1 : Approche de Spécification et Vérification................................................ 56 Figure IV.2 : L'ordonnancement d'activité. ...................................................................... 57 Figure V.5 : Modèle d'état de transition d‟un Agent communicant ........................... 65 Figure V.6: Résultat de vérification d'absence d'interblocage –Maintenance–........... 70 Figure V.7: Résultat de vérification d'absence de famine ........................................... 70 00 Figure V.8: Résultat de vérification l'état d'arrêt du système...................................... 71 Figure V.9: Modèle d'état de transition d‟un agent communicant –corrigé-. ............ 74 Introduction générale 02 A vec l'évolution exponentiel des systèmes industriels et le besoin des systèmes informatique robustes, le développement des produits logiciels est devenu une tâche très difficile et sa complexité n'a qu'accroître. Par conséquent, le développement des produits logiciels fait appel à plusieurs techniques et méthodes dont l'objectif est d‟assurer la bonne qualité du produit final, respecter les délais et de minimiser les coûts de développement. En effet, depuis la crise de génie logiciel dans les années 60s, plusieurs efforts ont été inventés pour améliorer ces techniques et méthodes de développement. Le but était de répondre aux critères imposés par le marché du logiciel. Les méthodologies Orientées objet, les langages de programmation, les outils formels, les ateliers logiciels, sont des variantes de ces efforts. 1. Contexte général et Problématique : La construction de systèmes de qualité tout en respectant les contraintes de temps et de budget représente un formidable défi pour les informaticiens. Dans les domaines où la sécurité des personnes et des biens est en cause, ce défi est encore plus grand. Une des approches proposées pour résoudre ce problème consiste à utiliser des outils mathématiques pour spécifier, valider et vérifier les systèmes informatiques. On désigne communément ces approches basées sur les mathématiques comme des méthodes formelles. Le choix des mathématiques s‟explique par le besoin de rigueur et de précision dans la description du comportement de systèmes complexes, et par la nécessité de disposer de mécanismes d‟abstraction pour juguler la complexité. Les méthodes formelles permettent également de palier aux faiblesses des méthodes traditionnelles de tests qui ne peuvent traiter de manière exhaustive tous les cas possibles d‟utilisation d‟un système. Après plus de trois décennies de recherches, la communauté scientifique a proposé plusieurs méthodes formelles de construction de systèmes. Certaines d‟entre elles sont maintenant utilisées pour concevoir des systèmes en milieu industriel comme le transport, les télécommunications, l‟énergie nucléaire, les circuits intégrés et les appareils médicaux. Toutefois, l‟utilisation de méthodes formelles demeure peu 03 répandue, et leur utilisation à grande échelle nécessitera encore plusieurs investissements au niveau de la recherche, mais également au niveau de la formation des informaticiens. Il y a beaucoup de dangers sont causés par des erreurs dans les grandes applications. Et nous avons consacré de mentionner le langage Java, a un large éventail de domaines dans leur application, et est l'une des langages communes et complexe, avec le grand développement de la technologie de notre temps, est devenu le langage Java manque de précision, et ne donne pas suffisamment de résultats dans les grandes applications logicielles (telles que les applications sur le train et avion) et pour cela, nous avons proposé une méthode de résoudre ces complexités et de donner le débogueur de programme et précise. 2. Objectifs: Le but de ce travail est de transformer une application (java) à méthode B, pour valider un cette système et aucun erreurs Spécification formelle; raffiner et implémenter une spécification. 3. Organisation du mémoire: Cette thèse se compose de quatre chapitres, qui sont organisés comme suit : Chapitre I: est consacré à l‟étude le langage java et leur composition pour mieux comprendre les concepts de base de cette technologie. Chapitre II: Nous commençons ce chapitre par décrire une présentation des approches formelles et leur type … Ensuite nous étudions une classification de ces approches selon leurs fonctions et leur mode de fonctionnement et l‟avantages et l'inconvénient. Chapitre III: ce chapitre est le cœur de notre travail. Dans ce chapitre nous allons présenter notre approche formelle (méthode B) pour la validation formelle, et transformer le code java à cette méthode (méthode B). Chapitre IV: Dans ce chapitre nous présentons une étude de cas et implémentation pour valider notre travail. Et enfin nous terminons par une conclusion et des perspectives de notre travail. 04 Chapitre I: Langage JAVA 05 I. Introduction : Dans ce chapitre nous allons étudier le langage de programmation Java, est une approche interdisciplinaire pour le programme traditionnel. En utilisant plusieurs approches qui mettent l'accent sur l'abstraction de données. Une caractéristique clé du chapitre est la manière dont nous motivons chaque concept de programmation en examinant son impact sur les applications spécifiques. Ainsi, nous allons en apprendre davantage sur la façon de les utiliser, Les notions et les techniques de base en Java, Les caractéristiques, les instructions des bases JAVA et Développement des interfaces graphiques...etc II. Les bases du langage Java : II.1. représentation de java: Java est un langage de programmation à usage général, évolué et orienté objet dont la syntaxe est proche du C. Ses caractéristiques ainsi que la richesse de son écosystème et de sa communauté lui ont permis d'être très largement utilisé pour le développement d'applications de types très disparates. Java est notamment largement utilisée pour le développement d'applications d'entreprises et mobiles. Les différentes éditions et versions de Java sont: Le JRE (Java Runtime Environment) contient uniquement l'environnement d'exécution de programmes Java. Le JDK contient lui-même le JRE. Le JRE seul doit être installé sur les machines où des applications Java doivent être exécutées. Depuis sa version 1.2, Java a été renommé Java 2. Les numéros de version 1.2 et 2 désignent donc la même version. Le JDK a été renommé J2SDK (Java 2 Software Développent Kit) mais la dénomination JDK reste encore largement utilisée, à tel point que la dénomination JDK est reprise dans la version 5.0. Le JRE a été renommé J2RE (Java 2 Runtime Environnent). [MD.14] Trois plates-formes d'exécution (ou éditions) Java sont définies pour des cibles distinctes selon les besoins des applications à développer : 06 Java Standard Edition (J2SE / Java SE) : environnement d'exécution et ensemble complet d'API pour des applications de type desktop. Cette plate-forme sert de base en tout ou partie aux autres plates-formes. Java Enterprise Edition (J2EE / Java EE) : environnement d'exécution reposant intégralement sur Java SE pour le développement d'applications d'entreprises. Java Micro Edition (J2ME / Java ME) : environnement d'exécution et API pour le développement d'applications sur appareils mobiles et embarqués dont les capacités ne permettent pas la mise en œuvre de Java SE. La séparation en trois plates-formes permet au développeur de mieux cibler l'environnement d'exécution et de faire évoluer les plates-formes de façon plus indépendante. Avec différentes éditions, les types d'applications qui peuvent être développées en Java sont nombreux et variés : Applications desktop. Applications web: servlets/JSP, portlets, applets. Applications pour appareil mobile (MIDP) : midlets. Applications pour appareil embarqué (CDC). Applications pour carte à puce (Javacard) : applets Javacard. Applications temps reel. Sun fournit le JDK, à partir de la version 1.2, pour les plates-formes Windows, Solaris et Linux. La version 1.3 de Java est désignée sous le nom Java 2 version 1.3. La version 1.5 de Java est désignée officiellement sous le nom J2SE version 5.0. La version 6 de Java est désignée officiellement sous le nom Java SE version 6. II.2. Les caractéristiques: Java possède un certain nombre de caractéristiques qui ont largement contribué à son énorme succès : 07 Java est interprété : La source est compilé en pseudo code ou bytecode puis exécuté par un interpréteur Java ; la Java Virtual Machine (JVM). Ce concept est à la base du slogan de Sun pour Java :WORA (Write Once, Run Anywhere : écrire une fois, exécuter partout). En effet, le bytecode, s'il ne contient pas de code spécifique à une plate-forme particulière peut être exécuté et obtenir quasiment les mêmes résultats sur toutes les machines disposant d'une JVM. Java est portable : Il est indépendant de toute plate-forme : Il n'y a pas de compilation spécifique pour chaque plate-forme. Le code reste indépendant de la machine sur laquelle il s'exécute. Il est possible d'exécuter des programmes Java sur tous les environnements qui possèdent une Java Virtual Machine. Cette indépendance est assurée au niveau du code source grâce à Unicode et au niveau du bytecode. Java est orienté objet : Comme la plupart des langages récents, Java est orienté objet. Chaque fichier source contient la définition d'une ou plusieurs classes qui sont utilisées les unes avec les autres pour former une application. Java n'est pas complètement objet car il définit des types primitifs (entier, caractère, flottant, booléen...). Java est simple : Le choix de ses auteurs a été d'abandonner des éléments mal compris ou mal exploités des autres langages tels que la notion de pointeurs (pour éviter les incidents en manipulant directement la mémoire), l'héritage multiple et la surcharge des opérateurs... Java est fortement type : Toutes les variables sont typées et il n'existe pas de conversion automatique qui risquerait une perte de données. Si une telle conversion doit être réalisée, le développeur doit obligatoirement utiliser un cast ou une méthode statique fournie en standard pour la réaliser. 08 Java assure la gestion de la mémoire : L'allocation de la mémoire pour un objet est automatique à sa création et Java récupère automatiquement la mémoire inutilisée grâce au garbage collector qui restitue les zones de mémoire laissées libres suite à la destruction des objets. Java est sûr: La sécurité fait partie intégrante du système d'exécution et du compilateur. Un programme Java planté ne menace pas le système d'exploitation. Il ne peut pas y avoir d'accès direct à la mémoire. L'accès au disque dur est réglementé dans une applet. Les applets fonctionnant sur le Web sont soumises aux restrictions suivantes dans la version 1.0 de Java : Aucun programme ne peut ouvrir, lire, écrire ou effacer un fichier sur le système de l'utilisateur Aucun programme ne peut lancer un autre programme sur le système de l'utilisateur. Toute fenêtre créée par le programme est clairement identifiée comme étant une fenêtre Java, ce qui interdit par exemple la création d'une fausse fenêtre demandant un mot de passe. Les programmes ne peuvent pas se connecter à d'autres sites Web que celui dont ils proviennent. Java est économe: Le pseudo code à une taille relativement petite car les bibliothèques de classes requises ne sont liées qu'à l'exécution. Java est multitâche: Il permet l'utilisation de threads qui sont des unités d'exécutions isolées. La JVM, elle-même, utilise plusieurs threads. II.3. Les notions et les techniques de base en Java: Cette note présente quelques concepts de base utilisés en Java relatifs à la compilation et l'exécution d'applications, notamment, les notions de classpath, de packages et d'archives de déploiement jar. II.3.1. Les concepts de base: 09 La plate-forme Java utilise quelques notions de base lors de sa mise en œuvre, notamment : La compilation du code source dans un langage indépendant de la plate-forme d'exécution : le bytecode. l'exécution du bytecode par une machine virtuelle nommée JVM (Java Virtual Machine). la notion de package qui permet d'organiser les classes. le classpath qui permet de préciser au compilateur et à la JVM où elle peut trouver les classes requises par l'application. le packaging des classes compilées dans une archive de déploiement nommée jar (Java ARchive). [MD.14] II.3.2. L'exécution d'une applet: Un programme Java est composé d'un ou plus généralement plusieurs fichiers source. N'importe quel éditeur de texte peut être utilisé pour éditer un fichier source Java. Ces fichiers source possèdent l'extension .java. Ils peuvent contenir une ou plusieurs classes ou interfaces mais il ne peut y avoir qu'une seule classe ou interface déclarée publique par fichier. Le nom de ce fichier source doit obligatoirement correspondre à la casse près au nom de cette entité publique suivi de l'extension .java Il est nécessaire de compiler la source pour le transformer en J-code ou bytecode Java qui sera lui exécuté par la machine virtuelle. Pour être compilé, le programme doit être enregistré au format de caractères Unicode : une conversion automatique est faite par le JDK si nécessaire. Un compilateur Java, par exemple l'outil java fourni avec le JDK est utilisé pour compiler chaque fichier source en fichier de classe possédant l'extension .class. Cette compilation gère pour chaque fichier source un ou plusieurs fichiers .class qui contiennent du bytecode. Figure I.1 : test java 21 III. les instructions des bases JAVA : III.1. instructions-bloc: Une large partie de la norme ANSI du langage C est reprise dans Java. Les commentaires sur une ligne débutent par //.... Les commentaires sur plusieurs lignes sont encadrés par /* ... */ Dans ce sous-chapitre nous expliquons les instructions Java en le comparant à pascal-Delphi. Voici la syntaxe d'une instruction en Java : III.1.1.instruction : Figure I.2 : instruction III.1.2.instruction complète : Figure I.3 : instruction complète Toutes les instructions se terminent donc en Java par un point-virgule " ; " III.1.3. bloc - instruction composée : 20 Figure I.3 : instruction composée L'élément syntaxique est aussi dénommé bloc ou instruction composée au sens de la visibilité des variables Java. III.1.4. visibilité dans un bloc - instruction: Exemple de déclarations licites et de visibilité dans 3 blocs instruction imbriqués : int a, b = 12; { int x , y = 8 ; { int z =12; x=z; a=x+1; { int u = 1 ; y=u-b; } } } schéma d'imbrication des 3 blocs Nous examinons ci-dessous l'ensemble des instructions simples de Java. III.2. L'affectation: Java est un langage de la famille des langages hybrides, il possède la notion d'instruction d'affectation. Le symbole d'affectation en Java est " = ", soit par exemple : 22 x=y; // x doit obligatoirement être un identificateur de variable. III.2.1. Affectation simple: L'affectation peut être utilisée dans une expression : soient les instructions suivantes : int a, b = 56 ; a = (b = 12) +8 ; // b prend une nouvelle valeur dans l'expression a = b = c = d =8 ; // affectation multiple simulation d'exécution Java : instruction valeur de a valeur de b int a , b = 56 ; a = ??? b = 56 a = (b = 12)+8 ; a = 20 b = 12 III.2.2 Raccourcis et opérateurs d'affectation: Soit op un opérateur appartenant à l'ensemble des opérateurs suivant { +, - , * , / , %, << , >> , >>> , & , | , ^ }, il est possible d'utiliser sur une seule variable le nouvel opérateur op= construit avec l'opérateur op. Il s'agit plus d'un raccourci syntaxique que d'un opérateur nouveau (seule sa traduction en bytecode diffère : la traduction de a op= b devrait être plus courte en instructions pcode que a = a op b, bien que les optimiseurs soient capables de fournir le même code optimisé). x op= y ; signifie en fait : x = x op y soient les instructions suivantes : int a, b = 56 ; a = -8 ; a += b ; // équivalent à : a = a + b b *= 3 ; // équivalent à : b = b * 3 simulation d'exécution Java : instruction valeur de a valeur de b int a , b = 56 ; a = ??? b = 56 23 a = -8 ; a = -8 b = 56 a += b ; a = 48 b = 56 b *= 3 ; a = 48 b = 168 III.3. Les conditions: III.3.1 les instructions conditionnelles : Syntaxe : Figure I.3 : instructions conditionnelles. Schématiquement les conditions sont de deux sortes : if ( Expr ) Instr ; if ( Expr ) Instr ; else Instr ; La définition de l'instruction conditionnelle de java est classiquement celle des langages algorithmiques; comme en pascal l'expression doit être de type booléen (différent du C), la notion d'instruction a été définie plus haut. III.3.2 l'opérateur conditionnel : Il s'agit ici comme dans le cas des opérateurs d'affectation d'une sorte de raccourci entre l'opérateur conditionnel if...else et l'affectation. Le but étant encore d'optimiser le bytecode engendré. Syntaxe : Figure I.4 : Opérateur conditionnel. 24 Où expression renvoie une valeur booléenne (le test), les deux termes valeur sont des expressions générales (variable, expression numérique, booléenne, etc...) renvoyant une valeur de type quelconque. Sémantique : Exemple : int a,b,c ; c = a = = 0 ? b : a+1 ; Si l'expression est true l'opérateur renvoie la première valeur, (dans l'exemple c vaut la valeur de b). Si l'expression est false l'opérateur renvoie la seconde valeur (dans l'exemple c vaut la valeur de a+1). Sémantique de l'exemple avec un if..else : if (a = = 0) c = b; else c = a+1; III.4. Les itérations: III.4.1.Itération while : Syntaxe : Figure I.5 : Itération while. Où expression est une expression renvoyant une valeur booléenne (le test de l'itération). Sémantique : Identique à celle du pascal (instruction algorithmique tantque .. faire .. ftant) avec le même défaut de fermeture de la boucle. III.4.2.Itération do...while : 25 Syntaxe : Où expression est une expression renvoyant une valeur booléenne (le test de l'itération). Sémantique : "do Instr while ( Expr )" fonctionne comme l'instruction algorithmique répéter Instr jusquà non Expr. Sa sémantique peut aussi être expliquée à l'aide d'une autre instruction Java while : do Instr while ( Expr ) Instr ; while ( Expr ) Instr Exemple de boucle do...while III.4.3.Itération for : Syntaxe : Sémantique : Une boucle for contient 3 expressions for (Expr1 ; Expr2 ; Expr3 ) Instr , d'une manière générale chacune de ces expressions joue un rôle différent dans l'instruction for. Une instruction for en Java (comme en C) est plus puissante et plus riche qu'une boucle for dans d'autres langages algorithmiques. Nous donnons ci-après une sémantique minimale : Expr1 sert à initialiser une ou plusieurs variables (dont éventuellement la variable de contrôle de la boucle) sous forme d'une liste d'instructions d'initialisation séparées par des virgules. Expr2 sert à donner la condition de rebouclage sous la fome d'une expression renvoyant une valeur booléenne (le test de l'itération). Expr3 sert à réactualiser les variables (dont éventuellement la variable de contrôle de la boucle) sous forme d'une liste d'instructions séparées par des virgules. 26 "for(Expr1 ; Expr2 ; Expr3) Instr" fonctionne au minimum comme l'instruction algorithmique pour... fpour. Sa sémantique peut aussi être approximativement(*) expliquée à l'aide d'une autre instruction Java while : for (Expr1 ; Expr2 ; Expr3 ) Instr Expr1 ; while (Expr2) {Instr ; Expr3 } (*)Nous verrons au paragraphe consacré à l'instruction continue que si l'instruction for contient un continue cette définition sémantique n'est pas valide. III.5. Break et continue : III.5.1.Interruption break : Syntaxe : Sémantique: Une instruction break ne peut se situer qu'à l'intérieur du corps d'instruction d'un bloc switch (le switch est traité au paragraphe suivant), ou de l'une des trois itérations while, do..while, for. Lorsque break est présente dans l'une des trois itérations while, do..while, for : Si break n'est pas suivi d'une étiquette elle interrompt l'exécution de la boucle dans laquelle elle se trouve, l'exécution se poursuit après le corps d'instruction. 27 Si break est suivi d'une étiquette elle fonctionne comme un goto (utilisation déconseillée en programmation moderne sauf pour le switch, c'est pourquoi nous n'en dirons pas plus pour les boucles !) III.5.2.Rebouclage continue : Syntaxe : Sémantique : Une instruction continue ne peut se situer qu'à l'intérieur du corps d'instruction de l'une des trois itérations while, do..while, for. Lorsque continue est présente dans l'une des trois itérations while, do..while, for : Si continue n'est pas suivi d'une étiquette elle interrompt l'exécution de la séquence des instructions situées après elle, l'exécution par rebouclage de la boucle. Elle agit comme si l'on venait d'exécuter la dernière instruction du corps de la boucle. Si continue est suivi d'une étiquette elle fonctionne comme un goto (utilisation déconseillée en programmation moderne, c'est pourquoi nous n'en dirons pas plus !) III.6. Switch...case: Syntaxe: Bloc Switch : 28 Sémantique: La partie expression d'une instruction switch doit être une expression ou une variable du type byte, char, int ou bien short. La partie expression d'un bloc switch doit être une constante ou une valeur immédiate du type byte, char, int ou bien short. switch <Epr1> s'appelle la partie sélection de l'instruction : il y a évaluation de <Epr1> puis selon la valeur obtenue le programme s'exécute en séquence à partir du case contenant la valeur immédiate égal. Il s'agit donc d'un déroutement du programme dès que <Epr1> est évaluée vers l'instruction étiquetée par le case <Epr1> associé. III.7. try...catch : Nous reviendrons plus loin sur les exceptions et l'instruction try...catch. Nous donnons ici la syntaxe d'une version simple et nous indiquons que sa sémantique est semblable à celle du bloc try…exceptde Delphi. Sachons pour l'instant que Java dispose d'un mécanisme puissant présent dans les langages robustes Ada, C++, Delphi pour intercepter et traiter les erreurs ou incidents survenant dans un bloc d'instruction. [web.01] L'instruction try...catch sert à traiter de tels incidents, elle dispose d'un bloc try (pour les instructions à protéger) et d'un ou plusieurs blocs catch (pour divers genres de traitement en cas d'incidents). try { BLOC à protéger } catch (TypeErreur1 Err1) { TRAITEMENT d'une erreur du type TypeErreur1 } catch (TypeErreur2 Err2) { TRAITEMENT d'une erreur du type TypeErreur2 } ... catch (TypeErreurX ErrX) { TRAITEMENT d'une erreur du type TypeErreurX } 29 IV. Développement des interfaces graphiques: Les interfaces graphiques assurent le dialogue entre les utilisateurs et une application. Dans un premier temps, Java proposait l'API AWT pour créer des interfaces graphiques. Depuis, Java propose une nouvelle API nommée Swing. Ces deux API peuvent être utilisées pour développer des applications ou des applets. Face aux problèmes de performance de Swing, IBM a créé sa propre bibliothèque nommée SWT utilisée pour développer l'outil Eclipse. La vélocité de cette application favorise une utilisation grandissante de cette bibliothèque. Les développements des interfaces graphiques contient les point suivants: Le graphisme : Ensemble des techniques de dessin et leurs résultats, leur mise en œuvre. Les graphismes d'un jeu sont toutes les images, tous les dessins, tout le travail graphique par opposition au reste (son, codage...). [web.02] Les éléments d'interfaces graphiques de l'AWT: Les classes du toolkit AWT (Abstract Windows Toolkit) permettent d'écrire des interfaces graphiques indépendantes du système d'exploitation sur lesquel elles vont fonctionner. Cette librairie utilise le système graphique de la plate-forme d'exécution (Windows, MacOS, X-Window) pour afficher les objets graphiques. Le toolkit contient des classes décrivant les composants graphiques, les polices, les couleurs et les images. La création d'interfaces graphiques avec AWT: AWT propose un ensemble de composants et de fonctionnalités pour créer des interfaces graphiques. L'interception des actions de l'utilisateur: N'importe quelle interface graphique doit interagir avec l'utilisateur et donc réagir à certains événements. Le modèle de gestion de ces événements à changer entre le JDK 1.0 et 1.1. Le développement d'interfaces graphiques avec SWING: Swing fait partie de la bibliothèque Java Fondation Classes (JFC). C'est une API dont le but est similaire à celui de l'API AWT mais dont les modes de fonctionnement et d'utilisation sont complètement différents. Swing a été intégré au JDK depuis sa version 1.2. Cette bibliothèque existe séparément. Pour le JDK 1.1. La bibliothèque JFC contient: 31 L‟API Swing : de nouvelles classes et interfaces pour construire des interfaces graphiques. Accessibility API. 2D API: support du graphisme en 2D. API pour l'impression et le cliquer/glisser. Structure d’un programme Java-Swing Un programme Java-Swing est composé d‟un ensemble de widgets. A ces widgets peuvent être associés des listeners d‟évènements. Un listener d‟évènements implémente des méthodes. Suivant le type d‟événement produit par l‟action de l‟utilisateur sur un widget, la "bonne" méthode de listener est exécutée. Méthode de listener : le corps d‟une méthode de listener modifie le rendu de l‟interface et effectue des calculs par appel au noyau fonctionnel de l‟application. Le développement d'interfaces graphiques avec SWT: La première API pour développer des interfaces graphiques portables d'un système à un autre en Java est AWT. Cette API repose sur les composants graphiques du système sous-jacent ce qui lui assure de bonnes performances. Malheureusement, ces composants sont limités dans leur fonctionnalité car ils représentent le plus petit dénominateur commun des différents systèmes concernés. Pour pallier ce problème, Sun a proposé une nouvelle API, Swing. Cette Api est presque exclusivement écrite en Java, ce qui assure sa portabilité. Swing possède aussi d'autres points forts, telles que des fonctionnalités avancées, la possibilité d'étendre les composants, une adaptation du rendu de composants, etc ... Swing est une API mature, éprouvée et parfaitement connue. Malheureusement, ses deux gros défauts sont sa consommation en ressource machine et la lenteur d'exécution des applications qui l'utilisent. SWT propose une approche intermédiaire : utiliser autant que possible les composants du système et implémenter les autres composants en Java. SWT est écrit en Java et utilise la technologie JNI pour appeler les composants natifs. SWT utilise autant que possible les composants natifs du système lorsqu'ils existent, sinon ils sont réécrits en pur Java. Les données de chaque 30 composant sont aussi stockées autant que possible dans le composant natif, limitant ainsi les données stockées dans les objets Java correspondant. JFace : JFace est une bibliothèque graphique libre Java pour le projet Eclipse qui s'appuie sur la bibliothèque SWT pour fournir des interfaces utilitaires plus structurées. IV.1. Les API avancées: Le JDK fournit un certain nombre d'API intégrés au JDK pour des fonctionnalités avancées. Les API avancées contient les point suivants: Les collections : Les collections sont des objets qui permettent de gérer des ensembles d'objets. Ces ensembles de données peuvent être définis avec plusieurs caractéristiques : la possibilité de gérer des doublons, de gérer un ordre de tri, etc. ... Les flux : Un programme a souvent besoin d'échanger des informations, que ce soit pour recevoir des données d'une source ou pour envoyer des données vers un destinataire. La source et la destination de ces échanges peuvent être de natures multiples : un fichier, un socket réseau, un autre programme, etc ... De la même façon, la nature des données échangées peut être diverse : du texte, des images, du son, etc ... NIO 2 : L‟API NIO 2 a été développée sous la JSR 203 et a été ajoutée au JDK dans la version 7 de Java SE. NIO 2 est une API plus moderne et plus complète pour l'accès au système de fichiers. Son but est en partie de remplacer la classe File de la très ancienne API IO. NIO 2 propose d'étendre les fonctionnalités relatives aux entrées/sorties : l'utilisation du système de fichiers de manière facile et les lectures/écritures asynchrones. La sérialisation : La sérialisation est un procédé introduit dans le JDK version 1.1 qui permet de rendre un objet ou un graphe d'objets de la JVM persistant pour stockage ou échange et vice versa. Cet objet est mis sous une forme sous laquelle il pourra être reconstitué à l'identique. Ainsi il pourra être stocké sur un disque dur ou transmis au travers d'un réseau pour le créer dans 32 une autre JVM. C'est le procédé qui est utilisé, par exemple, par RMI. La sérialisation est aussi utilisée par les beans pour sauvegarder leurs états. L'interaction avec le réseau : Les échanges avec le réseau sont devenus omniprésents dans les applications et entre les applications. Ils permettent notamment : un accès à des serveurs comme une base de données d'invoquer des services distants de développer des applications web d'échanger des données entres applications La plupart de ces fonctionnalités sont mises en oeuvre via des API de haut niveau mais celles-ci utilisent généralement des API de bas niveau pour interagir avec le réseau. La gestion dynamique des objets et l'introspection : Depuis la version 1.1 de Java, il est possible de créer et de gérer dynamiquement des objets. L'introspection est un mécanisme qui permet de connaître le contenu d'une classe dynamiquement. Il permet notamment de savoir ce que contient une classe sans en avoir les sources. Ces mécanismes sont largement utilisés dans des outils de type IDE (Integrated Development Environnement : environnement de développement intégré). L'appel de méthodes distantes : RMI (Remote Method Invocation) est une technologie développée et fournie par Sun à partir du JDK 1.1 pour permettre de mettre en oeuvre facilement des objets distribués. L'internationalisation: La localisation consiste à adapter un logiciel aux caractéristiques locales de l'environnement d'exécution telles que la langue et la monnaie. Le plus gros du travail consiste à traduire toutes les phrases et les mots. Les classes nécessaires sont incluses dans le packetage java.util. Les composants Java beans : Les JavaBeans sont des composants réutilisables introduits par le JDK 1.1. De nombreuses fonctionnalités ont ensuite été ajoutées pour développer des caractéristiques de ces composants. Les JavaBeans sont couramment appelés beans tout simplement. 33 Les beans sont prévus pour pouvoir interagir avec d'autres beans au point de pouvoir développer une application simplement en assemblant des beans avec un outil graphique dédié. Sun fournit gratuitement un tel outil : le B.D.K. (Bean Development Kit). Le logging : Le logging consiste à ajouter des traitements dans les applications pour permettre l'émission et le stockage de messages suite à des événements. Le logging est utile pour tous les types d'applications en permettant par exemple de conserver une trace des exceptions qui sont levées dans l'application et des différents événements anormaux ou normaux liés à l'exécution de l'application. Le logging permet de gérer des messages émis par une application durant son exécution et de permettre leur exploitation immédiate ou a postériori. Ces messages sont d'ailleurs très utiles lors de la mise au point d'une application ou lors de son exploitation pour comprendre son fonctionnement ou résoudre une anomalie. La sécurité : Depuis sa conception, la sécurité dans le langage Java a toujours été une grande préoccupation pour Sun. Avec Java, la sécurité revêt de nombreux aspects : les spécifications du langage disposent de fonctionnalités pour renforcer la sécurité du code. la plate-forme définit un modèle pour gérer les droits d'une application les API JCA/JCE permettent d'utiliser des technologies de cryptographie l'API JSSE permet d'utiliser le réseau au travers des protocoles sécurisés SSL ou TLS. l'API JAAS propose un service pour gérer l'authentification et les autorisations d'un utilisateur. JCA (Java Cryptography Architecture) : Le but de l'API JCA (Java Cryptography Architecture) est de fournir des fonctionnalités cryptographiques de base à la plate-forme Java. 34 JCE (Java Cryptography Extension : L'API JCE (Java Cryptography Extension) est une extension de JCA qui lui ajoute des API pour l'encryptage et le décryptage, la génération de clés et l'authentification de messages avec des algorithmes de type MAC. JNI (Java Native Interface) : JNI est l'acronyme de Java Native Interface. C'est une technologie qui permet d'utiliser du code natif, notamment C, dans une classe Java. JNDI (Java Naming and Directory Interface) : JNDI est l'acronyme de Java Naming and Directory Interface. Cette API fournit une interface unique pour utiliser différents services de nommages ou d'annuaires et définit une API standard pour permettre l'accès à ces services. Le scripting : Le scripting est utilisé depuis longtemps, dans un premier temps, pour automatiser certaines tâches sur des systèmes d'exploitation (exemple le shell sous Linux) puis sous la forme de langages de développement (exemple Perl, Python, ...) Ces langages n'ont pas pour but de remplacer le langage Java mais ils peuvent avoir une place de choix pour remplir certaines tâches et permettre de bénéficier des points forts de Java et du scripting. JMX (Java Management Extensions) : JMX est l'acronyme de Java Management Extensions. Historiquement, cette API se nommait JMAPI (Java Management API). La version 5.0 de Java a ajouté l'API JMX 1.2 dans la bibliothèque de classes standard. JMX est une spécification qui définit une architecture, une API et des services pour permettre de surveiller et de gérer des ressources en Java. JMX permet de mettre en place, en utilisant un standard, un système de surveillance et de gestion d'une application, d'un service ou d'une ressource sans avoir à fournir beaucoup d'efforts. V. Le développement d'applications java web : Le développement d'applications java web contient les points suivants: Les servlets : A la base, les serveurs web sont seulement capables de renvoyer des fichiers présents sur le serveur en réponse à une requête d'un client. Cependant, pour permettre l'envoi d'une page HTML contenant par exemple une liste d'articles répondant à différents critères, 35 il faut créer dynamiquement cette page HTML. Plusieurs solutions existent pour ces traitements. Les servlets Java sont une de ces solutions. Mais les servlets peuvent aussi servir à d'autres usages. Les JSP (Java Server Pages) : Les JSP (Java Server Pages) sont une technologie Java qui permet la génération de pages web dynamiques. La technologie JSP permet de séparer la présentation sous forme de code HTML et les traitements écrits en Java sous la forme de JavBeans ou de servlets. Ceci est d'autant plus facile que les JSP définissent une syntaxe particulière permettant d'appeler un bean et d'insérer le résultat de son traitement dans la page HTML dynamiquement. JSTL (Java server page Standard Tag Library) : JSTL est l'acronyme de Java server page Standard Tag Library. C'est un ensemble de tags personnalisés développé sous la JSR 052 qui propose des fonctionnalités souvent rencontrées dans les JSP : Tag de structure (itération, conditionnement ...) Internationalisation Exécution de requêtes SQL Utilisation de documents XML Struts : Struts est un framework pour applications web développé par le projet Jakarta de la fondation Apache. C'est le plus populaire des frameworks pour le développement d'applications web avec Java. JSF (Java Server Faces) : Java Server Faces (JSF) est une technologie dont le but est de proposer un framework qui facilite et standardise le développement d'applications web avec Java. Son développement a tenu compte des différentes expériences acquises lors de l'utilisation des technologies standard pour le développement d'applications web (servlet, JSP, JSTL) et de différents frameworks (Struts, ...) D'autres frameworks pour les applications web : En plus des solutions officielles de la plate-forme Java EE, servlets/JSP et JSF, l'écosystème Java dispose de nombreuses solutions pour le développements d'applications web. Ce chapitre propose une liste non exhaustive de ces solutions. 36 VI. Les outils pour le développement JAVA : Le développement dans n'importe quel langage nécessite un ou plusieurs outils. D'ailleurs la multitude des technologies mises en oeuvre dans les projets récents nécessite l'usage de nombreux outils. On propose un recensement non exhaustif des outils utilisables pour le développement d'applications Java et une présentation détaillée de certains d'entre-eux. Le JDK fournit un ensemble d'outils pour réaliser les développements mais leurs fonctionnalités se veulent volontairement limitées au strict miminum. Enfin, le monde open source propose de nombreux outils très utiles. Il y a beaucoup des outils, nous rappelons quelques: Les outils du J.D.K. : Le JDK de Sun/Oracle fournit un ensemble d'outils qui permettent de réaliser des applications. Ces outils sont peu ergonomiques car ils s'utilisent en ligne de commandes mais, en contrepartie, ils peuvent toujours être utilisés. avaDoc : Javadoc est un outil fourni par Sun avec le JDK pour permettre la génération d'une documentation technique à partir du code source. Cet outil génère une documentation au format HTML à partir du code source Java et des commentaires particuliers qu'il contient. Un exemple concret de l'utilisation de cet outil est la documentation du JDK qui est générée grâce à Javadoc. Les outils libres et commerciaux : tente une énumération non exhaustive des outils libres et commerciaux pour utiliser java. Ant : Ant est un projet du groupe Apache-Jakarta. Son but est de fournir un outil écrit en Java pour permettre la construction d'applications (compilation, exécution de tâches post et pré compilation, ...). Ces processus de construction d'applications sont très importants car ils permettent d'automatiser des opérations répétitives tout au long du cycle de développement de l'application (développement, tests, recettes, mises en production, ...) 37 Maven : est un outil de construction de projets (build) open source développé par la fondation Apache, initialement pour les besoins du projet Jakarta Turbine. Il permet de faciliter et d'automatiser certaines tâches de la gestion d'un projet Java. Tomcat : Apache Tomcat est une implémentation open source d'un conteneur web qui permet donc d'exécuter des applications web reposant sur les technolgoies servlets et JSP. Des outils open source pour faciliter le développement : présentation de quelques outils de la communauté open source permettant de simplifier le travail des développeurs. VII. Conclusion: Dans ce chapitre nous avons représentez les fondements du langage Java. La maîtrise de ces notions est indispensable pour produire des applications ou des bibliothèques convenables. Néanmoins, Nous avons fourni diverses informations important dans l'application de tout programme en Java, et ensuite nous allons étudier la méthode formelle qui permet de donner un programme sans erreur. 38 Chapitre II: Les approches formelles existantes 39 I. Introduction : 1. En informatique, les méthodes formelles sont des techniques permettant de raisonner rigoureusement, à l'aide de logique mathématique, sur des programmes informatiques ou du matériel électroniques, afin de démontrer leur validité par rapport à une certaine spécification. Elles sont basées sur les sémantiques des programmes, c'est-à-dire sur des descriptions mathématiques formelles du sens d'un programme donné par son code source (ou parfois, son code objet). 2. Dans cette section, nous étudions les approches formelles et nous donner des exemples d'entre eux et toucher ainsi que d'identifier les types et aspects avantage et négatifs et les champs d'utilisation de chacun d'eux 3. II. les méthodes formelles : II.1. Motivation : Les méthodes formelles, issues des travaux du Programming Research Group de l'université d'Oxford, ont été proposées afin d'exprimer le besoin par un formalisme rigoureux, permettant de: Définir correctement les termes employés et faire abstraction des détails de programmation (pour ne retenir que les caractéristiques essentielles), et donc limiter au maximum les incompréhensions entre développeurs et utilisateurs. Faciliter la preuve de propriétés, et par conséquent la validation des logiciels produits. II.2. Définition : Une spécification formelle est exprimée dans un langage à syntaxe et sémantique précises, construit sur une base théorique solide et permettant des vérifications automatisées : grâce aux règles de déduction du système formel, on peut démontrer des propriétés de la spécification. Des exemples de cette technique sont : les réseaux de Petri, les grammaires formelles, les automates à états finis, la théorie des graphes et le λcalcul. Un projet est structuré par à un ensemble de relations entre les spécifications, et certaines de ces relations peuvent être prouvées formellement [4]. 41 II.3. Classification : On peut classer les méthodes formelles en quatres catégories : Approche algébrique : Types abstraits de données (aucune structure de donnée n'est décrite, seules les opérations le sont), déduction équationnelle : SACSO, LARCH, LPG, OBJ. Approche dynamique : Modélisation de l'interaction entre différents processus : CSP, CCS. Approche logique : Théorie des types et logiques d'ordre supérieur : PVS, Isabelle/HOL, Coq. Approche par modèle abstrait : Définition d'une structure de données et d'un ensemble d'opérations, approche constructive : VDM, Z, B. Exemple : Comment vérifier que l'identité (a+b)2 = a2 + b2 + 2(a*b) est correct? Une vérification naïve pourrait consister à examiner toutes les valeurs possibles de a, à les croiser avec toutes les valeurs possibles de b et, pour chaque couple, à calculer (a+b) 2, puis (a+b)2 = a2 + b2 + 2(a*b) et à s'assurer que l'on obtient le même résultat. Si les domaines de a et de b sont grands, cette vérification peut être très longue. Et si les domaines sont infinis (par exemple les réels), cette vérification ne peut pas être exhaustive. En vérification formelle, on utilise des valeurs symboliques et on applique les règles qui régissent le + et l'*. Ici, les règles pourraient être: 40 En se servant de ces règles, on arrive à montrer que : . Demonstration: (a+b)² = (a+b) * (a + b) (R1) = (a+b) *a + (a+b) * b (R2) = a * (a+b) + b * (a+b) (R3) =a*a+a*b+b*a+b*b = a² + a * b + b * a + b² (R1) = a² + a * b + a * b + b² (R3) = a² + 2(a * b) + b² (R4) = a² + b² + 2(a * b) (R5) (R2) III. différentes approches : La vérification comprend plusieurs approches, souvent complémentaires : il existe 2 types d'approche formelle (les approches formelles ET les approches semi formelles) 4. 5. III.1.1. Model Checking: Désigne une famille de techniques de vérification automatique des systèmes dynamiques (souvent d'origine informatique ou électronique). Il s'agit de vérifier algorithmiquement si un modèle donné, le système lui-même ou une abstraction du système, satisfait une spécification, souvent formulée en termes de logique temporelle. On peut distinguer deux aspects du model checking : Il peut s'agir de démontrer qu'une certaine classe de propriétés, ou une certaine logique, est décidable, ou que sa décision appartient à une certaine classe de complexité. Il peut s'agir de rechercher des algorithmes efficaces sur des cas intéressants en pratique, de les implémenter, et de les appliquer à des problèmes réels. Les premiers travaux sur le model checking de formules de logique temporelle ont été menés par Edmund M. Clarke et E. Allen Emerson en 1981, ainsi que par Jean-Pierre Queille et Joseph 42 Sifakis en 1982. Clarke, Emerson et Sifakis se sont vu attribuer le Prix Turing 2007 pour leurs travaux sur le model checking. [5] Les avantages du model checking: C‟est une approche de vérification générale applicable à un large éventail d‟applications telles que les systèmes embarqués, le génie logiciel, et la conception matérielle. Elle supporte une vérification partielle c'est-à-dire les propriétés peuvent être vérifiée individuellement, permettant ainsi de se concentrer sur les propriétés essentielles dans un premier temps. Aucune nécessité de spécification complète n‟est nécessaire. Il n‟est pas vulnérable à la probabilité avec laquelle une erreur est exposée, ce qui contraste avec les essais et la simulation qui visent à retrouver les défauts les plus probables. Il fournit des informations de diagnostic dans le cas où une propriété est invalide, ce qui est très utile pour le débogage. C‟est une technologie potentielle “Push-button” ; l‟utilisation d‟un model checker ne nécessite pas un degré élevé d‟interaction entre utilisateurs ou d‟expertise. Il bénéficie d‟un intérêt de plus en plus prononcé par les industriels : plusieurs sociétés de matériels ont commencé leurs vérifications internes en laboratoire ; des offres d‟emploi avec les compétences requises dans la vérification de modèle apparaissent souvent ; et des modèles de vérificateurs commerciaux deviennent disponibles. Il peut être facilement intégré dans les cycles de développement existants : sa courbe d‟apprentissage est relativement rapide, et les études empiriques indiquent qu‟il peut conduire à des temps de développement plus courts. Il est basé sur les éléments des algorithmes de la théorie des graphes, les structures de données et la logique. Les logiques temporelles peuvent facilement exprimer un grand nombre des propriétés qui sont nécessaires pour le raisonnement sur les systèmes concurrents. Si la spécification n'est pas satisfaite, le model checker produira un contre-exemple (trace d'exécution) qui montre pourquoi la spécification ne tient pas. Les contre-exemples sont très précieux pour le débogage des systèmes complexes. Certaines personnes utilisent le model checking uniquement pour cette fonctionnalité. Dans la pratique, le model checker est rapide en comparaison des autres méthodes rigoureuses telles que l'utilisation d'un vérificateur de preuves (proof checker), qui peut nécessiter des mois de travail pour un utilisateur en mode interactif. 43 Le processus de vérification est automatique. L'utilisateur du model checker n'a pas besoin de construire une preuve de corrections. En principe, l'utilisateur doit entrer une description d‟un circuit ou d'un programme et la spécification qui doit être vérifiée. Le model checking peut être utilisé lors de la conception d'un système complexe. L'utilisateur n'a pas besoin d'attendre la fin de la phase de conception. Les inconvénients du model checking: Il est surtout approprié pour le contrôle intensif d’applications et moins adapté pour des applications ayant des données variant généralement sur des domaines infinis. Son applicabilité est soumise aux problèmes de décidabilité, pour les systèmes à états infinis, ou le raisonnement à propos des types de données abstraites (qui nécessite des logiques indécidables ou semi décidables), alors les algorithmes du model checking ne sont pas, en général, décidables. Il vérifie le modèle du système, et non le système actuel (produit ou prototype) lui-même, tout résultat obtenu est donc aussi bon que le modèle du système. Les techniques tellesque les essais sont nécessaires pour trouver les défauts de fabrication (pour le matériel) ou des erreurs de codage (pour le logiciel). Il vérifie seulement l’exigence (besoin) déclarée c'est-à-dire qu’il n’y a aucune garantie d’exhaustivité (complétude). La validité des propriétés non vérifiées ne peut pas être jugée. Il souffre du problème de l’explosion combinatoire (explosion d’espace d’états), le nombre d’états nécessaires pour modéliser le système avec précision peut facilement dépasser la quantité de mémoire disponible. Malgré le développement de plusieurs méthodes très efficaces pour lutter contre ce problème, les modèles de systèmes réalistes peuvent encore être trop grands pour tenir en mémoire. Son utilisation nécessite une certaine expertise dans la recherche d’abstractions appropriées pour obtenir des modèles de systèmes réduits et aux propriétés de l’état dans la logique du formalisme utilisé. III.1.2. Notation Z : La notation Z a été créée par J.R. Abrial. Est apparu pour la première fois dans un livre, lors de l'édition en 1980, leur sert à introduire le « modèle relationnel n-aire » de Ted Codd. Une notation graphique utilise ce modèle relationnel binaire, c'est NIAM (Nijssen Information Analysis Method), (H. Habrias, Le modèle relationnel binaire, Eyrolles, 1988) développée au sein de Control Data à Bruxelles. 44 La notation Z est un langage de spécification utilisé pour décrire et modéliser les systèmes informatiques. Les avantages de notion Z : Z comprend une notation de schéma pour aider à la structuration des spécifications Précise et sans ambiguïté. La notation est utile d'organiser les pensées et aider la communication des idées sein d'une équipe de conception. Existe en boîtes ou schémas. Donc plus faciles à comprendre. assez lisible pour être utilisé comme un outil de documentation dans un manuel (Clarifier interfaces internes). Les Inconvénient de notion Z : Notation Z est conçu pour être expressif et compréhensible par les humains plutôt que par des ordinateurs exécutables. Z ne sont utilisés pour spécifier les aspects fonctionnels des systèmes. Z n'a pas traité explicitement la gestion des exceptions. [6] III.1.3. CADP : CADP (Construction et analyse des processus distribués) est une boîte à outils pour la conception de protocoles de communication et les systèmes distribués. PCA est développé par l'équipe CONVECS (anciennement par l'équipe VASY) à l'INRIA Rhône-Alpes et relié à divers outils complémentaires. PCA est maintenue, régulièrement amélioré et utilisé dans de nombreux projets industriels. Le but de la boîte à outils de PCA est de faciliter la conception de systèmes fiables en utilisant des techniques de description formelle avec des outils logiciels pour la simulation, le développement rapide d'applications, la vérification et la génération de tests. PCA peut être appliquée à tout système qui comprend du parallélisme asynchrone, cet est à dire, tout système dont le comportement peut être modélisé comme un ensemble de processus parallèles régies par entrelacement sémantique. Par conséquent PCA peut être utilisé pour concevoir l'architecture matérielle, algorithmes distribués, protocoles de télécommunication, etc. La vérification énumérative (aussi connu comme la vérification explicite de l'Etat) des techniques mises en œuvre dans PCA, quoique moins générale que la démonstration de théorèmes, de 45 permettre une détection automatique, le coût-efficace de erreurs de conception dans les systèmes complexes [7]. les avantages de CADP : Descriptions de haut niveau écrites en plusieurs langues, calcul, etc. La boîte à outils CADP fournit compilateurs (César, CAESAR.ADT, LNT2LOTOS, FSP2LOTOS, etc.) que de traduire descriptions de haut niveau en code C à être utilisés pour la simulation, la vérification, et les essais fins; Descriptions de bas niveau spécifiés comme des automates (ie, machines à états finis) et des réseaux d'automates communicants qui fonctionnent en parallèle, synchroniser, et de communiquer en utilisant des opérateurs processus d'algèbre ou vecteurs de synchronisation. Plusieurs outils de vérification d'équivalence (minimisation et comparaisons modulo bisimulation relations), comme BCG_MIN et BISIMULATOR. les inconvénients de CADP : Manque d'engagement, l'écriture et la description dans une langue, mais dépend de plusieurs langues III.1.4. Coq : Coq est un assistant de preuve utilisant le langage Gallina, développé par l'équipe PI.R2 d'Inria au sein du laboratoire PPS du CNRS et en partenariat avec l'École polytechnique, le CNAM, l'Université Paris Diderot et l'Université Paris-Sud (et antérieurement l'École normale supérieure de Lyon). Le nom du logiciel (initialement CoC) est particulièrement adéquat car : il est français ; il est fondé sur le calcul des constructions (CoC abrégé en anglais) introduit par Thierry Coquand. Dans la mêmeveine, son langage est Gallina et Coq possède un wiki dédié, baptisé Cocorico.! [8]. Les avantages de Coq : Les méthodes de détection d'erreurs. cadre de Mutation. La vérification formelle de générateurs. Approche basée sur les langages. Les inconvénients de Coq : 46 Les erreurs dans les programmes (définitions), les spécifications (propriétés) et Erreurs dans les générateurs. 6. III.1.2. Les approches semis formelles : 7. III.1.2.1. UML: Le langage de modélisation unifié, de l'anglais Unified Modeling Language (UML), est un langage de modélisation graphique à base de pictogrammes conçu pour fournir un méthode normalisée pour visualiser la conception d'un système. Il est couramment utilisé en développement logiciel et en conception orientée objet. Le UML est le résultat de la fusion de précédents langages de modélisation objet : Booch, OMT, OOSE. Principalement issu des travaux de GradyBooch, James Rumbaugh et Ivar Jacobson, UML est à présent un standard adopté par l'Object Management Group (OMG) [9]. UML définit beaucoup diagrammes, mais nous proposons les diagrammes très important, il existe 8 diagramme. Ceux-ci permettent de visualiser et de manipuler les éléments dits "de modélisation". Chaque diagramme UML ci-dessous possède une structure précise. Diagrammes d'activité : représentation du comportement d'une opération en terme d'action Diagrammes de cas d'utilisation : représentation des fonctions du système du point de vue de l'utilisateur. Diagrammes de classes : représentation de la structure statique en terme de classes et de relations. Diagrammes de collaboration : représentation spatiale des objets, des liens et des interactions. Diagrammes de déploiement : représentation du déploiement des composants sur les dispositifs matériels. Diagrammes d'états-transitions : représentation du comportement d'une classe en terme d'état. Diagrammes d'objet : représentation des objets et de leurs relations, correspond à un diagramme de collaboration simplifié, sans représentation des envois de message Diagrammes de séquence : représentation temporelle des objets et de leurs interactions. Avantage de l’UML : Le principal avantage d'UML c'est qu'il est devenu le standard en terme de modélisation objet, universellement reconnu celui-ci est polyvalent et performant. 47 UML est un langage formel et normalisé, offrant précision et stabilité. UML est un support de communication performant, permettant de cadrer l‟analyse ; la compréhension de représentations abstraites complexes est facilitée et son caractère polyvalent et sa souplesse en font un langage universel. Inconvénient l’UML : Son point faible est sans contestation possible, la lourdeur (relative) de sa mise en place au sein de n'importe quel processus. Son apprentissage assez long et rigoureux peut également être un frein à son utilisation. La mise en pratique d‟UML est dangereuse car la modélisation est totalement libre et les outils sont variés. UML doit être spécifié pour être utilisé dans un cadre précis sans risque d‟erreur. II.1.2.2. Réseau de Petri : Un réseau de Petri (aussi connu comme un réseau de Place/Transition ou réseau de P/T) est un modèle mathématique servant à représenter divers systèmes (informatiques, industriels…) travaillant sur des variables discrètes. Les réseaux de Petri sont apparus en 1962, dans la thèse de doctorat de Carl Adam Petri. Les réseaux de Petri sont des outils graphiques et mathématiques permettant de modéliser et de verifier le comportement dynamique des systèmes à événements discrets comme les systèmes manufacturiers, les systèmes de télécommunications, les réseaux de transport. Avantages et inconvénients d’un réseau de petri : L‟analyse de la modélisation Rdp peut identifier, d‟une manière qualitative seulement (cependant, un niveau de granularité approprié des INPUT est nécessaire), l‟impact et les conséquences des risques de part et d‟autre des deux infrastructures. Les Rdp peuvent rallier les composants des deux systèmes TIC et électrique sur le même modèle, avec leur interdépendances. Pour les systèmes complexes, la robustesse reste à prouver pour les Rdp, il y a notamment un risque d‟explosion combinatoire et malheureusement aucun outil/plateforme traitant le contexte électrique n‟a pu être trouvé. 48 IV. Spécification : Les méthodes formelles peuvent être utilisées pour donner une spécification du système que l'on souhaite développer, au niveau de détails désiré. Une spécification formelle du système est basée sur un langage formel dont la sémantique est bien définie (contrairement à une spécification en langage naturel qui peut donner lieu à différentes interprétations). Cette description formelle du système peut être utilisée comme référence pendant le développement. De plus, elle peut être utilisée pour vérifier (formellement) que la réalisation finale du système (décrite dans un langage informatique dédié) respecte les attentes initiales (notamment en termes de fonctionnalité). La nécessité des méthodes formelles s'est fait sentir depuis longtemps. Dans le rapport Algol 60, John Backus présentait une notation formelle pour décrire la syntaxe des langages de programmation (notation appelée Backus-Naur form, BNF). Aujourd'hui, différents moyens permettent de formaliser la spécification des programmes, on parle alors de sémantique. Il en existe de différentes natures, chacune adaptée au paradigme de calcul voulu : dénotationnelle, opérationnelle, axiomatique, par machines à états finis… V. Développement : Une fois qu'une spécification a été développée, elle peut être utilisée comme référence pendant le développement du système concret (mise au point des algorithmes, réalisation en logiciel et/ou circuit électronique). Par exemple: Si la spécification formelle est dotée d'une sémantique opérationnelle, le comportement observé du système concret peut être comparé avec le comportement de la spécification (qui elle-même doit être exécutable ou simulable). De plus, une telle spécification peut faire l'objet d'une traduction automatique vers le langage cible. Si la spécification formelle est dotée d'une sémantique axiomatique, les préconditions et postconditions de la spécification peuvent devenir des assertions dans le code exécutable. Ces assertions peuvent être utilisées pour vérifier le fonctionnement correct du système pendant son exécution (ou 49 simulation), ou mieux encore des méthodes statiques (preuve de théorème, model-checking) peuvent être utilisées pour vérifier que ces assertions seront satisfaites pour toute exécution du système. VI. Vérification : Une spécification peut être utilisée comme base pour prouver des propriétés sur le système. La spécification est le plus souvent une représentation abstraite (avec moins de détails) du système en développement: débarrassé de détails encombrants, il est en général plus simple de prouver des propriétés sur la spécification que directement sur la description complète et concrète du système. Certaines méthodes, comme la Méthode B, s'appuient sur ce principe: le système est modélisé à plusieurs niveaux d'abstraction, en partant du plus abstrait et en allant au plus concret (ce processus est appelé « raffinement » puisqu'il ajoute des détails au fur et à mesure); la méthodologie assure que toutes les propriétés prouvées sur les modèles abstraits sont conservées sur les modèles concrets. Cette garantie est apportée par un ensemble de preuves dites «de raffinement ». VII. Les types des méthodes formelles : Approche basée sur des états Z voir Notation Z SAZ Méthode B classique voir Méthode B ASM TLA+ Approche basée sur des événements Action Systems Méthode B événementielle voir Méthode B VHDL Esterel SDL LOTOS E-LOTOS EB3 Approche basée sur les contrats Eiffel Algébriques: Larch :Larchfamily CASL : Common AlgebraicSpecificationLanguage Autre approche Coq (logiciel) Réseau de Petri Algèbre de processus 51 VII. Principaux outils : ACL2: démonstration de théorèmes automatisée. AtelierB: spécification et preuve avec la méthode B. CADP: construction et analyse de processus distribués Coq: assistant d'aide à la preuve (c'est-à-dire formalisation de preuves et démonstration semi- automatisée). Murφ: démonstration de propriétés. Prototype Verification System: assistant d'aide à la preuve. SMV, nuSMV: démonstration de propriétés avec BDDs et SAT. zChaff : démonstration avec SAT. VIII. Conclusion : Dans ce chapitre, nous avons étudié les approches formelles et nous devons inclure les avantages et les inconvénients pour savoir qui est familier avec la façon d'utiliser cette méthode, afin d'obtenir un programme précis, et sans erreur, et contribuer ainsi à donner l'image exacte et précise du programme. Nous abordons dans la section suivante pour un type de programme officiel, une méthode B une façon formelle de penser à des systèmes complexes et le développement de logiciels, et nous allons l'étudier étude approfondie de tous les aspects de son histoire dans les zones utilisées pour se rendre à la table de comparaison entre méthode B et application code Java …. 50 Chapitre III : L’approche proposée 52 I. Introduction : ce chapitre nous présentons méthode B est une méthode de spécification formelle qui permet, grâce à un langage adéquat, d‟exprimer très rigoureusement les propriétés exigées dans un cahier des charges. Il est alors possible de prouver de manière automatisée que ces propriétés sont non ambiguës, cohérentes et non contradictoires. Cela nous permet de garantir ensuite preuve mathématique que ces propriétés sont respectées au fur et à mesure des étapes de conception. nous avons étudier notation b et la représentation théorique , La notion de machine abstraite raffinement , Les étapes de l‟approche en B et en fin nous présentera Tableau de correspondance BJava II. Historique : La méthode B à été introduite au milieu des années 80 par J.-R. Abrial. Sans entrer dans les détails, il est possible de situer B comme une méthode sous-jacente aux méthodes formelles VDM2 et Z3. Cependant, à la différence de ces dernières, B ne se limite pas à la phase de description : elle permet d'établir une chaîne de production qui va de la spécification du programme au code source associé. III .Présentation théorique : L'objectif initial de B est de fournir une technique et des outils associés capables d'aider la construction de logiciels de la façon la plus sûre possible. C'est une méthode transformationnelle : on part d'un modèle abstrait (une machine abstraite) puis on en réduit le niveau d'abstraction, étape par étape (par des raffinements), jusqu'à l'obtention d'un modèle concret, proche du code source (l'implémentation). L'ensemble des composants spécifiant un comportement (du plus abstrait au plus concret) est appelé module. Un module peut dépendre de plusieurs autres modules, les principes de dépendance seront vus par la suite . Il est alors possible, pour un projet (un ensemble de modules) donné, de générer un code exécutable sécurisé, car totalement prouvé. 53 IV. La méthode B: IV. 1. Définition : La méthode B est une méthode de spécification formelle capable de retranscrire de manière rigoureuse les exigences d‟un cahier des charges, au moyen de preuves mathématiques, afin de prouver leurs cohérences. Ce procédé permet notamment de lever toute ambiguïté sur les propriétés initialement exprimées en langage naturel. Le langage B peut être utilisé sur des protocoles comme sur de l‟informatique embarquée. De plus, la méthode B englobe toute la modélisation par la preuve d‟un système, de l‟écriture de son modèle à son implantation logicielle, tout en respectant les données fondamentales d‟origine. Bien que les usages de la méthode B soient divers (modélisation d‟un système, formalisation de spécification …), l‟objectif est le même : s‟assurer de la fiabilité, de la sécurité ainsi que de l‟absence de bugs informatiques d‟un système par des preuves mathématiques. La méthode B tire sa légitimité du développement d‟outils approuvés et utilisés à grande échelle, dans le monde industriel comme universitaire, tels que l‟Atelier B. ClearSy est détenteur de ce dernier et se charge des évolutions et de la maintenance de sa plateforme de développement. L‟Atelier B constitue ainsi une référence pour le développement de logicielsProuvés. Les Principes de B: Il y a 3 ingrédients : modélisation, raffinementet preuve. Le langage B est basé sur la théorie des ensembleset la logique des prédicats. 54 Figure.IV.1: les principe de B Il y a Deux applications : système et logicielle Méthode outillée par CompoSys et des outils de atelier B Méthode outillée par l'atelier B Figure.IV.2: Les application de B. IV.2. Dépendances entre modules : Un projet B est constitué de différents modules reliés entre eux par des clauses de visibilité, dont les plus importantes sont présentées au tableau IV.2. NomDescription INCLU composition de plusieurs machines (utilisé dans les machines abstraites et les DES raffinements intermédiaires). Une machine ne peut être incluse qu'une seule fois dans l'ensemble d'un projet. IMPOR même principe que la clause INCLUDES, mais pour les implémentations. TS USESpartage de données entre machines (aucun accès aux opérations d'une machine utilisée). SEESaccès en lecture seule aux constituants d'une machine (impossibilité d'appeler une opération de modification). tableau IV.2. Clauses de visibilité d'un composant B IV.3. Fondements théoriques : Nous évoquons dans ce paragraphe les principales notions théoriques utilisées dans la méthode B. 55 IV.3.1. La théorie des ensembles et les types : La théorie des ensembles est la base des modèles mathématiques en B. Les relations et les fonctions (partielles ou totales) sont représentées par des ensembles de couples. Les variables sont typées par des prédicats (situés dans l'invariant et les pré-conditions), qui expriment une condition d'appartenance de chaque variable à un ensemble donné. IV.3.2. Le langage des substitutions généralisées : Chaque machine abstraite B englobe un état et fournit des opérations permettant d'accéder à celui-ci ou de le modifier. Les mécanismes qui déterminent ou changent l'état sont appelées substitutions, et l'ensemble des substitutions utilisables dans le langage B pour décrire les initialisations et le corps des opérations constitue le langage des substitutions généralisées. Une substitution modélise ainsi une transaction entre un état pré et un état post, qui correspond, dans les langages de programmation, à une suite d'instructions non interruptible. Les principales substitutions sont : substitution neutre : SKIP, qui aboutit à un état post identique à l'état pré substitution simple : x := E, qui a pour effet d'affecter à la variable x la valeur de l'expression E substitution multiple : x, y := E, F, qui exécute en parallèle les substitutions simples x := E et y := F (on peut également noter x := E || y := F) substitution devient tel que : , qui affecte à x une valeur (indéterminée) de l'ensemble S Les substitutions peuvent ensuite être combinées entre elles au moyen d'opérateurs de composition (par la suite, P et R désignent des prédicats, G et H des substitutions) : 56 Séquencement : G ; H, correspondant ( à l'application successive des substitutions G et H ) substitution pré-conditionnée : P | G, assurant que la substitution G aboutira à un état post correct si le prédicat P est vérifié à l'état pré ( ) substitution gardée : , qui ne peut être appliquée que dans le cas où l'état pré satisfait P ( ) substitution de choix borné : , qui résulte en l'application de l'une ou l'autre (indéterminisme) des substitutions G ou H ( ) substitution de choix non borné : @z.G, correspondant à l'application de la substitution G pour une valeur quelconque (indéterminisme) de la variable z ( , z étant non libre dans R) V. notation B : le raffinage : Raffiner consiste à reformuler les données et opérations d'une machine abstraite à l'aide de données et opérations plus proches de l'implémentation tout en conservant les propriétés de la machine abstraite. -Suppression des pré-conditions -Suppression de l‟indéterminisme 57 -Introduction de la séquence et des boucles * Chaque raffinement donne lieu à une preuve de la validité de la reformulation de la machine abstraite. * La dernière phase de raffinement permet d'atteindre un niveau de pseudo-code que l'outil associé, l'atelier B, peut alors traduire automatiquement dans différents langages (C, Ada, C++). * Le test du logiciel devient inutile, puisque le programme produit est formellement prouvé correct à la spécification initiale. V.2.La notion de machine abstraite: En B On spécifie On prouve On développe On code Une (ou plusieurs) machine abstraite Cette notion est proche de : Type abstrait, Module, Classe, Composant La machine abstraite : Un en-tête (nom ) Des données cachées Des opérations visibles d‟accès à la machine Les clauses d’une MA MACHINE )Nom de la machine abstraite )idem nom de la classe SETS Déclaration des ensembles abstraits et énumérés VARIABLES 58 Déclaration des variables (idem attributs d‟une classe) INVARIANT Typage et propriété des variables INITIALISATION )Définition de la valeur initiale des variables (idem constructeur OPERATIONS )Déclaration des opérations )idem méthodes END L’en-tête : Un nom + optionnellement des paramètres pour la généricité MACHINE calculatrice END Les données : La définition des données s‟appuie sur un langage d‟expressions les symboles désignant les données de base de la machine (ensembles abstraits, variables, constantes…) les expressions booléennes les expressions arithmétiques les ensembles, relations, fonctions, les suites… Ces données sont caractérisées par un invariant Une formule de la logique des prédicats exprimée au moyen de prédicats ensemblistes (appartenance, inclusion…) et de comparateurs arithmétiques. Les opérations : Une en-tête (la signature) liste des paramètres de sortie <-- NOM (liste des paramètres d‟entrée) 59 Une pré-condition Typage des paramètres d‟entrée Conditions nominales de fonctionnement de l‟opération (domaine de définition) Une transformation Définition de l‟opération comme une transformation des données internes et une affectation de valeur aux paramètres de sortie Les transformations: La définition des opérations s‟appuie sur le langage des substitution généralisées La transformation de base est la substitution simple devient égal, notée := Les autres transformations permettent de modéliser le résultat de tous les changements d‟états réalisables par algorithmique Les boucles en particulier sont souvent modélisée par des substitutions indéterministes. Preuve de cohérence : La dernière étape de la spécification consiste à prouver la cohérence de chaque machine abstraite On prouve pour chaque opération que lorsque la machine est dans un état correct Les propriétés invariantes I sont supposées vérifiées lorsque l‟opération est appelée dans des conditions nominales la pré-condition P d‟appel est supposée vérifiée alors sa transformation S amène la machine dans un état correct un état qui satisfait l‟invariant I - Deux étapes de preuve : Calcul de [S]I la plus faible pré-condition Condition minimale garantissant que l‟état de la machine après l‟opération respecte l‟invariant On applique simplement la substitution S à la formule I On prouve que les conditions initiales (invariant et pré-condition) impliquent cette plus faible pré- condition Pour chaque opération, la formule dont il faut établir la validité est donc de la forme I P [S] 61 V.3. Les étapes de l’approche en B : Parmi les caractéristiques de B , nous citons la preuve qu 'elle nous apporte dans la spécification d'un système. En fait à quoi revient à faire une démonstration de preuve en B, et quel intérêt nous apportet-elle? Ce qui est démontré dans une preuve d'une MA c'est que les pré conditions citées dans ses opérations doivent préserver l'invariant de la machine qui est en fait la conjonction de l'ensemble des variables nécessaires dans le système à développer (propriétés souhaités du système ); lors de la définition des opérations il ne faut en aucun donner un prédicat qui contredit l 'invariant de la MA, ce qui peut se déduire de cela : l'échec d'une preuve alors que le modèle B (fig V.3) est cohérent montre la non faisabilité d'une partie du cahier des charges et ce très tôt dans le cycle de vie du système .La démonstration de preuve d'un système formalisé avec B permet d'établir la cohérence totale du cahier des charges. Dans la figure ci-dessous nous schématisons la modélisation d‟un système d‟information durant tout son cycle de vie par B [MH.98]. Figure .IV.3. Modèle en B. V.3.1.formalisation : les besoins sont réécrits dans un formalisme mathématique plus ou moins formel . V.3.2.approbation : En cas de conflit avec l'utilisateur sur des données ou des traitements, il est recommandé de revoir le cahier des charges. V.3.3.structuration : L'analyse du système permettra sa structuration en sous-systèmes clairs et analysables appelés en B par machine abstraite(élément de base d'une modélisation B). 60 V.3.4.traçabilité : Les propriétés logiques présentes dans l'analyse du système et dans le modèle B doivent être littéralement identiques. V.3.5.développement B : Au fur et à mesure que les raffinages successifs s'effectuent sur le modèle abstrait (développement B ) nous constatons la constitution progressive d'un code de programme exécutable du système à développer. La démonstration de preuve dans la phase de raffinage assure dans un sens le respect du modèle abstrait jusqu‟à l‟implantation finale du système. Figure .IV.4. La preuve Dans le cas d‟échec de la preuve (Figure.V.3.5) ,ce qui revient à ce que un prédicats cité dans une des opérations de la MA ne préserve pas son invariant ,il faut donc revoir la spécification des opérations. Une autre possibilité, dans le cas où le modèle B est tout à fait correct donc ce qu„il faut revoir c‟est le cahier des charges qui aurait dû être mal rédigé . B en pratique: On définit les données internes de la machine et leurs propriétés invariantes ; On définit les opérations d‟accès à la machine : pré-condition et transformation ; L‟atelier vérifie la syntaxe et le typage ; L‟atelier calcule les plus faibles pré-conditions et génère les preuves à faire ; L‟atelier tente de les prouver automatiquement ; Si certaines preuves n‟ont pas été démontrées, on détermine si : 62 1. l‟opération est incorrecte et on corrige 2. le prouveur n‟est pas assez « fort » et on aide le prouveur à VI. Le langage de modélisation : Expression de variables, constantes, opérations, invariants, théorèmes, · · · 1. Théorie des ensembles : SIEGES = 1..nb_max occupes ⊆ SIEGES 2. Fonctions, relations : etat∈ SIEGES → BOOL etat−1fonction réciproque. 3. Logique des prédicats : occupes = etat−1[{TRUE }] x ∈ 1..1280 ∧ y ∈ 1..1024 Des opérations sont définies pour manipuler et construire des ensembles, relations, fonctions, et prédicats 4.Substitutions généralisées : Elles permettent de décrire les changements d‟état La développement d'un systèmes : 63 Figure.IV . 5 . Développement B d'un systèmes informatiques V. Extraction d’un modèle B-évent : Objectif : projeter l‟aspect comportemental du système interactif en un modèle B-évent. Représenter l‟exécution des méthodes de listeners comme un ensemble de processus séquentiels composés d‟affectations... Solutions : 1. Retro-concevoir la BAO Swing (B Swing). 2. Annoter le code source. 3. Utiliser un modèle intermédiaire : In-lining, abstraction... 4. Traduire le modèle intermédiaire en B-évent en important le modèle B Swing. Figure V.5: Méthode d‟extraction d‟un modéle B-évent. 64 IV. Les règles de traductions : La traduction (descendant/ascendant) en B nécessite des règles de traduction pour représenter ces structures de contrôle. IV.1. La traduction descendante (UML-B) : Capturer l‟aspect comportemental (diagrammes d‟activités) des processus de l‟application. Puis représenter l‟exécution des activités de l‟application comme un ensemble de processus (séquentiels ou parallèles composés d‟affectations) en B. Ces affectations sont ordonnancées par un ensemble de structures de contrôle : composition séquentielle, boucles, if then else… IV.2. La traduction ascendante (JAVA-B) : Capturer l‟aspect comportemental de code source (JAVA) .Puis représenter l‟exécution des ces instructions comme un ensemble de processus : séquentiels ou parallèles composés d‟affectations en B. Figure.V.2. La traduction ascendante (JAVA-B). IV.3. Les règles de codage (B-JAVA) : 65 Les spécifications abstraites (B), sont raffinées jusqu‟à l'obtention du niveau d'abstraction (en langage B) correspondant à la formalisation des concepts du code source JAVA. Ce niveau d‟abstraction a été défini comme un ensemble d‟affectations. Ces affectations sont ordonnancées par un ensemble de structures de contrôle en JAVA : composition séquentielle, boucles, if then else… Figure.V.3. Les règles de codage (B-JAVA). IV.4. Tableau de correspondance B-Java : Le tableau qui suit présente quelques fonction en java est transformée en méthode B. Fonction Structures if Appels d’opération en B Utilisation de l’ELSIF Java if (expr) { bloc1else bloc2 x = Math.sqrt(Math.abs(y)); if (expr1s) { bloc1elseif (expr2s) bloc2 ...else if (exprns) blocnelseblocd } Méthode B IF expr THEN bloc1 ELSE bloc2 END VAR tmp IN tmp←abs(y) ; x ← sqrt(tmp1) END IF expr1s THEN bloc1 ELSEIF expr2 s THEN bloc2 ... ELSEIF exprns THEN blocn 66 ELSE blocd END switch (expr) CASE expr OF Structures { EITHER c1 THEN bloc1 switch case c1: OR c2 THEN bloc2 bloc1break = new . . . bloc1(); OR cnTHEN blocn case c2: ELSE blocd bloc2break = new bloc2(); END ...S case cn:blocnbreak; default: blocdbreak} WHILE expr Structures whilewhile (expr) { DO bloc Bloc INVARIANT expri VARIANT exprv END VAR first IN Structures do do { first := TRUE ; bloc while (expr) WHILE first = TRUE ˅expr DO first := FALSE ; bloc INVARIANT expri VARIANT exprv END END 1 2 bloc1 ; Structures for for (bloc ;expr;bloc ) { WHILE expr 3 bloc DO bloc3 ; bloc2 INVARIANT expri VARIANT exprv END SETS IDSINT = {x, y} Modélisation de int x = 0; VARIABLES valsint variables entières) int y; INVARIANT valsintϵ IDSINT →SINT INITIALISATION valsint := {x →0}; OPERATIONS Wsint(i, v) PRE I ϵ IDSINT ˄ v ϵ SINT THEN valsint(i) := v END ; out ←Rsint(i) PRE i ϵdom (valsint) THEN out := valsint(i) END 67 publicclassGlobalMembers { publicstaticcpl c1 = newcpl(); publicstaticcpl c2 = newcpl(); } publicclasscpl { publicint x; publicbyte y; } x = Math.sqrt(3 * x); Traduction d’une expression) Structures et fonctions de valuations) public classP_converter Validation formelle de Java / implements ActionListener { private JButton XY,YX; Swing, des private JTextField output; interfaces utilisateur avec le Bpublic P_converter(){ … Méthode output=new JTextField(); événement XY= new JButton(“X>Y”); FE=new JButton(“Y->X”); XY.addActionListener(this); YX.addACtiolistener(this); XY.setEnabled(false); YX.setEnabled(false); } … public void actionPerformed(ActionEvent e) { output.setVisible(true); if(e.getSource()==XY){ XY.setEnabled(false); YX.setEnabled(true); result=convert(input.getText() ,true); ouput.setText(result);} else { XY.setEnabled(false); YX.setEnabled(true); result=convert(input.getText() ,true); SETS IDCPL = {c1, c2} VARIABLES valcplx, valcply INVARIANT valcplx ϵ IDPOINT → SINT ˄ valcply ϵ IDPOINT→ SCHAR INITIALISATION valcplx = ɸ; valcply = ɸ VAR tmp IN tmpmul(3, x_L) ; x_Lsqrt_G(tmp) END INITIALISATION widgets := {YX,XY,output…} || listeners := {list1,…} || W_att:={output → (false,false, ɸ) XY → (false,false,{list1}) YX → (false,false,{list1}) …} || UA :∈struct(source ∈ widgets,…) || V_aP := 1 || ... EVENTS Action_Performed_list1_1= SELECT V_aP=0 ∧UA‟source=XY∧ list1 ∈w_att(UA‟source)‟lists ∧ L_att(list1)‟id=ActionListener∧ UA‟typ=ActionPerformed THEN V_aP := 0 || W_att(output)‟visible := true || W_att(FE)‟enabled := false || W_att(EF)‟enabled := true || Jtf_att(output)‟value := result END; ActionPerformed_list1_2= SELECT V_aP=1 ∧ not(UA‟source=XY) ∧ list1 ∈ W_att(Au‟source)‟lists ∧ L_att(list1)‟id=ActionListener∧ UA‟typ=ActionPerformed THEN V_aP := 0 || 68 W_att(output)‟visible := true || W_att(EF)‟enabled := false || W_att(FE)‟enabled := true || Jtf_att(output)‟value := result END; Tab.1.comparation entre java et méthode B. ouput.setText(result);} } } VII. Conclusion : Nous avons analysé dans cette section la méthode b afin d‟appliquer ces caractéristiques pour la vérification et la validation d‟une application Java, et afin de capturer avec précision les spécifications des exigences, en utilisant évidence mathématique pour prouver la cohérence de leur propre et nous devons donner table de comparaison entre méthode B et le code Java . Dans le chapitre suivant, nous allons donner une idée claire sur la conversion et un exemple d'une application Java à Méthode b et déboguer le programme. 69 Chapitre IV : Etude de cas et Implémentation 71 I. introduction: Notre approche pour vérifier un programme écrit en Java a été présentée en détails au cours du chapitre précédent. Pour illustrer les différentes idées et concepts inclus dans notre proposition nous allons présenter un exemple sous la forme d‟une étude de cas. Nous allons choisir la réservation de voyages en ligne comme un domaine d‟application. II. Outils B: Ce partie a pour but de présenter les différentes fonctionnalités offertes par l'Atelier B. L'Atelier B est un ensemble d'outils logiciels permettant le développement d'applications suivant la méthode B. [CS.01] L'Atelier B assiste le concepteur dans la formalisation de son application: nombre d'actions dictées par la méthode, des développements industriels, comme la gestion, l'analyse et la documentation d'un projet. II.1. Objets manipulés par l'Atelier B : Nous introduisons dans ce paragraphe les principaux objets manipulés par les fonctions de l'Atelier B. Composant : Fichier contenant un source écrit en langage B. Il constitue la base d'un développement suivant la méthode B. Un composant est un terme générique et représente : ation B (machine abstraite), II. Environnement de travail : L‟Atelier B est l‟outil industriel qui permet une utilisation opérationnelle de la méthode formelle B pour des développements de logiciels prouvés sans défaut (logiciel formel). Il est disponible en deux versions: une version communautaire accessible à tous sans limitation, une version maintenue accessible aux possesseurs d‟un contrat de maintenance. Il est utilisé pour le développement des automatismes sécuritaires des différents métros développés dans le monde par Alstom et Siemens et d‟autres part, pour la certification selon la 70 norme « Critères Communs » et le développement de modèles systèmes par ATMEL et STMicroelectronics. Il a par ailleurs été utilisé sur plusieurs autres secteurs comme celui de l‟automobile pour la modélisation des principes de fonctionnement de l‟électronique embarquée de 3 modèles de voiture. L‟Atelier B est aussi utilisé dans le secteur de l‟aéronautique et de l‟aérospatial. Il existe deux ateliers de génie logiciel qui permettent la mise en oeuvre de la méthode B dans des projets industriels : l'AtelierB, diffusé par la société française ClearSy, et le BToolkit de la société britannique B-Core. Tous deux disposent d'outils pour : l'analyse lexicale des composants le contrôle de types la génération d'obligations de preuve la démonstration automatique des propriétés la démonstration interactive des propriétés la traduction en langages de programmation impératifs (C, C++ ou ADA) la gestion et la documentation des projets Figure V.1: méthode B dans l'environnement d'Atelier B. 72 III.1. Objets manipulés par l'Atelier B : Nous introduisons dans ce paragraphe les principaux objets manipulés par les fonctions de l'Atelier B. Composant : Fichier contenant un source écrit en langage B. Il constitue la base d'un développement suivant la méthode B. Un composant est un terme générique et représente : _ soit une spécification B (machine abstraite), _ soit un raffinement de cette spécification, _ soit son implémentation (dernier niveau de raffinement). La saisie des composants est réalisée gâce à l'éditeur de texte de la station de développement. Projet : Ensemble de fichiers (composants, fichiers annexes sources C, C++, HIA, ou ADA, makefiles) utilisés ou produits durant le développement d'une application suivant la méthode B, complété des informations nécessaires à la gestion de ces _chiers sous l'Atelier (voir BDP). Utilisateur : Il est nécessaire de dé_nir une liste d'utilisateurs autorisés à accéder et modi_er le projet. Notez que tous les utilisateurs ont les mêmes pouvoirs, et qu'il est nécessaire qu'au moins un utilisateur soit renseigné. Base de Données Projet (BDP) : Toutes les informations internes nécessaires à la bonne exécution des outils de l'Atelier B sont stockés dans un répertoire nommé BDP. Ce répertoire contient aussi des fichiers produits par les outils de documentation de l'Atelier B. III.2. Modes d'utilisation de l'Atelier B Nous appelons Outils B les outils liés à l'application de la méthode B, ainsi qu'à l'analyse, la mise au point et la documentation de logiciels écrits en B. L'environnement B , propose deux modes d'utilisation des outils B : Un mode interactif, utilisant une interface graphique à base de fenêtres et de boutons de commande ; dans la suite du document nous appellerons ce mode interface utilisateur graphique, Un mode programmé, reposant sur un langage appelé langage de commande; dans la suite de ce document, nous appellerons cette interface interface utilisateur mode commande. 73 III.3. Présentation générale : A) Interfaces L'interface graphique de l'Atelier B se décompose en deux parties majeures : l'une est dédiée à la gestion des projets B, et l'autre permet une édition aisée via un éditeur spécialement conçu pour assister l'utilisateur dans son développement B. Nous aborderons par la suite les détails de l'utilisation de ces dernières. IHM principale : L'interface principale se présente de la façon suivante : Figure : C'est à partir de cette interface que la majeure partie de la gestion des projets B s'effectue. Éditeur intégré : 74 L'Atelier B est livré avec un éditeur spéci_quement adapté à l'édition de composants B. Celui-ci propose des fonctionnalités comme l'auto-complétion de mots-clé, le soulignement en cas d'erreur, etc. Un aperçu de la fenêtre est donné ci-dessous : Figure : Une navigation par onglets entre les fichiers. Il inclut en outre un tableau permettant l'insertion aisée des symboles B. Ce dernier s'utilise comme un éditeur de texte classique et a été conçu de façon à rendre son utilisation intuitive. III.4 : Pour démarrer : Cette paragraphe décrit plus particulièrement la démarche générale permettant d'utiliser les fonctions de l'Atelier B. → En résumé, afin de démarrer un développement avec l'Atelier B, vous devez : 75 1. Créer un projet, 2. Ouvrir ce projet, 3. Ajouter des composants à ce projet. Ou plus simplement, si vous disposez d'une archive de projet, vous pouvez restaurer cette dernière et commencer à travailler. → Une fois ces étapes accomplies vous pouvez commencer à appliquer la méthode B sur vos composants ; il est possible de : 1. Effectuer l'analyse syntaxique et le contrôle de types, 2. Générer les obligations de preuve, 3. Démontrer automatiquement une partie de ces obligations de preuve, 4. Afficher les obligations de preuve, 5. Utiliser le prouveur interactif pour démontrer les obligations de preuve restantes → Après avoir créé les implémentations de votre projet, vous serez en mesure de : 1. Contrôler le langage des implémentations, 2. Traduire le projet en langage cible en utilisant un traducteur. → Lors de ces phases du développement, utilisez les fonctions d'analyse de l'Atelier B, pour : 1. Afficher l'état d'avancement du projet ou d'un composant, 2. Afficher des graphes de dépendances entre les composants, Vous pouvez également utiliser des fonctions de documentation pour produire automatiquement des documentations au format des traitements de texte LATEX, PDF, ou RTF. → Lorsque vos projets atteignent une taille importante, vous pouvez : 1. Les archiver pour en faire des sauvegardes, 2. découper vos gros projets en plusieurs petits projets en utilisant la notion de bibliothèques. IV. Présentation de notre exemple: Une agence de voyages (service01) fournit les trois services suivants : réservation de billets d‟avion (service02), réservation de chambres d‟hôtel (service03) et de location de voiture (service04). Afin de fournir ces services à ses clients, l‟agence doit établir des liens avec d‟autres services : compagnies aériennes, des hôtels, des compagnies de location de voiture et des banques 76 (service05) pour faciliter les transactions financières entre les clients et l‟agence de voyages et entre l‟agence et les autres partenaires. A cet effet cinq services web peuvent être proposés : WS-AV: fournit une interface avec le client, et établir des liens avec les autres services, WS-VOL : permet de réserver les vols selon une date précisée, la ville de départ et d‟arrivée et le nombre de personnes. WS-Hotel : permet de réserver les chambres d‟hôtel selon la date et la ville précisé et le nombre de personnes. WS-LV : permet de réserver les voitures selon une date précisée et les nombres de jours. WS-Bank : permet à l‟agence et les clients de payer les différentes réservations. La figure suivante présente les services de notre exemple : Figure V.2: interface d‟agence de voyageAlors… 77 Figure IV.3 : plan simplifier de système. Dans cet exemple le service (WS-AV) est la composition de quatre services (WS-VOL, WS-Hôtel, WS-LV et WS-Bank). Donc le service WS-AV a comme rôle d‟organiser le voyage par internet. Le service fournit aux clients une interface pour saisie les informations suivantes: Date de départ, date de retour, ville départ, ville arrivé et nombre de personnes et retournera les billets et le prix total de voyage . Le scénario interne qui dirigera les interactions entre les services est le suivant : Le service WSAV va d‟abord connecter à la fois les services WS-Hôtel et WS-VOL à travers ses méthodes respectivement reserveCHam() et reserveVol().En suite et après assurer les réservations présédents, elle va connecter au service WS-LV par la méthode reserveVoiture().En fin elle va envoyer le prix de chaque service au service WS-Bank pour calculer le prix total et payer par sa méthode payer( ) comme le montre le diagramme d‟activité UML suivant. 78 Figure IV.4: le diagramme d‟activité UML. Java-Swing program: public class ChoixTransport extends JFrame implements ActionListener, KeyListener private JTextField input,output ; JButton WS-ALR,WS-TR ; DC ChoixTransport dc ; public P ChoixTransport() { Initialize() ; subscribe() ;} public void Initialize(){ /*Widgets creation*/ input=new JTextField() ; output=new JTextField() ; WS-ALR= new 79 JButton("AIRLINE RESERVATION") ; WS-TR=new JButton("TRAIN RESERVATION") ; /* Widgets initialization */ WS-ALR.setEnabled(false) ; WS-TR.setEnabled(false) ; output.setEnabled(false) ; this.setVisible(true) ;} /*listeners subscriexion*/ public void subscribe() { input.addKeyListener(this) ; WS-ALR.addActionListener(this) ; WS-TR.addActionListener(this) ;} ; public void desactivateEF(boolean b){ WS-ALR.setEnabled( !b) ; WS-TR.setEnabled(b) ;} /* Accessor and modifior */ public String getInput() {return input.getText() ;} public void setOutput(String s) {output.setText(s) ;} /* Listener methods */ public void actionPerformed(ActionEvent e) {if (e.getSource()==WS-ALR) controler.WS-ALRConvert(true) ; if (e.getSource()==WS-TR) {dc.WS-TRConvert(false) ;} 81 public void keyPressed(KeyEvent e){} public void keyReleased(KeyEvent e){} public void keyTyped(KeyEvent e){} } Java-Swing program en méthode B : DEFINITIONS Strings == {no_text, value } ; JTextField input,output ; JButton WS-ALR, WS-TR ; Listener lis1; INITIALISATION lis1.typs : ActionListener, KeyListener ; input.visible = true ; input.enabled = true ; input.addKeyListener =(lis1); output.visible = false ; output.enabled = false ; WS-ALR.text=" WS-ALR -> WS-TR " ; WS-TR.text=" WS-TR -> WS-ALR " ; WS-TR.addActionListener =(lis1) ; WS-ALR.enabled = false; WS-TR.enabled = false ; WS-ALR.addActionListener =(lis1) //OPERATIONS EVENTS Evt_ActionPerformed_lis1 = SELECT UserAction'source ∈ { WS-TR, WS-ALR }∧ widgets_att(UserAction'source)'enabled = TRUE ∧ widgets_att(UserAction'source)'visible = TRUE ∧ UserAction'list=lis1 ∧ UserAction'typ=ActionEvent ∧ ∧ EVStart=1 THEN Jtextfields att(output) 0text := Text k widgets att(output) 0visible := true k EVStart := EVStart-1 END ; Evt ActionPerformed list1 1 = SELECT EVStart= 0 ∧ UserAction'source= WS-ALR THEN widgets att(WS-TR) 0enabled := true k widgets att(WS-ALR) 0enabled := false END Evt ActionPerformed list1 2 = SELECT 80 EVStart= 0 ∧ not(UserAction’source= WS-ALR) THEN widgets att(WS-TR) 0enabled := false k widgets att(WS-ALR) 0enabled := true END Bibliothèque : MACHINE b_swing /* transport * Author: aci * Creation date: 25/05/2015 */ SETS /* Abstrait Sets */ STRINGS = {Text,No_Text } ; LISTENERS ; LISTENERS_typ = {ActionListener, KeyListener} ; EVENTS_id = {ActionPerformed, KeyPressed, KeyReleased } ; EVENTS_typ = {ActionEvent, KeyEvent } ; WIDGETS ABSTRACT_VARIABLES /* Sets to describe application Instances */ widgets, JButtons ,JTextFields, listeners, /* Total Functions to describe Attributes of instances*/ w_att, JB_att,JTF_att,l_att, /* Event Buffer : representation of JVM events */ User_Action, method_of , typ, idd ,set1 ,set2 INVARIANT /* Typing Predicates */ widgets ⊆ WIDGETS ∧ JButtons ⊆ WIDGETS ∧ JTextFields ⊆ WIDGETS ∧ listeners ⊆ WIDGETS∧ //... w_att ∈ widgets → struct(visible :BOOL, enabled :BOOL, lists:ℙ(listeners))∧ JB_att ∈ JButtons → struct(text :STRINGS /*/...*/) ∧ JTF_att ∈ JTextFields → struct(text :STRINGS/*...*/) ∧ l_att ∈ listeners → struct(typs : ℙ (LISTENERS_typ))∧ User_Action ∈ struct(typ :EVENTS_typ, idd : EVENTS_id, :widgets)∧ source /* consistence invarants */ widgets = JButtons ∪ JTextFields∪ listeners ∧ ∀ (set1 , set2 , set3).(set1 ⊆ JButtons ∧ set2 ⊆ JTextFields ∧ set3 ⊆ listeners ⇒ set1 ∩set2 ∩ set3 = ∅) END En Pratique : 82 Figure IV.6: interface agence de voyage. Figure IV.7: code machine b_swing. Après… 83 Figure IV.8: vérification de type et raffinement. Figure IV.9: opération le preuve. 84 Figure IV.10: fin l'opération le preuve. Figure IV.11: table classique d'un composant . V . Conclusion : Dans ce chapitre, Nous avons proposé une étude, pour bien illustrer l'approche proposée dans les chapitre IV et pour éclaircir la possibilité d‟intégrer ce type des systèmes complexes dans le cadre de la méthode formelle B. 85 Conclusion générale 86 C et mémoire décrit une approche formelle de développement d‟applications java . Cette approche est basée principalement sur la technique de raffinement B. Le processus de raffinement décrit dans ce papier est dédié à la génération d‟une implémentation relationnelle à partir de spécifications formelles B qui traduisent les données et fonctionnalités d‟une application java . Nous avons défini un ensemble de règles qui permet non seulement le raffinement des données mais aussi des opérations associées. En utilisant le prouveur de l‟AtelierB (version 4.2.1), l‟ensemble des règles définies dans ce processus a été prouvé , donnant lieu à des scénarios de preuves génériques et donc réutilisables par instanciation. L‟approche présentée dans cet mémoire présente plusieurs avantages • réduction du coût de développement : automatisation des phases de spécification et de raffinement • normalisation du code généré : les deux phases de traduction et de raffinement sont dictées par des règles précises et déterministes. Cette normalisation de code offrira une meilleure compréhension et maintenance du code ainsi produit . Nos travaux actuels portent sur la réalisation d‟un outil de raffinement automatique. Cet outil viendra compléter l‟outil, , permettant la traduction quasi automatique des application java en spécifications B. L‟outil complet, ainsi obtenu, aura pour but d‟assister le concepteur durant le processus de développement de ses applications. Un tel outil déchargera le concepteur des différentes phases manuelles et surtout coûteuses du processus de développement d‟une application java. Nous travaillons aussi sur le processus de réutilisation des différentes preuves élémentaires (chaque preuve élémentaire est associée à une règle de raffinement) lors de l‟établissement de preuves plus complexes associées à la composition de plusieurs règles de base Nos propositions ouvrent plusieurs perspectives scientifiques à court et à plus long terme. Nous soulignons ici certaines de ces perspectives: - La réalisation d‟un outil de traduction automatique. Cet outil viendra compléter cet outil, permettant la traduction automatique des diagrammes UML et en spécifications B. - Nous travaillons aussi sur les mêmes idées afin de les appliquer sur l‟autre aspect technologique des applications Web qu‟est BPEL4SW. 87 Bibliographie Bibliographie [MD.14]: Jean Michel DOUDOUX : Développons en Java v 2.00 Copyright (C) 1999-2014 Jean-M ichel DOUDOUX [GL.94] : Maintenance ATELIER B Europarc de PICHAURY CLEARSY 0331 Av. J.R. Guilibert Gauthier de la Lauziere - Bat C2 03831Aix-en-Provence Cedex 3 France.1994 [MG.12]: Mahdi Gueffaz. ScaleSem : Model Checking et Web S´emantique. Symbolic Computation. Université de Bourgogne, 2012. French. [AC.98]: Alexandre Cortier ONERA - Office National d‟´etude et de Recherche A spatiales 1998. 88 Webographie [web.02] http://www.dicofr.com/cgi-bin/n.pl/dicofr/definition/20010101002329 [web.01] http://rmdiscala.developpez.com/cours/LesChapitres.html/Java/Cours1/Chap1.2.htm [web.3] http://home.gna.org/brillant/2004-Moniot/B-mf.html [web.4] http://fr.wikipedia.org/wiki/Model_checking [web.5] http://www.scribd.com/doc/241156624/Advantage-and-Disadvantage-of-zLanguage#scribd [web.6] http://www.inrialpes.fr/vasy/cadp/ 89 Glossaire ANSI : Agence Nationale De Sécurité Informatique API : Application Programming Interface CADP: Construction et Analyse De Processus Distribués CASL : Common Algebraic Specification Language JCA : Java Cryptography Architecture JCE : Java Cryptography Extension JDK : Java Development Kit JFC : Java Foundation Classes RDP: Réseau De Petri. JVM : Java Virtual Machine J2ME : Java Micro Edition J2RE : Java 2 Runtime Environnent J2SDK : Java 2 Software Développent Kit J2SE : Java Standard Edition MA : Machine Abstraite OMG : L'Object Management Group RDP: Réseau De Petri. UML: Unified Modeling Language JNDI (Java Naming and Directory Interface) : JMX (Java Management Extensions) : JSTL (Java server page Standard Tag Library) 91 90