Cours Java 2 l'essentiel des concepts et pratiques pour reviser et s'entrainer


Télécharger Cours Java 2 l'essentiel des concepts et pratiques pour reviser et s'entrainer
3.53.5 étoiles sur 5 a partir de 1 votes.
Votez ce document:

Télécharger aussi :


Cours Java 2 l'essentiel des concepts et pratiques pour réviser et s'entraîner

...

I.1 Qu’est-ce que Java, en trois lignes

Le début de l’ouvrage de référence, The Java Language Specification par J. Gosling, B. Joy et G. Steele [GJS96] résume fort bien l’esprit dans lequel le langage a été conçu ainsi que le but poursuivi : “JAVA is a general purpose, concurrent, class-based, object-oriented language. It is designed to be simple enough that many programmers can achieve fluency in the language. Java is related to C and C++ but is organized rather differently, with a number of aspects of C and C++ ommited and a few ideas from other languages included. Java is intended to be a production language, not a research language, and so, as C.A.R. Hoare suggested in his classic paper on language design, the design of Java has avoided including new and untested features.”

...

1.3 Naissance de Java

  • Java hérite principalement sa syntaxe (procédurale) du C.
  • Langage généraliste, aussi versatile que C++.
  • Plusieurs simplifications notables par rapport au C++.
  • Très vaste bibliothèque de classes standard (plus de 3000 classes dans plus de 160 paquetages pour le JDK 1.5)
  • A partir de 1993, chez Sun, développement pour créer un langage adapté à Internet.
  • En 1995, annonce officielle de Java (concu, entre autres, par James Gosling, Patick Naughton, Crhis Warth, Ed Frank, Mike Sheridan et Bill Joy).
  • Milieu 1996, sortie de Java 1.02, première version distribuée par JavaSoft (filiale de Sun).
  • Début 1997, sortie de Java 1.1. Beaucoup d’améliorations significa-tives. Première version à être jugée sérieuse du langage.
  • Été 2004, sortie de Java 1.5; diverses améliorations et ajouts intéressants.

1.4 Adaptation au web (I)

  • Pourquoi le caractère “embarqué” initial de java est-il bien adapté au Web (transfert de pages HTML et exécution de programmes distante via Internet) ?
  • Le schéma client/serveur classique est le suivant :[-2.5ex]

– envoi de requête du client vers le serveur, – traitement de la requête par le serveur, – envoi de la réponse du serveur au client.

1.5 Adaptation au web (II)

Inconvénients de ce schéma :[-2.5ex]

  • temps de transmission souvent lents.
  • Les serveurs peuvent être chargés (beaucoup de clients à servir).
  • les clients sont, par contraste, assez fréquemment peu chargés.

1.6 Adaptation au web (III)

Þ Calculs coté client via des applets : plutôt que d’exécuter le programme et de transmettre la réponse, le serveur transmet le programme. Le programme s’exécute localement sur le client. Ainsi :

[-3ex]

  • le programme s’exécute sur une machine moins chargée,
  • le seul retard est le temps de transmission initial du programme. Lorsqu’il y a plusieurs requêtes, la 1ere prend du temps, les suivantes ne souffrent pas du transfert via Internet.

1.7 Interpéteurs de bytecode

  • Client et serveur peuvent être sur 2 ordinateurs (processeurs) de types dif¬férents, avec des OS différents. => Le source java doit être traduit en un bytecode indépendant de la plate forme logicielle et matérielle. Ce byte-code (code dont les instructions sont longues d’1 ou 2 octet) est un langage sur une machine imaginaire, une machine virtuelle. Ressemble à un assem¬bleur générique.
  • Transformation du bytecode en code machine via : [-3ex]

– des interpréteurs.

– des compilateurs “juste-à-temps” (JIT : Just In Time) de performances plus proches d’un exécutable C ou C++ classique.

  • Apparition de compilateurs natifs, c.à.d. transformant du code source Java en code machine natif pour tel ou tel processeur (jove ; cygnus, au dessus de gcc, ... ).

1.8 Sécurité

  • Un programme s’exécutant sur un serveur ne peut faire beaucoup de dégâts sur la machine client. Un programme s’exécutant coté client peut, en théorie, avoir accès à beaucoup de ressources, d’où un danger.
  • => gestionnaire de sécurité, sur le client, limitant les actions possibles du programme envoyé par le serveur. Par ex., interdiction d’accéder au système de fichiers ou de transmettre à d’autres que le client ou le processeur du serveur.

II.2 Manifeste en 11 points 2.1 “White paper description”

Java est un langage :

  • simple,
  • orienté objet,
  • réparti,
  • interprété (ou compilé),
  • robuste,
  • sûr,
  • indépendant de l’architecture,
  • portable,
  • efficace
  • multitâches ou multi-activités (multi-thread) et
  • dynamique.

2.2 Java est simple

  • e` Plus simple que C++ :

– Nombreux mots clés éliminés.

– Pas de pré-processeur.

– Bibliothèque très étendue et directement intégrée au langage.

– Pas de surcharge d’opérateurs, de fonctions indépendantes, de goto, de structures, d’unions ni de pointeurs.

– Pas de fichiers d’en-tête.

– Pas d’héritage multiple; à la place, notion d’interface, venant d’Objective

  1. Bien moins complexe.
  • e` Pas de pointeurs visibles au niveau du programmeur. Bien sûr, en interne, les pointeurs sont largement utilisés; mais ceci est caché pour l’uti¬lisateur.

2.3 Java est orienté objet

Les langages C++ et Object Pascal ont construit des caractéristiques orientées objet au dessus d’un langage qui ne l’est pas.

En java, on est forcé de faire de l’orienté objet et des bénéfices comme l’encapsulation et la réutilisabilité sont faciles à obtenir.

2.4 Java est réparti

  • Java a été construit avec Internet en tête. Riche bibiothèque pour

– l’accès aux URL (Universal Resource Locators),

– la programmation client/serveur via des sockets TCP et UDP,

– l’exécution de méthodes distantes (RMI : Remote Method Invocation). – la conception d’applications réparties selon le modèle d’espaces (issus du langage Linda) avec JavaSpaces,

– la gestion de serveurs Web via les Servlets,

– la communication d’objets distants inter-langages avec des IDL (Interface Definition Language) CORBA (Common Request Broker Ar¬chitecture),

 – l’administration de réseaux via SNMP (Simple Network Management Protocol) avec JMAPI.

2.5 Java est interprété (ou compilé)

  • Le source java est éventuellement transformé en un assembleur d’une ma¬chine imaginaire, une machine virtuelle. Cet assembleur, ou bytecode, peut être interprété. Désavantage : lenteur d’exécution.
  • => Notion de compilateur “à la volée” ou “juste à temps”. La Traduction du bytecode au langage machine est effectuée juste avant l’exécution.
  • => Performances avoisinant celles des langages compilés classiques. Puis, apparition de compilateurs natifs, avec des performances égales à celles du C.

2.6 Java est robuste

  • e` Gestion des erreurs matérielles et logicielles, via un mécanisme d’exceptions. Exemples : ouverture d’un fichier inexistant, division par zéro, création d’un point de communication réseau (socket) vers une @IP inexistante, ... Le programmeur est forcé de gérer diverses exceptions.
  • e` Gestion automatique de la mémoire; présence d’un ramasse-miettes (pas de possibilité de new sans delete).
  • Verification à l’exécution des compatibilités de type lors d’un cast.

2.7 Java est sûr

  • Écriture mémoire erronée: quasi-impossible en java, car pas de pointeurs.
  • e` Indices de tableau testés avant qu’ils soient référencés.
  • Test qu’une variable a été assignée avant d’être utilisée.
  • Bytecode également testé avant d’être exécuté :

– test de bon accès aux classes,

– tests de congestion et de famine de la pile des opérandes,

– test de conversion illégale de données,

– test d’accès aux ressources : fichiers,

– . . .

2.8 Java est indépendant de l’architecture

  • Le bytecode est indépendant de la plate-forme.
  • e` Les bibliothèques sont intégrées de manière standard au langage, à l’encontre de C++.

2.9 Java est portable

  • Un même programme peut être compilé sur une machine et exécuté sur une autre, quel que soit le processeur ou l’OS.
  • La taille des types de données est toujours la même en java.

2.10 Java est efficace

  • Initialement, les interpréteurs rendaient l’exécution de programmes java lente (environ 20 fois plus lente que du C).
  • Les compilateurs à la volée (JIT) la rendent presque aussi rapide que des programmes compilés classiques.
  • Des compilateurs natifs, fournissent du code machine natif pour tel ou tel processeur; performances égales à celles du C (jove ; cygnus, au dessus de gcc, ... ).

2.11 Java est multitâches

  • L’un des premiers langages à posséder en interne des tâches, ou activités (threads) d’exécution.
  • ➶ La coordination des activités est aisée (moniteurs de Hoare et événe¬ments).

2.12 Java est dynamique

  • Exécution coté client => dynamisme plus aisé à mettre en œuvre que dans d’autres langages.
  • Chargement des classes en cours d’exécution, lorsque nécessaire, éven-tuellement à travers le réseau. Chargement dynamique des classes possible grâce à des informations de typage consultables en cours d’exécution. La liste est donnée par thème, chaque élément étant suivi, entre parenthèses, du nom de la technologie Java correspondante. Son éventuelle disponibilité appa¬raît ensuite : au sein du JDK, paquetage optionnel ou extension en accès d’avant première.

2.13 Technologies Réseaux

  1. Flux de données réseau TCP et UDP par sockets (Socket, ... ; JDK).
  2. Appel de méthodes distantes (RMI ou Remote Method Invocation; JDK).
  3. Interopérabilité réseau inter-langage via CORBA (IDL ou Interface Defi¬nition Langage; JDK).
  4. Appel de méthodes distantes au dessus du protocole Internet d’interopéra¬bilité réseau inter-langage (RMI-IIOP ou Remote Method Invocation over Internet Inter-Orb Protocol; paquetage optionnel).
  5. Fonctions de serveurs HTTP (Java Servlets; paquetage optionnel).

2.14 Technologies Réseaux (suite)

  1. Communication distribuée par espaces (JavaSpaces).
  2. Applications mutli-agent réseau (JDMK, Java Dynamic Management Kit).
  3. Administration distribuée (Java Management; paquetage en accès d’avant première).
  4. Gestion de courier (Java Mail; paquetage optionnel).
  5. Service de nommage et de répertoires (JNDI ou Java Naming Directory Interface; paquetage optionnel).

2.15 Technologies graphiques & sonores

  1. Gestion d’interfaces graphiques (AWT ou Abstract Window Toolkit et Swing, formant les JFC ou Java Foundation Classes; JDK).
  2. Composants réutilisables, éditables au sein d’un concepteur d’interfaces gra¬phiques ou “GUI builder” (Java Beans; JDK).
  3. Dessin vectoriel 2D (Java2D ; JDK).
  4. Traitement d’images de base (Java advanced imaging ; paquetage option¬nel).
  5. Synthèse d’images et VRML (Java3D ; paquetage optionnel)
  6. Gestion multimédia (JMF, Java Media Framework; extension standard).
  7. Synthèse vocale (Java Sound).

2.17 Technologies de Sécurité

  1. Liste de contrôle d’accès ou “ACLs” (JDK)
  2. Authentification et autorisation (JAAS ou Java Authentication and Autho¬rization Service; paquetage en accès d’avant première)
  3. Flux réseau sécurisé par des SSL ou Secure Socket Layer (JSSE ou Java Secure Socket Extension; paquetage en accès d’avant première)
  4. Cryptographie (JCE ou Java Cryptography Extension; extension standard)

2.18 Technologies de Gestion de données

  1. Structures de données de base (listes, arbres, tables de hachage) et tri (Collections; JDK)
  2. Accès à des bases de données par SQL (JDBC ou Java Database Connecti-vity ; JDK)

...

III.1 Technologies et paquetages 1.1 Aperçu des technologies disponibles

La liste est donnée par thème, chaque élément étant suivi, entre parenthèses, du nom de la technologie Java correspondante. Sa éventuelle disponibilité apparaît ensuite : au sein du JDK extension standard ou paquetage optionnel.

  • Réseaux :
  1. Flux de données réseau TCP et UDP par sockets (Socket, ... ; JDK)
  2. Appel de méthodes distantes (RMI ou Remote Method Invocation; JDK)
  3. Interopérabilité réseau inter-langage via CORBA (IDL ou Interface Definition Langage; JDK)
  4. Fonctions de serveurs HTTP (Java Servlets ; extension standard)
  5. Communication distribuée par espaces (JavaSpaces)
  6. Applications mutli-agent réseau (JDMK, Java Dynamic Management Kit)
  7. Administration distribuée (JMX ou Java Management eXtension ; ex¬tension standard)
  8. Gestion de courier (Java Mail; extension standard)
  9. Service de nommage et de répertoires (JNDI ou Java Naming Directory Interface; extension standard)
  • Graphique, images et sons:
  1. Gestion d’interfaces graphiques (AWT ou Abstract Window Toolkit et Swing, formant les JFC ou Java Foundation Classes; JDK)
  2. Composants réutilisables, éditables au sein d’un concepteur d’inter¬faces graphiques ou “GUI builder” (Java Beans ; JDK)
  3. Dessin vectoriel 2D (Java2D ; JDK)
  4. Traitement d’iamges de base (Java advanced imaging ; extension stan¬dard)
  5. Synthèse d’images et VRML (Java3D ; extension standard)
  6. Gestion multimédia (JMF, Java Media Framework ; extension standard )
  7. Synthèse vocale (Java Sound)
  • Sécurité :
  1. Liste de contrôle d’accès ou “ACLs” (JDK)
  2. Authentification et autorisation (JAAS ou Java Authentication and Authorization Service)
  3. Flux réseau sécurisé par des SSL ou Secure Socket Layer (JSSE ou Java Secure Socket Extension; paquetage optionnel)
  4. Cryptographie (JCE ou Java Cryptography Extension; extension stan¬dard)
  • Gestion de données :
  1. Structures de données de base (listes, arbres, tables de hachage) et tri (Collections; JDK)
  2. Accès à des bases de données par SQL (JDBC ou Java Database Connectivity ; JDK)

1.2 Paquetages du JDK 1.5

JDK : Java Development Kit, Versions de référence du langage, tel que produit par Sun.

Variables et types de données 1.1 Identificateurs

  • Identificateur : suite de

– lettres

– minuscules ou majuscules,

– chiffres,

– underscore (_) et dollar ($).

Un identificateur ne doit pas commencer par un chiffre.

  • Java distingue minuscules et majuscules (Valeur diffère de VALEUR).
  • Conventions

– Toute méthode publique et variable d’instance commence par une mi¬nuscule. Tout changement de mot descriptif se fait via une majuscule. Exs.: nextItem, getTimeOfDay.

– Variables locales et privées : lettres minuscules avec des underscores. Exs.: next_val, temp_val.

– Variables dites final représentant des constantes : lettres majuscules avec underscores. Exs.: DAY_FRIDAY, GREEN.

– Tout nom de classe ou d’interface commence par une majuscule. Tout changement de mot descriptif se fait via une majuscule. Exs.: StringTokenizer, FileInputStream.

1.2 Représentation littérale

  • Entiers :

– ami- les valeurs octales commencent avec un 0.

– Ainsi 09 génère une erreur : 9 en dehors de la gamme octale 0 à 7.

– Ajouter un l ou L pour avoir un entier long.

  • Nombres à virgules : par défaut des double. Ajouter un f ou F pour avoir un float.
  • booléens : 2 valeurs possibles, true et false. ami- true (resp. false) n’est pas égal à 1 (resp. 0).
  • Chaînes de caractères: ami- doivent commencer et se terminer sur la même ligne ...
  • Caractères : unicode (sur 16 bits), manipulables comme des entiers, par ’a’, ’@’, . ..

Séquence escape Description

\ddd Caractère octal ddd

\uxxxx Caractère hexadécimal unicode xxxx

\’ Apostrophe

\" Guillemets

\\ Backslash (barre oblique inversée)

\r Carriage return

\n New line

\f Form feed

\t Tabulation

\b Backspace

1.3 Variables

  • exemple (Pythagore) :

class Variables {

public static void main(String args) {

double a = 3;

double b = 3;

double c;

c = Math.sqrt(a*a + b*b);

System.out.println("c = " + c);

}

  • Règles de visibilité usuelles pour une variable définie à l’intérieur d’un bloc entre *.
  • Une variable ne peut avoir le même nom qu’une déclarée dans un bloc englobant :

class Scope {

public static void main(String args[]) { int var = 3;

{

int var = 2; // Erreur de compilation

1.4 Mots clés du langage

Attention a ne pas utiliser comme nom de variable un mot clé réservé, dont voici la liste :

...

Nature des variables

On distingue 7 natures de variables :

  • les variables d’instance
  • les variables de classe
  • les variables de type tableau
  • les paramètres des méthodes
  • les param‘etres des constructeurs
  • les variables de type exception
  • les variables locales

1.6 Types primitifs

  • Dans certains langages 2+2 : appel de la méthode “plus” sur une instance d’objet représentant deux, passant une autre instance de deux ...
  • => Pour des raisons de performance : types primitifs en java, strictement analogues aux types correspondants dans des langages non orientés objets.
  • Huit types primitifs :

– Entiers : byte, short, int et long, tous signés.

– Nombres à virgule flottante : float et double.

– Caractères : char.

– booléens : boolean, pour les valeurs logiques.

1.7 Types entiers et flottants

  • Toute assignation, explicite ou par passage de paramètres, fait l’objet d’une vérification de type.
  • Pas de coercition ou de conversion systématique. Une différence de type est une erreur de compilation, pas un avertissement (warning).
  • Types de données entiers :

– byte : à n’utiliser que pour des manipulations de bits.

– short : relativement peu utilisé car sur 16 bits.

– int : dans toute expression avec des byte, short, int, tous sont promus à

des int avant calcul.

1.8 Plages de variation

Nom Taille Plage de variation

long 64 bits -9 223 372 036 854 775 808...

9 223 372 036 854 775 807

int 32 bits -2 147 483 648 ...

2 147 483 647

short 16 bits -32 768 ... 32 767

byte 8 bits -128 ... 127

double 64 bits 1.7e-308 ... 1.7e308

float 32 bits 3.4e-38 ...3.4e+38

 1.9 Transtypage (ou conversions, “cast”)

  • Conversions possibles en java. Conversion automatique seulement pos¬sible lorsque le compilateur sait que la variable destination est assez grande.
  • Si des bytes, short, int et long font partie d’une expression, tout le monde est promu à long. Si une expression contient un float et pas de double, tout le monde est promu à float. S’il y a un double, tout le monde est promu à double. Tout littéral à virgule est considéré comme double.

1.10 Caractères

  • Un caractère est codé par un entier allant de 0 à 65536 (selon le standard unicode).
  • On peut se servir des caractères comme entiers :

int trois = 3;

char un = ’1’;

char quatre = (char) (trois + un);

Dans quatre : ’4’. un a été promu à int dans l’expression, d’où la conversion en char avant l’assignation.

1.11 Booléens

  • Type renvoyé par tous les opérateurs de comparaison, comme (a < b).
  • Type requis par tous les opérateurs de contrôle de flux, comme if, while et do.

1.12 Tableaux

  • Création pouvant être faite en deux temps :

– Déclaration de type, les [] désignant le type d’un tableau

int tableau_entiers[] ;

– Allocation mémoire, via new

tableau_entiers = new int[5] ;

  • Pour les tableaux, la valeur spéciale null représente un tableau sans au¬cune valeur.
  • Initialisation

int tableau_initialise[] = { 12, 34, 786 };

  • Vérification par le compilateur de stockage ou de référence en dehors des bornes du tableau.

1.13 Tableaux multidimensionnels (I)

  • Tableaux multidimensionnels crées comme

double matrice[][] = new double[4][4];

Ce qui revient à

double matrice[][] = new double[4][];

matrice[0] = new double[4]; matrice[1] = new double[4]; matrice[2] = new double[4]; matrice[3] = new double[4];

1.14 Tableaux multidimensionnels (II)

  • Initialisation par défaut de tous les éléments à zéro.
  • Des expressions sont permises dans les initialisations de tableaux

double m[][] = {  

{ 0*0, 1*0, 2*0 },

{ 0*1, 1*1, 2*1 },

{ 0*2, 1*2, 2*2 }

...

Contrôle de flux

3.1 Instruction if-else

  • Forme strictement analogue à celle du C

if ( expression-booleenne ) expression1; [ else expression2; ]

  • expressioni peut être une expression composée entourée de {}.
  • expression-booleenne est toute expression renvoyant un boolean.
  • ☛ Il est de BONNE PRATIQUE d’entourer d’accolades une expres-sion même si elle n’est pas composée. Ce qui permet, lorsque l’on veut rajouter une expression, de ne rien oublier, comme c’est le cas ci-après

3.2 Instruction if-else

int octetsDisponibles;

if (octetsDisponibles > 0) { CalculDonnees();

octetsDisponibles -= n; } else

attendreDautresDonnees(); octetsDisponibles = n;

où la dernière ligne devrait, d’après l’indentation, faire partie du bloc else. 3.3 Instruction break

  • Utilisation courante strictement analogue à celle du C : pour sortir d’un case à l’intérieur d’un switch.
  • Autre utilisation : sortie d’un bloc marqué. Marquage par étiquette : un

identificateur suivi de ’ :’ placé devant le bloc

class Break {

public static void main(String args[]) {

boolean t = true;

a: {

b: {

c: {

System.out.println("Avant le break"); if (t)

 break b;

System.out.println("Jamais execute");

}

System.out.println("Jamais execute");

}

System.out.println("Apres b:");

}}}

break suivi du nom de marquage du bloc permet une sortie du bloc marqué par cette étiquette. La sortie écran du code est

Avant le break Apres b:

  • ami- On ne peut se brancher à une étiquette qui n’est pas définie devant un des blocs englobant, sinon break serait identique à goto.

3.4 Instruction switch (I)

  • Forme strictement analogue à celle du C

switch ( expression) { case valeur1 : break;

case valeurN :

break; default :

}

  • expression peut être tout type primitif (les valeuri doivent être du même type qu’expression)
  • ami- C’est une erreur répandue que d’oublier un break. Il est donc de BONNE PRATIQUE d’utiliser des commentaires du type // CONTINUER. Exemple d’équivalent de wc (word count, comptage du nombre de lignes, mots et ca-ractères)
  • Exemple d’équivalent de wc (word count, comptage du nombre de lignes, mots et caractères)

class WordCount {

static String texte =

"Trente rayons convergent au moyeu " +

"mais c’est le vide median " +

...

La légende des sept singes 1.1 Le petit singe flexible

En tant que le développeur vous aurez toujours cinq singes sur votre dos chacun cherchant à retenir votre attention :

  • Le singe ponctuel aggripé à votre dos, les bras autour de votre cou, beuglant continuellement : “tu dois respecter les échéances!”
  • Le singe adéquat, sur votre tête, tambourine sur sa poitrine et crie : “tu doit implanter correctement les spécifications!”
  • Le singe robuste, sautant sur le dessus de votre moniteur, hurle : “robustesse, robustesse, robustesse!”
  • Le singe performant essaie de grimper le long de votre jambe en vociférant : “n’oublie pas les performances!”
  • Et de temps en temps, un petit singe, flexible, pointe timidement sont nez d’en-dessous le clavier. À ce moment là, les autres singes se taisent et ce calment. Le petit singe sort de sous le clavier, se met debout sur ses pattes, vous regarde droit dans les yeux et dit : “Tu dois rendre ton code facile lire et facile à modifier”. Sa phrase à peine terminée, les autres singes se remettent à hurler en sautant sur le petit singe, le forçant à se terrer à nouveau sur le clavier. Les quatre premiers singes reviennent alors à leurs activités initiales.

o Un bon développeur doit trouver un compromis pour rendre les 5 singes heureux.

o Deux autres singes font une apparition tapageuse de temps en temps :

  • Le singe réutilisable dont le slogan est : “Ton code doit être réutilisable!”
  • Le singe sécuritaire : “Ton Code doit être parfaitement sûr!”

1.2 Un vieux constat – l’histoire d’AdA

  • Le respect des essais des échéances est souvent une pression commerciale puissante au détriment de la qualité d’un logiciel.
  • L’insatisfaction des clients résultant de singes malheureux était déjà un constat fait au département de la défense américaine :
  • En 1968-1970 au DoD (“Departement of Defense”) : coûts matériels » coûts logiciels
  • De 1968 à 1973 : accroissement de 59 % des coûts informatiques et baisse très forte des coûts matériels (pour le logiciel, budget en 1970 : 3.109 $, en 1990 30.109 $)
  • ceci pour un produit fini en général insatisfaisant :

Adéquation : non correspondance aux besoins des utilisateurs

Fiabilité : logiciel tombant souvent en panne Coût : coûts rarement prévisibles, perçu comme excessifs

Modifiabilité : maintenance souvent complexe, coûteuse et non fiable

Ponctualité : logiciel souvent en retard; livré avec des capacités inférieures à celles promises

Transportabilité : logiciel d’un système rarement utilisable sur un autre

Efficacité : non utilisation optimale par le logiciel des ressources disponibles (temps de calcul, RAM) ce qui rend les différents singes tous malheureux.

  • Coût de maintenance logicielle > coût du développement original. En 1975, un industriel dépense entre 40 et 75 % de son budget informatique pour la maintenance logicielle. En 1973, 450 langages généraux au DoD.
  • Notamment pour des logiciels embarqués,

– De 1975 à 1977, évaluation de 2800 langages, aucun réellement approprié,

bien que Pascal, ALGOL et PL/1 comportent des éléments intéressants. – En 1977 appels d’offes international, 17 réponses, 4 sélectionnées, dont

une de CII Honeywell Bull.

– En 1979 sélection finale de la proposition de CII ; le langage, créé par Jean Ichbiah, prend pour nom Ada (Augusta Ada Byron, mathématicienne ayant travaillé avec Babbage sur ses machines différentielle et analytique)

– En 83, manuel de référence Ada, approuvé comme norme ANSI, puis en 1987 adoptée par l’ISO

 V.2 Buts du génie logiciel 2.1 Quatre buts généraux

Pour remédier à cet état de faits, on a cherché à identifier diverses qualités souhaitables d’un logiciel, de façon à contenter les sept singes.

Dans un article [RGI80], D.T. Ross, J.B. Goodenough et C.A. Irvine donnent 4 buts généraux :

  • modifiabilité
  • efficacité
  • fiabilité
  • intelligibilité

2.2 Modifiabilité

Deux raisons de vouloir modifier un logiciel :

– changement des spécifications (par exemple d’après une demande d’un client) – correction d’une erreur

Dans un logiciel modifiable, on peut introduire des changements sans complexifi¬cation (ni perte de lisibilité)

2.3 Efficacité

  • Utilisation optimale des ressources en temps et en espace Pour des systèmes temps rééel : dont la ressource en temps est prédominante. Pour des systèmes embarqués, où il y a limitation de place (dans un satellite, une automobile) : ressource en espace prédominante
  • On se préoccupe souvent trop tôt de l’efficacité, se polarisant de ce fait sur la micro-efficacité au détriment de la macro-efficacité ; dans [RGI80] : “Une bonne perspicacité reflétant une compréhension plus unifiée d’un problème a beaucoup plus impact sur l’efficacité n’importe quel tripotage de bits dans une structure déficiente”

2.4 Fiabilité

Peut-être critique (système de navigation d’un engin spatial) : “La fiabilité doit à la fois éviter les défauts de conception, d’étude et de construction, et permettre de récupérer les pannes et les défauts de performances” (cf. [RGI80]).

Pour toute panne, prévisible ou non, le logiciel doit entrer en mode dégradé en douceur, sans effet de bord dangereux (par exemple, une orbite dégradée)

2.5 Intelligibilité

  • Sans doute le but le plus crucial pour bien gérer la complexité d’un système logiciel Pour qu’un système soit compréhensible, il doit être un modèle exact de notre vue du monde réel Pour améliorer la compréhensiblité :

– Au bas niveau, lisibilité par un bon style de codage,

– Au plus haut niveau, il être facile d’isoler les structures de données (ob¬jets) et les actions (opérations) correspondantes à celles du monde réel. Le langage choisi est important pour cela.


572
x