Développement des systèmes informatiques


Introduction


Quelques rappels

Qu’est-ce que des spécifications ?

  1. Définition générale de spécifications
  2. Définition du point de vue du génie logiciel
  3. Nous allons utiliser ce terme au sens B.

Pourquoi avons-nous besoin de spécifications de modules ?

Spécification formelle

Une spécification est formelle si elle est écrite dans un langage dont la syntaxe et la sémantique sont définies précisément.

Exemples de langages de spécification : langage de mathématiques, Java, ML, ...

Pourquoi pas une langue naturelle (français, anglais, chinois, allemand, ...?)

Pourquoi des spécifications doivent-elles être précises ?

Spécification abstraite

Une spécification est abstraite si elle est écrite entièrement en terme du comportement observable du module.

Pourquoi des spécifications doivent-elles être abstraites ?

Classes de spécification

Quatre classes des techniques de spécification de logiciel :

  1. spécifications basées sur le concept de modèle abstrait
  2. spécifications algébriques
  3. spécifications basées sur le concept de trace
  4. spécifications basées sur le concept de processus

Pour les classes 1. et 4. des modèles doivent être construits pour représenter des particularités importantes d’objets abstraits.

Les classes 2. et 3. sont des techniques de "boîte noire".

Spécifications basées sur le concept de modèle abstrait

Spécifications algébriques

Spécifications basées sur le concept de trace

Spécifications basées sur le concept de processus

Exemples

Définition du type File d'entiers en LOTOS :

type int_file is integer with
  sorts file
  opns  _:   → file
    ADD: integer, file → file
    FRONT: file → integer
    REMOVE: file → file
  eqns forall x,y: integer, q: file
    ofsort integer
    FRONT(_) = 0;
    FRONT(ADD(x,_)) = x;
    FRONT(ADD(x,ADD(y,q))) = FRONT(ADD(y,q));
    REMOVE(_) = _;
    REMOVE(ADD(x,_)) = _
    REMOVE(ADD(x,ADD(y,q))) = ADD(x,REMOVE(ADD(y,q)));
endtype

défauts :

Définition du type Agenda d’anniversaires en Z

Types de base: NOM, DATE (on ne connaît pas les éléments des ensembles)
______Agenda______
connus: ℘(NOM)                          // l'espace d'états
anniversaire: NOM → DATE                // (déclarations des variables)
__________________
connus = dom anniversaire               // L'invariant du système (relations
                                        // entre les variables)
Un état possible du système :
  connus = { Jean, Marie, Lucie }
  anniversaire = { Jean → 20-Février, Marie → 17-Mai, Lucie → 29-Février }
______AjouterAnniversaire______
ΔAgenda                                 // schéma d'opération (4 variables : connus,
                                        // connus', anniversaire, anniversaire')
nom? : NOM                              // argument d'entrée
date? : DATE                            // argument d'entrée
__________________
nom? ∉ connus
anniversaire' = anniversaire ∪ {nom? → date?}

Exercice: Montrer que: connus’ = connus ∪ { nom? }

______TrouverAnniversaire______
ΞAgenda                                 // schéma d'interrogation
nom? : NOM                              // argument d'entrée
date! : DATE                            // argument de sortie
__________________
nom? ∈ connus
date! = anniversaire(nom?)
______Rappeler______
ΞAgenda
aujourd'hui? : DATE
cartes! : ℘(NOM)
cartes! = { n: connus | anniversaire(n) = aujourd'hui? }
______InitialiserAgenda______
Agenda                                  // schéma d'initialisation
__________________
connus = ∅

Spécifications de modules versus spécifications de programmes

Nous utilisons des spécifications relationnelles pour des programmes.

Nous utilisons des assertions sur les traces pour des modules.

Les deux sont complètement compatibles.