structure de données

Embed Size (px)

DESCRIPTION

expression des algorithmes

Citation preview

  • 1 Introduction

    La structure et le principe de fonctionnement des ordinateurs a peu volu depuis lespremires machines programmables construites dans les annes 40. Ces machines sont com-poses des lments suivants:

    Processeur: il effectue les calculs et autres traitements sur les donnes stockes dans lammoire. Il suit un programme qui dtermine la squence des oprations effectuer.

    Mmoire: selon larchitecture dfinie par John von Neuman on utilise la mme mm-oire pour stocker les donnes et les programmes qui vont traiter ces donnes. Pour desraisons physiques et conomiques, on a en gnral une mmoire centrale rapide maisde taille limite et un ensemble de mmoires auxiliaires (disques magntiques, disquesoptiques, etc.) moins rapides mais de plus grande capacit et assurant une meilleurepersistance des donnes. La mmoire centrale est en gnral structure en cellulescomposes dun nombre fixe de bits que lon peut mettre dans deux tats distincts(0/1).

    Systmes de communication (entres/sorties): ils assurent la transmission dinforma-tions entre lordinateur et son environnement, qui est en gnral soit un tre humain(transmission par cran, claviers, souris, etc.) soit dautres ordinateurs (transmission travers un rseau de tlcommunication) soit des appareils (moteurs, capteurs, etc.).

    Le traitement de linformation par une machine impose de coder linformation sous formebinaire pour pouvoir la stocker dans une mmoire. On parle alors de donnes. Lors de toutdveloppement informatique il faudra donc trouver des structures de donnes qui

    1. permettent de reprsenter en mmoire toutes les informations traiter; 2. soient efficaces du point de vue de loccupation de la mmoire et des temps dexcu-

    tion des algorithmes.Ce deuxime point montre que ltude des structures de donnes est indissociable de celle desalgorithmes qui vont travailler sur ces donnes. Cest pourquoi nous allons introduire quelquesnotions de base concernant les algorithmes et leurs liens avec les structures de donnes.

    1.1 Expression des algorithmes

    Pour tudier dun point de vue gnral et thorique les notions dalgorithme, de calculabil-it, de complexit, etc, on a invent divers modle abstraits ou idaux de machines: p.ex. les ma-chines de Turing ou les machines RAM (Random Access Machine) dfinie en annexe. Si cesmodles de machines sont simples et permettent ltude thorique du comportement des ma-chines, elles sont cependant peu utilisables en pratique car lexpression dun algorithme, mmesimple, requiert un grand nombre dinstructions et sa lecture est difficile. Cest pourquoi nousutiliserons un langage de plus haut niveau qui ressemble aux langages de programmation proc-duraux modernes (Pascal, C, Java). Ce langage comprend des instructions dites de haut niveaumais que lon peut toujours traduire dans les modles de base (Turing, RAM).

    Expression des algorithmes en pseudo-langage

    La mmoire est compose d

    objets

    1

    qui peuvent contenir des donnes de diffrents tpyes(nombres entiers, chanes de caractres, valeurs boolennes (vrai, faux), etc.). Les objets occu-pent un nombre de cellules mmoire qui dpend de leur type.

    1. Il ne sagit pas dobjets au sens de la programmation oriente-objet.

  • 2 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    Nous utiliserons des

    variables

    pour dsigner (nommer) les objet mmoire quun algorithmeutilise. Ceci nous permettra de faire rfrence la mmoire non pas par des adresse numriquesmais par des noms, ce qui souvent beaucoup plus parlant.

    Affectation dune valeur une variable

    Cette instruction a pour but de stocker une valeur, en gnral le rsultat dun calcul, dansune variable. Cest linstruction de base pour modifier ltat de la mmoire.Syntaxe:

    variable

    expression

    Smantique:value

    expression

    et stocke le rsultat dans

    variable

    .

    Pour exprimer plus formellement leffet dune instruction nous utiliserons la notation sui-vante :

    [[

    pr-condition

    ]]

    instruction

    [[

    post-condition

    ]] qui signifie que si la pr-condition est vraie avant lexcution de linstruction alors la post-con-dition sera vraie aprs. On peut aussi voir ces conditions comme lexpression de ce quon saitsur ltat de la mmoire un instant donn.Exemples:

    [[ vrai ]] (aucune pr-condition particulire)X

    2[[ X = 2 ]]

    [[ X = 3 ]]Y

    X + 8[[ X = 3 et Y = 11]]

    [[ X = 5 et Y = 11 ]]X

    X * Y[[ X = 55 et Y = 11 ]]

    [[ vrai ]]Z

    "allo"[[ Z = "allo" (une chane de caractres) ]]

    [[Z = "allo" et Y = 11 ]]* X

    Z + Yna pas de sens : on ne peut additionner une chane de caractres et un entier

    Evaluation des expressionsUne expression comprend des variables, des constantes, des oprateurs, des fonctions et des

    parenthses. Le rsultat dune expression est obtenu en appliquant les oprateurs sur les con-

  • Introduction 3

    G. Falquet, CUI - Uni. Genve, 2001

    stantes et les valeurs des variables. Les oprateurs sappliquent selon les rgles de priorit habi-tuelles : * et / sont plus prioritaires que + et . Les sous-expressions entre parenthses sontvalues en premier. Nous utiliserons tous les oprateurs habituellement dfinis pour les typesde donnes traits : +, , * (multiplication), /, mod (reste de la divistion) pour les nombres en-tiers,

    ,

    ,

    ,

    pour les ensembles, etc.Il faut prendre garde au fait que la signification des oprations dpend du type des arguments

    :

    2.3 + 5.66 addition des rels6 + 2 addition des entiers6 / 4 = 1 si lon reste dans les entiers (et non pas 1.5)"bon"+"jour" concatnation des chanes

    Lun des objets de ce cours est prcisment de dfinir et tudier la signification des oprationssur diffrents type de donnes simples ou structurs (entiers, rels, listes, ensembles, squences,arbres, graphes, etc.)

    Squence dinstruction

    Syntaxe:{

    instruction1

    ;

    instruction2

    ; }Smantique:

    Excuter

    instruction1

    , puis

    instruction2

    , et ainsi de suite. La post-condition de

    instruction1

    devient la pr-condition de

    instruction2

    , etc.

    Exemples:1. [[vrai]] { X

    2; Z

    X + 1; U

    X Z;} [[ X = 2 et Z = 3 et U = 1 ]]car

    [[vrai]] X

    2 [[ X = 2 ]] Z

    X + 1 [[ X = 2 et Z = 3 ]] U

    X Z [[ X = 2 et Z = 3 et U = 1 ]]

    2. [[ X = 6 ]] {X

    X + 3; X

    X + 3; X

    X + 3 } [[ X = 15 ]]

    Attention: lordre des instructions dans une squence est important !On a :[[vrai]] { X

    2; Z

    2*X ; X

    X+1 } [[ X = 3 et Z = 4, ]]et

    [[vrai]] { X

    2; X

    X+1; Z

    2*X } [[ X = 3 et Z = 6 ]]

  • 4 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    Excution conditionnelle:

    Syntaxe:

    si

    (

    expression

    )

    instruction1

    sinon

    instruction2

    ou bien

    si

    (

    expression

    )

    instruction1

    Smantique:Si lvaluation de

    expression

    donne

    vrai

    on excute

    instruction1

    si elle donne

    faux

    on ex-cute

    instruction2

    (si elle existe). Lexpression doit fournir un rsultat de type boolen {

    vrai

    ,

    faux

    }Exemples:

    [[]]{ A

    2;B

    1;

    si

    (A > B) W

    A B

    sinon

    W

    0}[[ A = 2, B = 1 et W = 1 ]] (car 2 > 1).

    [[ vrai ]]

    si

    (X > 0) Y

    X

    sinon

    Y

    X[[ Y = la valeur absolue de X ]].

    Itration

    Syntaxe:

    tant que

    (

    expression

    )

    instruction

    Smantique:lexpression est value, si le rsultat est vrai linstruction est excute, puis on rvalue

    lexpression, et ainsi de suite tant que expression donne un rsultat vrai.Exemples:

    [[ vrai ]]{ R

    10;S

    0;

    tant que

    (R > 0) { S

    S + R; R

    R 1 }}[[ S = 10+9+8++2+1 = 55 ]]

    Lorsque on veut effectuer un nombre dtermin lavance ditrations on pourra utiliser lasyntaxe abrge

    pour

    (

    variable

    de

    expression1

    expression2

    )

    instruction

    qui correspond :

  • Introduction 5

    G. Falquet, CUI - Uni. Genve, 2001

    variable

    expression1

    tant que

    (

    variable

    expression2

    ) {

    instruction

    ;

    variable

    variable

    + 1}

    Toutes ces instructions peuvent tre combines entre elles pour former des instructions pluscomplexes.

    .

    Exemple. Calcul de r = p

    q

    r

    1;n

    q;

    tant

    que

    (n > 0) {r

    r * p;n

    n 1;}

    On peut se convaincre que lalgorithme est correct en regardant leffet de chaque instruction sur ltat de la mmoire :

    r

    1;n

    0;[[ r = p

    n

    ]]

    tant

    que

    (n

    q) {[[ r = p

    n

    ]]r

    r * p;[[ r = p

    n+1

    ]]n

    n + 1;[[ r = p

    n

    ]]}[[ r = p

    n

    et n = q ]] => [[ r = p

    q

    ]]

    Sous-programmes: procdures et fonctions

    Les procdures sont des abstractions qui permettent demballer et de nommer un algorithmeen vue de sa rutilisation future; ce nommage est aussi ncessaire pour crire des algorithmesrcursifs.

    La dclaration dune procdure prend la forme

    procedure

    nom

    (

    liste de paramtres

    ) {

    squence dinstructions

    }Par exemple :

    procedure

    MAX(x, y) {

  • 6 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    si

    (x > y)

    retourne

    x

    sinon

    retourne

    y}

    Cette procdure sappelle MAX, elle traite deux paramtres et retourne un rsultat (instruction

    retourne

    ). Une procdure qui retourne un rsultat sappelle une fonction et on peut lutiliserdans les expressions selon la notation habituelle des fonctions. Par exemple

    z

    3 + MAX(5, b)w

    MAX(b, MAX(h, 2*t))Les expressions entre parenthses sont les valeurs passes comme arguments (ou paramtres ef-fectifs) la procdure. Nous prendrons la convention que les paramtres sont passs

    parrfrence

    . Ce qui veut dire que le nom dun paramtre est une rfrence la variable passe com-me argument, toute affectation faite un paramtre formel dans la procdure va donc modifierla variable pass comme argument. Si largument est une expression (a+b) ou une constante(123) on suppose que sa valeur est tout dabord copie dans une variable interne la procdureet quon travaille sur cette variable interne.

    Leffet dune procdure peut tre de retourner un rsultat, comme dans le cas de MAX, oude modifier les variables passes comme paramtres. Par exemple, si on dclare la procdure

    procedure

    ECHANGE(x, y) {t

    x; x

    y; y

    t;}

    Son utilisation dans un programme (ou dans une autre procdure) aura les effets suivants :a

    34; b

    41;[[ a = 34 et b = 41 ]]

    ECHANGE(a, b);[[ a = 41 et b = 34 ]]

    Si largument donne au moment de lappel de la procdure nest pas une variable, nous considrerons que l affectation au paramtre correspondant est sans effet lextrieur de la procdure (une procdure ne peut modifier une constante ou une expression).

    Attention

    . Dans les langages Pascal, C, Java et C++, les paramtres sont souvent passs par

    valeur

    et non par rfrence. Ceci signifie quune copie des argument est faite dans la proc-dure et que la procdure travaille sur cette copie. Dans ce cas notre procdure ECHANGEnaurait aucun effet visible dans le programme qui la appele.

    Mthodes

    Dans la programmation oriente objet les sous-programmes sappellent en gnral mthodes.Une mthode est toujours lie un objet particulier (dont elle peut modifier ltat). On utiliseune notation pointe pour lappel des mthodes, le premier paramtre joue un rle particulier etil est plac avant le nom de la mthode :

    objet

    .

    mthode

    (

    autres paramtres

    )Exemples:

    s

    "Les copains dabord";n

    s.longeur la mthode longueur calcul la taille de la chane s

  • Introduction 7

    G. Falquet, CUI - Uni. Genve, 2001

    Aprs lexcution on aura n = 19.

    s.insre(11, "et les amis") insre "et les amis" la position 11 (on compte depuis 0)

    produire s = "Les copains et les amis dabord".Une mthode scrit comme une procdure, le premier paramtre reprsente lobjet sur

    lequel sapplique la mthode (voir chapitre sur la programmation des classes), on doit obliga-toirement donner son type.

    Dfinition:

    methode

    augmenteDe(entier X, entier Y) {X

    X + Y}

    Utilisation de la mthode:

    A

    15A.augmenteDe(12)[[ A = 27 ]]

    Dans une optique algorithmique, une mthode nest rien dautre quune autre manire dcr-ire et dappeler une procdure. Par contre en programmation il y a une nette diffrence entremthode et procdure simple au niveau de lappel (voir le concept de liaison dynamique).

    Variables tableaux

    Un tableau est un objet qui contient un nombre fix dobjets du mme type. Lorsquun tab-leau contient des objets simples de taille fixe (nombres entiers ou rels, caractres, boolens,rfrences des objets), ceux-ci seront stocks de manire contige dans la mmoire.

    Si A dsigne un tableau, A[i] dsignera le i

    e

    lment du tableau. On verra quil est commodede numroter les cellules dun tableau de taille N de 0 N1 plutt que de 1 N.

    V

    A[i]

    stocke la valeur de A[i] dans VA[i]

    E stocke la valeur de E dans A[i]

    1.2 Complexit

    On appelle complexit dun algorithme les ressources en temps (nombre dinstructionsexcutes) et en espace (nombre de cellules mmoire utilises) qui lui sont ncessaires pourrsoudre un problme dune taille n fixe. Si lalgorithme excute toujours les mmes instruc-tions, quelles que soient les donnes, il aura une complexit en temps constante. Cest le cas denotre programme qui calcule la somme de trois nombres. Par contre, si lon observe notre pro-gramme de calcul de p

    q

    , on saperoit quil excute les instructions entre

    test

    et

    fini

    exactement

    q

    fois. Sa complexit en temps est donc proportionnelle

    q

    . Sa complexit en espace est, quand elle, constante.

  • 8 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    Si les nombres que lon manipule dans un programme ne dpassent pas une taille maximumfixe lavance, il est raisonnable de dire que chaque instruction sexcute en un temps constantet donc que le temps dexcution du programme sera proportionnel au nombre dinstructionsexcutes. Cela ne sapplique plus si lon se met manipuler des nombres arbitrairement grands.

    Dun point de vue pratique, lanalyse de la complexit des algorithmes est essentielle, carelle permet de mesurer si les ressources dont on dispose sont suffisante pour rsoudre lesproblmes auxquels on veut sattaquer; ou inversement, de calculer la taille maximum desproblmes quon peut attaquer tant donn les ressources dont on dispose. Dans le tableau ci-dessous, on suppose quon a cinq algorithmes A1, A5 de complexits diffrentes pourrsoudre le mme problme. Le tableau illustre limportance de la recherche dalgorithmes aussiefficaces que possible.

    Ordres de grandeur

    Comme il est en gnral difficile de calculer exactement le nombre dinstructions qui serontexcutes, on sintresse plutt lordre de grandeur de ce nombre et son volution en fonctionde n. On utilisera la notation O(f) (prononcer grand O de f) pour reprsenter les ordres de gran-deur. Si g(n) est le nombre dinstructions excutes pour rsoudre un problme de taille n, ondira que g(n)

    O(f) sil existe un n

    0

    et un c tels que g(n)

    cf(n) ds que n

    n

    0

    . La fonction fest donc une borne suprieure du nombre dinstruction excutes.

    Exemple. Si g(n) = 6n

    2

    + 3n cos(n)g(n)

    O(n

    2

    ) car partir de n = 5 on a 7n

    2

    > 6n

    2

    + 3n cos(n) (la constante c est 7)par contreg(n)

    O(n) car quelle que soit la constante c, aussi grande quon veut, si n est suffisammentgrand on finit toujours par avoir 6n

    2

    > cn (il suffit de prendre n > c).En gnral on utilisera des fonctions f simples telles que 1 (constante), n (linaire), n

    2

    , n

    3

    ,

    (polynomial)., 2

    n

    (exponentiel), log(n), pour exprimer lordre de grandeur de la complexit.Il est utile de se souvenir que

    g

    (

    n

    ) = constante

    O(1)

    g

    (

    n

    ) =

    an

    +

    b

    O(

    n

    ) (

    a

    ,

    b

    des constantes)

    g

    (

    n

    ) =

    an

    2

    +

    bn

    +

    c

    O(

    n

    2

    )

    AlgorithmeComplexit

    en tempsTaille maximum du problme que lon peut

    rsoudre en

    1 seconde 1 minute 1 heure

    A1 n 1000 60000 3600000

    A2 n log(n) 140 4893 200000A3 n

    2

    31 244 1897

    A4 n

    3

    10 39 153

    A5 2

    n

    9 15 21

  • Introduction 9

    G. Falquet, CUI - Uni. Genve, 2001

    g

    (

    n

    ) =

    a

    k

    n

    k

    +

    a

    k

    1

    n

    k

    1

    + +

    a

    1

    n

    +

    a

    0

    O(

    n

    k

    )

    g

    (

    n

    ) =

    n

    q

    O(2

    n

    ) quel que soit

    q

    Lutilisation des ordres de grandeur sert surtout nous conomiser la peine de calculer ex-actement combien dinstructions excutera un algorithme. En gnral on pourra assez facilementtrouver un ordre de grandeur satisfaisant.

    Cas de complexit dun algorithme

    Il faut encore remarquer quun algorithme peut avoir des comportement diffrents suivantles donnes traiter. Imaginons que lon cherche un nom dans un annuaire tlphonique et quenotre algorithme consiste lire tous les noms depuis le dbut jusqu ce quon trouve le bon. Sion a beaucoup de chance, le nom cherch est le premier. Si, au contraire, on na pas de chancedu tout, le nom cherch se trouvera tre le dernier. On peut dire qu en moyenne on trouverale nom aprs avoir parcouru environ la moiti des pages de lannuaire. On doit donc distinguerle meilleur des cas, le cas moyen et le pire des cas pour une taille n fixe. Pour notre recherchedans lannuaire, si on considre que lire un nom est une opration on aurait pour un annuaire den noms:

    meilleur cas : O(1)pire cas : O(

    n

    )cas moyen : O(

    n

    /2)En gnral lanalyse du cas moyen est la plus difficile.

    1.3 Structure des machines relles

    Les machines relles actuelles correspondent peu prs au modle RAM, avec une diffrenceimportante: le programme est stock dans la mmoire.

    Structure de la mmoire

    La mmoire possde pratiquement toujours une structure compose dun ensemble de cel-lules toutes identiques et repres par un numro appel adresse. Chaque cellule est elle-mmecompose dun nombre fixe dunits, appeles bits, que lon peut mettre dans deux tats dif-frents gnralement dsigns par 0 et 1. Si les cellules dune mmoire sont composes de 8 bits(ce qui est un cas frquent), le contenu dune cellule sera une suite de 8 valeurs binaires, par ex-emple, 10011010. Un groupe de 8 bits est appel

    octet

    (ou

    byte

    en anglais).Pour des raisons defficacit lectronique, les octets de la mmoire sont en gnral

    groups pour former des mots de 16, 32 ou 64 bits.

    Processeur et mmoire

    En gnral le processeur contient lui-mme quelques cellules mmoires trs rapides,appeles registres, qui servent stocker temporairement les rsultats des calculs (comme lac-cumulateur de la machine RAM).

    On sest vite aperu (Turing et Von Neumann 1945) quil tait avantageux, pour des raisonspratiques, de stocker le programme excuter dans la mme mmoire que les donnes. Il suffitpour cela dattribuer un code binaire chaque opration, au mode dadressage utilis (immdiat,direct, indirect, etc.), au registre(s) utiliser, et ladresse mmoire rfrence par linstruction.

  • 10 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    Chaque instruction du programme occupera alors un nombre, en gnral fixe, de cellules mm-oire. Les instructions dune programme constituent donc un ensemble de donnes semblablesaux autres et manipulable par un programme (ce qui nest pas possible dans le modle RAM).Le processeur contient toujours un registre spcial, le compteur dinstruction, qui indiqueladresse mmoire de la prochaine instruction excuter.

    Le schma gnral de fonctionnement du processeur consiste 1. lire les cellules contenant la prochaine instruction excuter2. dcoder cette instruction (voir de quoi il sagit)3. excuter lopration entre le(s) registre(s) et les cellules mmoires contenant

    loprande4. sil sagit dune opration de branchement, modifier le compteur de programme en

    consquence, sinon faire passer le compteur linstruction qui suite dans la mmoire

    Les entres/sorties

    En gnral le systme dentre/sorties de base est trs rudimentaire. Par exemple, pour af-ficher quelque chose sur un cran il faut placer dans une zone de la mmoire des nombres quiseront interprts comme les couleurs donner chaque point de lcran. Il faut donc dessiner,sous forme de points, les lettres ou chiffres qui doivent apparatre. De mme, le fait denfoncerune touche du clavier envoie le numro de la touche, quil faut ensuite interprter en fonction dutype de clavier utilis (suisse-romand, franais, amricain, etc.).

    On voit quil y a l un norme travail de programmation faire. Heureusement, des pro-grammes dj tout faits sont fournis avec les machines, ils font partie du systme dexploitation

    Exemple: larchitecture Intel

    Cette architecture, qui est actuellement la plus rpandue dans le monde, trouve son originedans le processeur Intel 8086 sorti en 1978. Elle a peu peu volu, par ajouts successifs,jusquau processeurs actuels Pentium II et III. La mmoire est compose doctets (8 bits) et peutstendre jusqu 2

    36

    1 octets, soit environ 64 gigaoctets. Il y a 8 registres de 32 bits, six regis-tres de 16 bits, un registre dindicateurs de 32 bits et un compteur dinstruction de 32 bits.

    Le jeu dinstruction est compos de 36 instructions de mouvement de donnes (entre la m-moire et les registres ou entre registres); 12 instructions darithmtique entire; 6 instructionsdarithmtique dcimale code binaire; 4 instructions logiques; 9 instructions de dcalage et ro-tation; 23 instructions de traitement des octets et bits; 31 instructions de branchement et branche-ment conditionnel; 24 instructions de traitement des chanes de caractres; 11 instructions decontrle des indicateurs; 10 instructions de contrle des segments mmoire et autres; 49 instruc-tions MMX de traitement de paquets doctets; 92 instructions de calcul flottant; 30 instructionsde gestion systme; 57 instructions SIMD (traitement en parallle de plusieurs donnes).

    Rfrences

    [AHU 74] Aho, A., Hopcroft, J., Ullman, J. The Design and Analysis of Computer Algorithms, Addison Wes-ley, Reading MA, 1974.(nouvelles ditions sous dautres titres)

    www.intel.com

  • Introduction 11

    G. Falquet, CUI - Uni. Genve, 2001

    Annexe: La machine RAM

    La machine RAM (pour Random Access Memory) est un modle abstrait de calcul qui estrelativement proche des modles concrets que lon trouve dans les microprocesseurs. Contraire-ment la machine de Turing, la machine RAM peut accder immdiatement nimporte quellecellule de la mmoire, do son nom, sans avoir besoin de dplacer une tte de lecture/criturejusqu la cellule voulue. Une machine RAM est compose de quatre lments:

    une bande dentre qui est une squence de cases contenant chacune un nombre entier,cette bande est lue squentiellement par la machine;

    une bande de sortie sur laquelle la machine crit squentiellement des nombres entiers; une mmoire compose dune squence de cellules pouvant contenir chacune un nom-

    bre entier; une programme compos dune squence dinstructions semblables celles quon

    trouve dans les machines relles.Les instructions sont composes dun code dopration et dun argument. Largument est

    soit un oprande soit un numro dinstruction. On a trois type doprandes:1. =i, dsigne lentier i lui-mme2. i, dsigne le contenu de la cellule numro i de la mmoire3. *i, adressage indirect, dsigne le contenu de la cellule dont le numro est lentier trou-

    v dans la cellule numro i.De plus on utilise la premire cellule de la mmoire, dsigne par r0, comme accumula-

    teur ou zone de travail.Voici un exemple standard de types dinstructions [AHU 74]

    codeopra-tion

    argument effet

    chg oprande met loprande dans r0

    sto oprande met le contenu de r0 dans loprande (ne peut tre de la forme =i)

    add oprande ajoute loprande r0sous oprande soustrait loprande r0

    mul oprande multiplie r0 par loprande

    div oprande divise r0 par loprande

    lit oprande met le contenu de la case courante de la bande dentre dans oprande et avance dune case

    ecrit oprande crit loprande dans la case courante de la bande de sortie et avance dune case

    saut numro la prochaine instruction excuter sera celle dsigne par ce numro

  • 12 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

    La machine excute une programme en commenant par sa premire instruction. A tout mo-ment un compteur de programme P indique quelle sera la prochaine instruction excuter.Aprs chaque instruction P est mis P+1, sauf dans le cas de SAUTE, SSGZ, SSZ et HALT.

    Exemple: calculer la somme de trois nombres

    lit 1lit 2lit 3chg 1add 2add 3sto 4ecrit 4

    Exemple: calcule la valeur absolue de la diffrence de deux nombres

    1. lit 12. lit 23. chg 14. sous 25. ssgz 96. sto 37. chg =08. sous 39. sto 410. ecrit 4

    Exemple: calcul de p

    q

    (q

    0) par multiplications successives (on a remplac les numrosdinstructions par des tiquettes, pour simplifier)

    lit 1lit 2charge =1stocke 3

    test charge 2ssz finisoustr =1stocke 2charge 3mult 1saute test

    fini ecrit 3halt

    ssgz numro saute linstruction dsigne si r0 > 0

    ssz numro saute linstruction dsigne si r0 = 0

    halte arrte le programme

    codeopra-tion

    argument effet

  • Introduction 13

    G. Falquet, CUI - Uni. Genve, 2001

    Traduction de langage de haut niveau en RAM

    variable

    expression

    p.ex. X

    Y + 2*Zse traduit en RAM de la manire suivante :

    chg Zmult =2add Ysto X

    (o X, Y et Z reprsentent des numros de cellules diffrents, p.ex. 1, 2, et 3)

    3. Ecriture dune valeur

    crire

    expression

    4. Squence dinstruction

    {

    instruction

    ;

    instruction

    ; }p.ex. { X

    Z+1; U

    XK; }

    5. Excution conditionnelle:

    si

    (

    condition

    )

    instruction1

    sinon

    instruction2

    p.ex.

    si

    (A > B) W

    AB

    sinon

    W

    0

    peut se traduire en RAM par

    chg Asous Bssgz suitechg =0

    suite: sto W

  • 14 Introduction

    G. Falquet, CUI - Uni. Genve, 2001

  • 2 Types de donnes primitifs

    2.1 Reprsentation des nombres entiers

    Le principe de reprsentation de donnes en mmoire consiste coder les valeurs reprsenter sous forme binaire et stocker ces valeurs sous forme dune squence de bits duneou plusieurs cellules de la mmoire.

    Nombres entiers de 0 2

    n

    Pour crire un entier infrieur 2

    n

    il faut n chiffres binaires. Si une cellule mmoire est com-pose de n bits, elle peut contenir la reprsentation binaire de nimporte quel entier compris entre0 et 2

    n

    1. P.ex. dans un cellule de 8 bits le nombre dcimal 23, qui scrit 10111 en binaire,sera reprsent par la configuration de bits [00010111].

    Pour stocker un nombre plus grand que 2

    n

    on utilisera un nombre suffisant de cellules adja-centes. P.ex. pour des nombres compris entre 0 et 2000000000 il faut 4 cellules de 8 bits.

    Entiers relatifs (nombres ngatifs)

    La technique la plus usite pour reprsenter un nombre ngatif consiste prendre son com-plment 2. Pour reprsenter la valeur k on utilisera les n derniers bits de 2

    n

    k.Exemple (n = 8), pour reprsenter 6 on fait

    Par consquent, lutilisation de n bits permet de reprsenter les entiers compris entre 2

    n1

    et 2

    n1

    1.

    Oprations sur les entiers

    Etant donn que la reprsentation des entiers que nous avons choisie est limite, nous nepouvons pas utiliser la dfinition standard des oprations daddition, soustraction, multiplicationdes entiers. Si le plus grand entier reprsentable est 2

    7

    1 = 127, que vaut 127 + 3 ?Le choix standard consiste utiliser larithmtique modulaire, cest--dire prendre le

    reste de la division par 2

    n

    aprs chaque opration. En dautre termes, on ne considre que les npremiers bits du rsultat et on laisse tomber les autres.

    Exemple, calcul de 127 + 3 :

    (b8) b7 b6 b5 b4 b3 b2 b1 b01 0 0 0 0 0 0 0 0

    0 0 0 0 0 1 1 0

    = 0 1 1 1 1 1 0 1 0

    (b8) b7 b6 b5 b4 b3 b2 b1 b00 1 1 1 1 1 1 1

    + 0 0 0 0 0 0 1 1

    = 1 0 0 0 0 0 1 0

  • 16 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    donc 127 + 3 = 126.Tout se passe comme si les nombres taient arrangs sur un cercle :

    Lopration de division doit galement tre redfinie de manire fournir un nombre entier com-me rsultat. En gnral il sagit de lentier infrieur le plus proche. Par exemple: 7/3 = 2 ou 39/20 = 1. La division par 0 est considre comme une erreur.

    Nombres entiers illimits

    Il est bien sr possible de reprsenter des nombres arbitrairement grands, pltot que de se limiter n bits de reprsentation. Il suffit pour cela dattribuer chaque nombre une quantit de mm-oire suffisante, sous forme de cellules contiges.

    Cependant, la plupart des processeurs ne sont pas prvus pour traiter ce type de reprsenta-tion. Il faut donc crire des programmes spcifiques qui utilisent larithmtique modulaire duprocesseur pour traiter les nombres par morceaux de n bits. Le traitement des nombres illimitsest de ce fait beaucoup moins efficace que celui des nombres limits.

    Les modles courants de nombres entiers proposs par les processeurs

    Ces modles utilisent en gnral un multiple de 8 bits, on trouve:le byte: entier de 8 bits, de -128 +127le mot: entier de 16 bits, de -32768 +32767le double mot: entier de 32 bits, de -2

    31

    2

    31

    -1le quadruple mot: entier de 64 bits, de -2

    63

    2

    63

    -1

    Les modles proposs par les langages de programmation

    1. Dans certains langages le modle dentiers est calqu sur celui du processeur sous-jacent: C,Pascal, etc.2. Un langage comme Ada permet de dfinir des types dentiers

    p.ex.

    type MesNombres is -2 .. +3000

    3. Le langage Java propose des types standards indpendants du processeur:

    0

    12

    3

    12

    3

    125126

    127

    128127

    126. . .

    . . .

  • Types de donnes primitifs 17

    G. Falquet, CUI - Uni. Genve, 2001

    int -> entier de 32 bitslong -> entier de 64 bitsbyte -> entier de 8 bitsshort -> entier de 16 bits

    4. Dautres langages proposent des nombres illimitsp.ex. Smalltalk, Maple, Mathematicaou des nombres de taille fixe mais aussi grande que lon veutp.ex. SQL, COBOL

    2.2 Les nombres flottants

    Les nombres flottants (ou nombres virgule flottante) sont des reprsentations de certains nom-bres rels. Etant donn quil existe une infinit de nombres rels, et quentre deux relsquelconques il y a une infinit dautres rels, il est bien vident quon ne peut avoir une reprsen-tation de taille finie pour chaque rel. La reprsentation dun nombre rel sera donc une approx-imation, cest dire la reprsentation dun autre nombre, suffisament proche.

    Par exemple, sur une calculette dix chiffres on reprsente le nombre

    p

    par 3.141 592 653,cest dire par le nombre rationnel 3 141 592 653 / 1 000 000 000.

    Nous nous intresserons ici la reprsentation des rels par des squences de bits de taillefinie et fixe. Le format classique des nombres flottants est compos dune mantisse, qui est unnombre entre 1.0 et 1.5, dun exposant et dun signe.

    Par exemple, le standard IEEE-754 dfinit le format suivant:

    Selon cette norme, une squence de bits [s e

    7

    e

    6

    e

    0

    m

    23

    m

    22

    m

    1

    m

    0

    ] reprsente le nombre

    Exemple

    a) [1 10000000 010010000000000000000000 ] reprsente 1.01001

    2

    10000000127

    = (1 + 1/2

    2

    + 1/2

    5

    )

    2

    128127

    = (2 + 1/2 + 1/2

    4

    ) = 2.5625b) Reprsentation de 1/3

    1/3 = 0.010101010101010101010... en binaire= 1.01010101010101010...

    2

    2

    donc: signe: 0exposant: 1272 = 125 = 01111101 en binaire

    bit no. 31 30 ... 23 22 ... 0

    signe exposant+127 mantisse

    s( ) 1 m23m22m1m0, 2e7e6e0 127

    sgn

  • 18 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    mantisse: 01010101010101010101010Le nombre 1/3 est donc reprsent par la squence de 32 bits [0 01111101 01010101010101010101010]

    Le format double prcision est le suivant:

    Le plus petit nombre strictement positif que lon peut reprsenter esten simple prcision: 1.4 x 10

    45

    en double prcision: 4.9 x 10

    324

    Le plus grand nombre positif que lon peut reprsenter esten simple prcision: 3.4 x 10

    38

    en double prcision: 1.8 x 10

    308

    De plus, des configuration de bits rserves cet effet permettent de reprsenter linfini positif,linfini ngatif (rsultats de divisions par 0, p.ex.), ainsi que lindtermin (0/0).

    Prcision de la reprsentation

    La prcision de la reprsentation est lerreur que lon peut commt en reprsentant un nom-bre.

    Par exemple, la reprsentation de 1/3, ci-dessus, nglige les chiffres aprs la 23 me posi-tion. Lerreur est donc 0.0....(23 fois 0) ...01010101010

    2

    2

    @

    1.5

    10

    8

    .

    Si lon prend le cas des nombres flottants en simple prcisions, la plus grande erreur arrivelorsque les chiffres ngligs sont tous des 1. Dans ce cas, pour un nombre dexposant exp, ler-reur est:

    0.0...(23 fois)...011111111...

    2

    exp127

    = 2

    23

    2

    exp127

    .

    Le rapport entre lerreur et le nombre reprsent est donc :(2

    23

    2

    exp127

    ) / (1.m

    23

    m

    22

    m

    1

    m

    0

    2

    exp127

    )

    2

    23

    @

    10

    7

    Cela signifie que lerreur relative maximum pour la reprsentation dun nombre rel en sim-ple prcision est infrieure 10

    7

    ; en dautres termes, les 7 premiers chiffres sont reprsentscorrectement.

    Dans le cas de la double prcision lerreur relative est infrieure 2

    52

    @

    10

    16

    .

    2.3 Prcision des calculs et analyse numrique

    La reprsentation des nombres ntant pas exacte, le rsultat dun calcul ne correspond pasforcment la valeur mathmatique exacte. Si en thorie on a

    a + b = csur la machine on a

    bit no. 63 62 ... 52 51 ... 0

    signe exposant+1023 mantisse

  • Types de donnes primitifs 19

    G. Falquet, CUI - Uni. Genve, 2001

    a + b = c (1 +

    e

    ab

    )Le terme

    e

    ab

    reprsente lerreur darrondi, il dpend de a et de b.Lune des consquence de ce fait est que sur une machine(a + b) + c

    a + (b + c) en gnral.Par exemple. On veut calculer

    on peut effectuer le calcul en commenant par les premiers termes :s1 = (((((1+1/4)+1/9)+1/16)+1/25)+)+1/10000000000

    ou par les dernierss2 = 1+(1/4+(1/9+(1/16+(1/25+(+1/10000000000)))))

    un calcul thorique montre que | s s1 |

    1.6 10

    5

    e

    | s s2 |

    9.2

    e

    o e est la prcision de reprsentation des nombres (p.ex. 10

    7

    pour les

    float

    ).Si lon effectue le calcul avec un programme Java en utilisant des nombres de type float on

    obtients1 = 1.64473s2 = 1.64493alors que le s exact est 1.64492407La propagation des erreurs peut devenir norme dans certains cas. Prenons par exemple le

    calcul de la fonction exponentielle avec la formule de Taylor:

    On utilise lalgorithme suivant pour calculer une approximation de ex en prenant les 20 pre-mier termes de la srie de Taylor:

    1. t

    1; e

    1;2. pour n de 1 20 {3. t

    t * x / n4. e

    e + t

    5. }En programmant cet algorithme en Java avec des nombres de type float on obtient les

    rsultats suivants:

    s1n

    2-----

    n 1=

    100000

    =

    ex 1 x x

    2

    2!-----x

    3

    3!-----x

    4

    4!----- x

    n

    n!----- + + + + + + +=

  • 20 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    La branche des mathmatique qui sintresse aux algorithmes numriques et aux problmesde prcision de calculs sappelle l

    analyse numrique

    . Les travaux en analyse numtique on misen vidence deux notions fondamentales que nous allons prsenter brivement ci-dessous.

    Problmes mal conditionns

    Il existe des problmes pour lesquels on ne peut trouver de mthodes de calcul qui donnent desrsultats prcis (sauf en utilisant des nombres de taille illimite !).

    ExempleOn souhaite calculer

    pour a = 1000 et b = 999999.987654321 avec une machine qui a 8 chiffres de prcision. Ona :

    a

    2

    1000000.00-b 999999.99 = 0.01

    donc a +/- (a

    2

    b)

    1/2

    = 1000 +/- 0.01

    1/2

    = 1000.1 et 999.9 alors que les vraies valeurs sont1000.111111 et 999.888888. Il ne reste donc que 4 5 chiffres corrects. Ceci vient de la sous-traction qui nous a fait perdre beaucoup de prcision. Cest un exemple de problme mal condi-tionn.

    Un problme consistant calculer y = F(x) est mal conditionn si une petite variation de lavaleur de x entraine une grande variation de y. Le nombre de condition C dun problme y = F(x),pour une valeur b du paramtre x est dfini comme

    Si C est grand le problme est dit mal conditionn.Justification: si b est la valeur thorique, la valeur effectivement reprsente en mmoire est

    b(1+

    e

    ). Lerreur de calcul est donc F(b(1+

    e

    )) F(b). F(b(1+

    e

    )) = F(b + b

    e)

    est approximative-ment gal F(b)+F(b)b

    e

    . Lerreur ralative est donc |(F(b)+F(b)b

    e

    F(b)) / F(b) |.

    x e

    x

    calcul e

    x

    exact

    -1 0.367879 0.367879

    -5 0.00670682 0.0067379

    -10 -27.7064 0.0000454

    -20 -2.1866 10

    7

    2.0612 10

    9

    x1 2, a a2 b=

    C bF' b( )F b( )----------------=

  • Types de donnes primitifs 21

    G. Falquet, CUI - Uni. Genve, 2001

    Stabilit numrique

    Le fait quun problme soit bien conditionn ne veut pas dire que tout algorithme donneraune rponse prcise. On dira quun algorithme est numriquement stable si la valeur F

    calc

    (b) cal-cule par lalgorithme ( la place de la vraie valeur F(b)) est la solution dun problme proche.Cest dire que F

    calc

    (b) = F(b +

    e

    ) avec

    e

    petit.Lalgorithme de calcul de F(b) = e

    b

    que nous avons prsent plus haut nest pas stable, eneffet: pour b = 10 il donne F

    calc

    (b) = 27.7064, or il nexiste pas d

    e

    , mme assez grand, tel que e

    10+

    e

    = 27.7064.Cet algorithme est par contre stable pour la valeurs de b comprises entre 1 et +1. On en

    dduit un nouvel algorithme:Soit y la partie entire de x et z = xydonc e

    x

    = e

    y+z

    = e

    y

    e

    z

    1. calculer e

    y

    par multiplications (et inversion la fin si y < 0)2. calculer e

    z

    par lalgorithme prcdent3. multiplier les deux rsultatsCette brve incursion dans lanalyse numrique avait essentiellement pour but de montrer

    que larithmtique des nombres flottants ne doit surtout pas tre assimile larithmtique desnombres rels intuitifs ou tels quils sont dfinis en analyse mathmatique. Il ny a pas de cor-respondance bi-univoque entre larithmtique en virgule flottante des machines et celle du corps

    R

    des rels.

    2.4 Conversions de type

    En mathmatique on a les inclusions naturelles

    N

    Z

    Q

    R

    (les entiers font partie desentiers relatifs, qui font partie des rationnels, qui font partie des rels). Il nen va pas de mmeentre les types numriques. Par exemple, un entier sur 64 bits ne peut pas tre reprsent exact-ement par un flottant sur 32 bits. Il faut une opration de conversion qui trouve le flottant le plusproche de lentier reprsenter. Par exemple, lentier 123 456 789 012 345 sera converti en1.234568E+14., cest dire 123456800000000.

    Il existe cependant des conversions, dites largissement, qui ne posent pas de problmes, onpeut par exemple toujour passer dun entier sur n bits un entier sur m bits lorsque m > n. Demme on peut passer directement dun flottant avec k bits de mantisse et t bits dexposants unflottant k' bits de mantisse et t' bits dexposant si k'

    k et t'

    t.

    Par contre, la conversion en sens inverse (rtrcissement) pose des problmes. Diffrentesapproches existent pour les rsoudre.

    En Java: la conversion dun type entier n bits vers un type m bits (m < n) consiste sim-plement prendre les m premiers bits du nombre. Ce qui fait que le nombre int (32bits) 65537devient 1 lorsquil est converti en short (16bits). Pour viter de trop mauvaises surprises une telleconversion doit tre crite explicitement dans un programme

    int i = 65537;// short s1 = i --- ERREUR, affectation interditeshort s2 = (int)i // prend les 16 premiers bits de i et affecte s2

  • 22 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    Dans dautres langages la smantique peut tre diffrente. On peut par exemple avoir uneerreur lexcution si un dpassement de capacit se produit.

    Il est utile de rappeler ici que lchec du premier tir de la fuse Ariane 5 a t caus par uneerreur du systme informatique de guidage. Cette erreur est survenue lors dune conversion detype qui a caus un dpassement de capacit dune variable. Parmi les recommandations misessuite cet accident on notera :

    Identifier toutes les hypothses implicites faites par le code et ses documents de justi-fication sur les paramtres fournis par l'quipement. Vrifier ces hypothses au regard desrestrictions d'utilisation de l'quipement.

    Vrifier la plage des valeurs prises dans les logiciels par l'une quelconque des variablesinternes ou de communication.

    2.5 Les Caractres

    La reprsentation des caractes est une convention qui associe chaque caractre de lalphabetun nombre binaire, c--d une configuration de bits. Il sagit forcment dune convention car ilny a pas dordre canonique des caractres (sauf pour les lettres). La reprsentation des car-actres a volu au cours du temps, en fonction du type dutilisateurs de linformatique et deleurs besoins spcifiques. On est pass progressivement de codages sur 6 bits au codage actuelsur 16 bits, comme le montre le tableau suivant :

    nb. bits

    nb. caractres reprsentables nom remarques

    6 64 Permet de reprsenter les 26 lettres majus-cules latines, les chiffres 0..9, les symboles de ponctuation: , : ; . ( ) etc. Suffisant pour crire des programmes et imprimer des rsultats.

    7 128 ASCII Standard adapt la langue amricaine : lettres majuscules et minuscules sans accents, chiffres, symboles de ponctuation.

    8 256 IBM-PC Reprsentation des lettres latines maj. et min. y compris les lettres accentues, rendu ncessaire pour le dveloppement des logiciels de traitement de texte.

    8 256 Apple Idem chez Apple avec larrive du Macin-tosh

    8 256 ISO-xxx Ensemble de standards de reprsentation adapts diffrents groupes linguistiques (p.ex. ISO-Latin-1 permet la reprsenta-tions des lettres utilises dans les langues latines)

  • Types de donnes primitifs 23

    G. Falquet, CUI - Uni. Genve, 2001

    2.6 Le Standard Unicode

    Il est intressant dtudier le nouveau standard Unicode pour voir que la cration dun code dereprsentation des caractres nest pas simplement technique mais galement conceptuel et lin-guistique.Les principales caractristiques dUnicode sont :

    la capacit dencoder tous les caractres du monde ; le codage sur 16 bits ; un mcanisme dextension (UTF-16) pour coder un million de caractres

    supplmentaires si ncessaireLes alphabets traits sont :

    Latin, Greek, Cyrillic, Armenian, Hebrew, Arabic, Devanagari, Bengali, Gurmukhi,Gujarati, Oriya, Tamil, Telugu, Kannada, Malayalam, Thai, Lao, Georgian, Tibetan,Japanese Kana, modern Korean Hangul, Chinese/Japanese/Korean (CJK) ideographs.Et bientt: Ethiopic, Canadian Syllabics, Cherokee, additional rare ideographs, Sinha-la, Syriac, Burmese, Khmer, and Braille.

    Ponctuation, diacritiques, mathmatique, technique, flches, dingbats Signes diacritiques de modification de prononciation (n + ~ = ) 18,000 codes en rserve

    Elments de texte, caractres et glyphes

    Dun point de vue conceptuel il nest pas vident de dfinir ce quest un caractre. Un lmentde texte peut tre compos de plusieurs caractres. Par exemple, en espagnol le double l llcompte comme un seul lment, comme sil sagissait dune lettre spciale. Les concepteursdUnicode ont choisi de dfinit des lments de code (caractres) plutt que des lments detexte.

    p.ex. llment de texte ll est donc trait comme deux codes: l + l chaque lettre majuscule et minuscule est un lment de code

    Dautre part il faut distinguer le caractre (la valeur dun code) et son affichage sur lcran ousur le papier. On a donc une notion de

    caractre abstrait

    , par exemple : "LATIN CHARACTER CAPITAL A" "BENGALI DIGIT 5"

    et une notion de

    glyph

    qui est la marque faite sur un cran ou sur papier pour reprsenter visuelle-ment un caractre, par exemple

    A

    A

    A

    A

    A

    16 65536 Unicode Un standard unique pour reprsenter tous les caractres utiliss dans le monde, y compris les idogrammes.

    nb. bits

    nb. caractres reprsentables nom remarques

  • 24 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    sont des glyphs qui reprsentent le caractre "LATIN CHARACTER CAPITAL A". Unicode nedefinit pas les glyphs et ne spcifie donc pas la taille, forme, orientation des caractres sur lc-ran.

    Il existe galement une notion de caractres composites (p.ex. ) qui est form de une lettre de base (qui occupe un espace) "a" un ou plus marques (rendus sur le mme espace) "^"

    Unicode spcifie lordre des caractres pour crer un composite la rsolution des ambigits la dcomposition des caractres prcomposs

    "" peut tre encod par le code U+00FC

    1

    (un seul caractre de 16-bits)ou bien dcompos en U+0075 + U+0308 ("u"+"").lencodage en un seul caractre assure la compatibilit avec le standard ISO-Latin-1.

    2.7 Dfinition des codes

    Lors de lattribution des codes aux caractres on a veill assurer linclusion de standards prc-dents (0 .. FF = Latin-1). De plus on a dfini une notion de script qui est un systme cohrent decaractres utiliss par plusieurs langues. Ceci afin dviter les duplification. Par exemple, le chi-nois, le japonais et le coren utilisent tous le mme script (nomm CJK) car ils ont plusieurs mil-liers de caractres en commun.Comme on peut sy attendre, un texte est une squence de codes correspondant lordre defrappe au clavier des caractres. Cependant toutes les langues ne scrivent pas dans la mmedirection, il existe donc des caractres spciaux de changement de direction.Lattribution des codes obit aux principes suivants :Un nombre de 16 bits est assign chaque lment de code du standard. Ces nombres sont ap-pels les valeurs de code

    U+0041 = nombre hexadcimal 0041 = dcimal 65 reprsente le caractre "A" .Chaque caractre reoit un nom

    U+0041 sappelle "LATIN CAPITAL LETTER A." U+0A1B sappelle "GURMUKHI LETTER CHA." (standard ISO/IEC 10646)

    Des blocs de codes de taille variable sont alous aux scripts en fonction de leur nombre de car-actres. Lespace des codes est actuellement alous selon la squence suivante : [standard ASCII(Latin-1)] - [Greek] - [Cyrillic] - [Hebrew] - [Arabic] - [Indic] - [other scripts] - [symbols andpunctuation] - [Hiragana] - [Katakana] - [Bopomofo] - [unified Han ideographs] - [modernHangul] - [surrogate characters] - [reserved for private use (never used)] - [compatibility char-acters].Lordre alphabtique lintrieur dun script est si possible maintenu

    1. La notation U+dddd signifie quil faut lire le nombre dddd comme un code Unicode en base 16.

  • Types de donnes primitifs 25

    G. Falquet, CUI - Uni. Genve, 2001

    Base de donne de codes

    Il existe une base de donnes de codes qui dfinit, outre le code et le nom de chaque caractre,dautres attributs utiles pour le traitement des textes. Pour chaque caractre on a les quatorzechamps

    0 Code value 1 Character Name. 2 General Category3 Canonical Combining Classes4 Bidirectional Category5 Character Decomposition6 Decimal digit value : lorsque le caractre reprsente un chiffre, p.ex. le "

    V

    " romain7 Digit value8 Numeric value9 "mirrored" (pour lcritures bidirectionnelles)10 Unicode 1.0 Name11 10646 Comment field12 Upper case equivalent mapping13 Lower case equivalent mapping14 Title case equivalent mapping

    Quelques exemples tirs de la base ftp://ftp.unicode.org/Public/2.1-Update3/UnicodeData-2.1.8.txt :

    0041;LATIN CAPITAL LETTER A ;Lu;0;L;;;;;N;;;;0061;005E;CIRCUMFLEX ACCENT;Sk;0;ON; 0020 0302;;;;N;SPACING CIRCUMFLEX;;;;0F19;TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS; Mn;220;ON;;;;;N;;dong tsu;;;112C;HANGUL CHOSEONG KAPYEOUNSSANGPIEUP; Lo;0;L; 1107 1107 110B;;;;N;;;;;1EE4;LATIN CAPITAL LETTER U WITH DOT BELOW; Lu;0;L;0055 0323;;;;N;;;;1EE5;FC64;ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM;Lo;0; R; 0626 0631; ;;;N;;;;;

    Formes dencodage

    Il faut faire la diffrence entre la dfinition des codes Unicode pour la reprsentation des car-actres et la manire dont ces caractres sont stocks sur les supports physiques (p.ex. dans desfichiers). Il existe deux modes principaux dencodage :UTF-16

    caractres 16-bits paires de 2 x 16-bits pour extension

    UTF-8 codage longueur variable

    0x00 .. 0x7F ==> 1 byte (mme codes que ASCII)0x80 .. 0x3FF ==> 2 bytes0x400 .. 0xD7FF, 0xE000 .. 0xFFFF ==> 3 bytes

  • 26 Types de donnes primitifs

    G. Falquet, CUI - Uni. Genve, 2001

    0x10000 .. 0x10FFF ==> 4 bytes conversion sans perte vers et de UTF-16

    2.8 Le type caractre

    Tout ce que nous venons de prsenter montre que le type caractre nest pas aussi simple quilen a lair au premier abord. Il existe de nombreuses oprations, parfois complexes, sur ce type.Si lon considre que les deux oprations de base sur les caractres sont lencodage et le d-codage (passer dun caractre lentier correspondant et rciproquement), on peut numrerdautres oprations telles que :

    trouver lquivalent majuscule dun caractre trouver lquivalent minuscule dun caractre encoder un caractre sous forme UTF-8 composer un caractre partir dun caractre de base et de marques etc.

    Si lon prend le standard Unicode, ces oprations ncessitent une consultation de la base de don-nes des caractres ainsi que lapplication de rgles de compositions non triviales.

  • Chaines de caractres 27

    G. Falquet, CUI - Uni. Genve, 2001

    3 Chaines de caractres

    3.1 Vision abstraite des chanes

    Commenons par considrer les chanes de caractres indpendemment de toute reprsentationde celles-ci dans une machine. Dans cette vision abstrate on sintresse caractriser les chanesau niveau de leur structure (de quoi sont-elles faites ?) et des oprations que lon peut effectueravec ce type de donnes

    Une vision oriente modle (structure)

    Lorsquon parle de chane de caractres, la premire ide qui vient lesprit est quil sagit dunesquence de caractres. Cette ide correspond un point de vue ensembliste qui peut se rsumerde la manire suivante :Une chane de caractres est une squence de caractres.Le type de donnes chane de caractres est form de lensemble de toutes les squences pos-sibles (y compris la squence vide ).Sur la base de cette dfinition on peut dfinir les principales oprations sur les squences

    concatnation +

    fi

    lment la position i

    fi

    c

    i

    modifier llment la position i

    fi

  • 28 Chaines de caractres

    G. Falquet, CUI - Uni. Genve, 2001

    n = k c

    i

    =

    degr

    d

    i

    (i = 1, n)o =

    degr

    est un galit sur les caractres dfinie comme =

    0

    : galit stricte =

    1

    : des caractres diffrents selon =

    0

    sont considrs gauxp.ex. "e" =

    1

    "" ==> "frquence" = "frequence" =

    2

    : encore plus largep.ex. "e" =

    2

    "E" ==> "Frquence" = "frequence" etc.

    Cette notion dgalit dpend bien entendu de la langue, ou mme de la rgion! (voir: classe ja-va.text.Collator)

    Comparaison des chanes

    On utilise gnralement lordre lexicographique qui est bas sur lordre des caractres dans lal-phabet (ou le script Unicode). Le principe consiste comparer les caractres des deux chanes partir de la gauche jusqu ce quon trouve un caractre diffrent ou quon ait atteint le boutdune des chanes.

    On a

    si

    $

    p . p

    min(n, k) et c

    1

    =

    d

    1

    , , c

    p1

    =

    d

    p1

    et [ c

    p

    < d

    p

    ou ( p = n et n

    k) ]Donc

    "xyZot"

    "xyaot" ("Z"

    naturel

    spcifie que laddition est une opration qui a deux paramtres de sorte naturel qui produit unrsultat galement naturel.

    est-pair: naturel -> booleen

    lopration

    est-pair

    prend un paramtre naturel et rend un rsultat boolen.

    zero: -> naturel

    zero

    est une opration constante qui na pas de paramtre et retourne un naturel, qui sera toujoursle mme.La forme gnrale de la signature dune oprations n-aire est:

  • Les types abstraits 37

    G. Falquet, CUI - Uni. Genve, 2001

    opration

    :

    sorte

    1

    ,

    sorte

    2

    , ,

    sorte

    n

    ->

    sorte

    r

    .

    Une expression construite laide des oprations et de variables et qui respecte la signature estappele un

    terme

    . Par exemple:

    zero

    est-pair(zero)addition(Y, addition(X, zero))

    Parmi les oprations certaines sont appeles

    gnratrices

    , ce sont celles qui serviront constru-ire les valeurs dune sorte. Par exemple, lopration sucesseur permet de construire tous lesentiers partir de la constante zro.Les axiomes dcrivent les proprits des oprations sous forme dquivalences entre termes. Parexemple

    addition(X, Y) == addition(Y, X)

    signifie que pour toute valeur des variables X et Y, si lon change lordre des paramtres delopration daddition on obtient une expression quivalente, c--d que laddition est commuta-tive.

    addition(X, zero) == X

    signifie que laddition de la constante zero nimporte quelle valeur donne la valeur elle-mme.Le symbole == doit se lire comme est quivalent , il na pas de direction privilgie et sig-nifie quon peut remplacer ce qui est gauche par ce qui est droite et rciproquement.Lapplication des axiomes des termes et des sous-termes permet dobtenir dautres expressionsquivalentes. Par exemple, lexpression

    addition(zero, X)

    est quivalente

    addition(X, zero)

    par application du premier axiome. Lapplication du second axiome nous donne ensuite

    X.

    Nous avons donc prouv que

    addition(zero, X) == X

    .

    En gnral trouver la valeur dune expression consiste la rduire, grce aux axiomes, une ex-pression quivalente qui ne contient que des constantes et des oprations gnratrices.La forme gnrale des axiomes est:

    terme

    g1

    == terme

    d1

    et et terme

    gn

    == terme

    dn

    => terme

    1

    == terme

    2

    La partie avant le => restreint lapplication de lquivalence terme

    1

    et terme

    2

    , c--d terme

    1

    est quivalent terme

    2

    seulement si lon peut auparavant prouver toutes les quivalences qui setrouvent avant le signe =>. Pour allger lcriture, on remplacera souvent les deux quations

    b == vrai => t1 == t2 (o b est un terme de sorte boolen)b == faux => t1 == t3

    par un quation compacte

  • 38 Les types abstraits

    G. Falquet, CUI - Uni. Genve, 2001

    t1 ==

    si

    b

    alors

    t2

    sinon

    t3ou encore part1 == t2

    si

    b, == t3

    sinon

    4.4 Exemple: spcification dun type Cercle

    Reprenon le type cercle esquiss prcdemment et formalisons sa dfinition (tout en lui ajoutantles oprations de calcul du primtre et de translation horizontale).

    SPECIFICATION

    Cercle

    SORTES

    entier, rationnel, cercle

    OPERATIONS

    perimetre : cercle -> rationnelrayon : cercle -> entiercercle-unit : -> cerclecentre-x : cercle -> entiercentre-y : cercle -> entiertranslater : cercle, entier, entier -> cercleelargir : cercle, entier -> entiercercle : entier, entier, entier -> cerclecercle : entier -> cercle

    AXIOMESVARIABLES

    X, Y, Z, DX, DY: entier; C: cercle;

    centre-x(cercle-unit) == 0centre-y(cercle-unit) == 0rayon(cercle-unit) == 1

    rayon(cercle(X,Y,Z)) == Zcentre-x(cercle(X,Y,Z)) == Xcentre-y(cercle(X,Y,Z)) == Y

    centre-x(translater(C, DX)) == centre-x(C)+DXcentre-y(translater(C, DY)) == centre-y(C)+DYrayon(translation-horizontale(C, DX)) == rayon(C)

    centre-x(elargir(C, D)) == centre-x(C)centre-y(elargir(C, D)) == centre-y(C)rayon(elargir(C, D)) == rayon(C)+D

    PRE

    elargir(C, X) == rayon(C) + X

    0

    Les trois premiers axiomes dfinissent ce quest un cercle unit : un cercle centr en (0, 0) et derayon 1. Les trois axiomes suivants tablissent quelques vidences, du genre, le rayon dun cer-cle centr en (X, Y) et de rayon Z vaut Z, etc. On a ensuite trois axiomes qui nous disent quaprsune translation la coordonne X du centre est modifie, de mme que la coordonne Y alors quele centre reste le mme. Finalement les trois derniers axiomes dfinissent lopration largir quine modifie par le centre mais uniquement le rayon.

    la suite des axiomes, la spcification contient une prcondition sur lopration elargir.Celle-ci spcifie que lopration ne peut tre utilise que si ses oprandes C et X satisfont la con-dition rayon(C) + X

    0. Cette prcaution nous permet de garantir que le rayon dun cercle esttoujours un nombre positif ou nul. Lopration elargir nest donc pas une fonction totale, il y ades valeurs de C et X pour lesquelles elle nest pas dfinie.

  • Les types abstraits 39

    G. Falquet, CUI - Uni. Genve, 2001

    4.5 Spcification de quelqus types lmentaires

    Si lon veut construire compltement un ensemble de types abstraits algbriques il faut comenc-er par dfinir les briques de base que sont les nombres naturels et les valeurs boolennes. Com-menons par une spcification des boolens:

    SPECIFICATION BoolensSORTES

    boolOPERATIONS

    vrai : -> bool;faux : -> bool;non : bool -> bool;_et_ : bool, bool -> bool; // notation infixe_ou_ : bool, bool -> bool;

    AXIOMESVARIABLES X : bool;[1] non(vrai) == faux;[2] non(faux) == vrai;[3] vrai et X == X; [4] faux et X == faux;[5] vrai ou X == vrai;[6] faux ou X == X;

    Ces axiomes permettent de rduire vrai ou faux toute expression forme de et, ou et non et desconstantes vrai et faux. Par exemple:

    non(vrai ou (faux et non(vrai)))== non(vrai ou (faux et faux)) (par [1])== non(vrai ou faux) (par [4])== non(vrai) (par [5])== faux (par [1]).

    partir de cette spcification on peut construire les entiers naturels

    SPECIFICATION NatUTILISE BoolSORTES natOPERATIONS

    0 : -> nat;succ : nat -> nat;_+_ : nat, nat -> nat;_-_ : nat, nat -> nat;_*_ : nat, nat -> nat;_^_ : nat, nat -> nat;_=_ : nat, nat -> bool;

    AXIOMESVAR X, Y : nat;

    [1] X + 0 == X;[2] X + succ(Y) == succ(X + Y);[3] 0 - X == 0; -- convention pour viter de sortir des entiers

    -- naturels.[4] X - 0 == X;[5] succ(X) - succ(Y) == X - Y;

    [6] X * 0 == 0;

  • 40 Les types abstraits

    G. Falquet, CUI - Uni. Genve, 2001

    [7] X * succ(Y) == X + (X * Y);[8] X ^ 0 == succ(0);[9] X ^ succ(Y) == X * (X ^ Y);[10] 0 = 0 == vrai;[11] succ(X) = 0 == faux;[12] 0 = succ(X) == faux;[13] succ(X) = succ(Y) == X = Y

    Calculons 2+1:

    succ(succ(0)) + succ(0)== succ(succ(succ(0)) + 0) -- [par 2 en prenant X=succ(succ(0)) et Y=0]== succ(succ(succ(0))) -- [par 1]

    4.6 Spcification des tableaux

    Un tableau est une collection indexe dlments du mme type. Chaque lment du tableauest repr par son indice. On peut accder llment no. i et le modifier. La spcification ci-dessous dcrit un tableau dont les lments sont dune sorte t quelconque dfinie dans une spci-fication T. T est mis entre parenthse pour indiquer quil sagit dun paramtre interchangeable,cest--dire quon peut remplacer T par nimporte quelle spcification conforme T (voir plusbas). Les noms bizarres des oprations ont t choisis de faon correspondre la syntaxe quontrouve dans certaines langages de programmation.

    SPECIFICATION

    Tableau(T)

    UTILISE

    Bool, Nat

    SORTES

    tab

    OPERATIONS

    init(_) : t -> tab;_[_] : tab, nat -> t;_[_]

    _ : tab, nat, t -> tab;

    AXIOMESVAR

    A, B : tab; I : nat; X : t

    init(X)[I] == X(A[J]

    X)[I] == si I = J alors X sinon A[I]

    Le premier axiome indique quaprs avoir initialis un tableau avec la valeur X, laccs nimporte quel lment I donne X comme valeur. Le second dit que si lon donne la valeur X auJme lment et quon demande la valeur du Jme lment alors on trouve bien X, et les autreslments restent inchangs. On notera que les tableaux ainsi dfini sont de taille illimite.

    Notre spcification de tableau est gnrique, on peut lutiliser pour faire des tableaux deboolens, de naturels, etc. Il suffit pour cela de remplacer T par une spcification existante. Parexemple :

    SPECIFICATION

    TableauNat = Tableau(T

    fi

    Nat

    avec

    t

    fi

    nat)T est remplace par Nat et la sorte t par la sorte nat de Nat. Voyons le fonctionnement de notre spcification TableauNat sur quelques expressions :

    (((init(a)[3]

    b)[2]

    c)[4]

    b)[3]== ((init(a)[3]

    b)[2]

    c)[3]== (init(a)[3]

    b)[3]

  • Les types abstraits 41

    G. Falquet, CUI - Uni. Genve, 2001

    == b((((init(a)[3]

    b)[2]

    c)[3]

    w)[4]

    b)[3]== (((init(a)[3]

    b)[2]

    c)[3]

    w)[3]== w

    Ce dernier cas montre que la valeur trouve lindice 3 est bien la dernire quon y a mise.Le w a remplac le b quon avait mis au dbut.

    ((((init(a)[3]

    b)[2]

    c)[3]

    w)[4]

    b)[8] == ... == init(a)[8] == aDans ce cas on trouve la valeur dinitialisation car on na rien mis lindice 8.

    Tableaux de taille fixe

    Dans ce cas on veut que le tableau soit constitu dun nombre dlment fixe, dfini au mo-ment de son initialisation. On ajoute donc un paramtre pour fixer la longueur lopratin initet on ajoute une opration longueur pour accder la longueur du tableau.

    SPECIFICATION

    Tableau(T)

    UTILISE

    Bool, Nat

    SORTES

    tab

    OPERATIONS

    init(_, _) : T, nat -> tab;_[_] : tab, nat -> T;_[_]

    _ : tab, nat, T -> tab;longueur(_) : tab -> nat;

    AXIOMES

    VAR A, B : tab; I, N : nat; X : T

    init(X, N)[I] == X(A[J]

    X)[I] == si I = J alors X sinon A[I]

    longueur(init(A, N)) == N;longueur(A[I]

    X) == longueur(A);

    PRE

    A[I]

    X == I < longueur(A);

    PRE

    A[I] == I < longueur(A);

    Les deux prconditions sont l pour viter tout accs un indice hors du tableau (pour untableau de taille N les indices vont de 0 N1).

    4.7 Les types produits cartsiens

    Le produit cartsien de n ensembles E

    1

    , E

    2

    , , E

    n

    est form de tous les n-tuples (a

    1

    , a

    2

    , ,

    a

    n

    ) o chaque a

    i

    est un lment de E

    i

    . Les oprations qui nous intressent sur les n-tuples sont :accder au i

    e

    composantmodifier le i

    e

    composantOn peut dfinir une structure gnrale pour la spcification de type produit cartsien, selon

    le schma suivant :

    SPECIFICATION

    Prod(S1, S2, , Sn)

    SORTES

    : n-tuple

    OPERATIONS

    :

    (_, _, , _): s1, s2, ..., sn

    fi

    n-tuple

  • 42 Les types abstraits

    G. Falquet, CUI - Uni. Genve, 2001

    a1 : n-tuple

    fi

    s1...

    an : n-tuple

    fi

    sn

    m1 : s1, n-tuple

    fi

    produit...

    mn : sn, n-tuple

    fi

    produit

    Les oprations

    a1

    an

    servent accder aux composants alors que

    m1

    mn

    servent mod-ifier les composants dun produit. Les schmas daxiomes sont :

    AXIOMES:-- n axiomes de la formeai((x1, x2, ..., xn) == xi (i = 1, 2, ..., n)-- n axiomesai(mi(x, p)) == x (i = 1, 2, ..., n)-- n x (n-1) axiomesai(mj(x, p)) == ai(p) (i = 1, ..., n; j = 1, ..., n; i

    j)-- spcifie que la modification du composant i naffecte pas-- les autres composants

    partir dune telle spcification gnrique on pourra dfinir des produits sur des types con-nus. Par exemple, on peut reprsenter les informations quon a au sujet dune personne (nom,prnom, age) par des triplets (n, p, a) obissant la spcification

    SPECIFICATION Personne = Produit(Chaine, Chaine, Nat)

    Pour rendre lusage de cette spcification plus explicite on peut renommer les oprations de lamanire suivante :

    SPECIFICATION

    Personne = Produit(Chaine, Chaine, Nat)

    avec

    a1

    renomm

    nom, a2

    renomm

    prnom, a3

    renomm

    age, m1

    renomm

    m-nom, m2

    renomm

    m-prnom, m3

    renomm

    m-age

    Remarque:

    les types produit cartsien existent dans la plupart des langages de programmation,sous diffrentes appellations :

    record

    en Pascal,

    struct

    en C,

    classes internes

    en Java, etc. Lescomposants des tuples sappellent souvent des champs.

    4.8 Spcification du type Chanes de caractres

    Le type chane de caractre se distingue dun tableau de caractres par le fait que la taille dela chane un instant donn est connue et par les oprations de concatnation et dgalit quonpeut appliquer aux chanes.

    SPECIFICATION

    CCar

    UTILISE

    Bool, Nat

    SORTES

    ccar

    OPERATIONS

    "" : -> ccar;"_" : car -> ccar;_+_ : ccar, ccar -> ccar;_=_ : ccar, ccar -> bool;_=_depuis_ : ccar, ccar, nat -> bool - - op. auxiliaire pour ax.longueur : ccar -> nat;_[_] : ccar, nat -> car;

  • Les types abstraits 43

    G. Falquet, CUI - Uni. Genve, 2001

    AXIOMESVAR

    X, Y : ccar; I : nat;

    ""+X == X;X+"" == X;longueur("") == 0;longueur("C") == 1;longueur(X+Y) == longueur(X)+longueur(Y)"C"[0] == CX+Y[I] == si I < longueur(X) alors X[I] sinon Y[I-longueur(X)]X = Y depuis I ==

    si I

    longueur(X) alors longueur(X) = longueur(Y)sinon X[I] = Y[I] et X = Y depuis I+1

    X = Y == X = Y depuis 0

    PRE

    X[I] == I < longueur(X)

    Explications:longueur: la chane vide est de longueur nulle, une chane compose dun seul caractre est

    de longueur 1, deux chanes concatnes par lopration + additionnent leur longueurs.accs aux lments: llment 0 dune chane compose dun seul caractre est ce caractre;

    pour trouver llment i dans la concatnation de deux chanes x et y, si i est plus petit que lalongueur de x il faut prendre le i

    e

    caractre de x, sinon il faut prendre le (i-longeur de x)

    e

    car-actre de y.

    Lgalit est plus difficile dfinir. On utilise une opration auxiliaire x

    =

    y

    depuis

    i quidonne vrai si les chanes x et y ont les mme caractres partir de la position i.

    4.9 Introduction limplmentation oriente-objet des types

    Cette section prsente les concepts gnraux de limplmentation oriente-objet des typesde donnes. Les techniques dimplmentation proprement dites seront abordes dans le chapitresuivant la prsentation des collections, des arbres et des graphes.

    Dans un systme objets (orient-objet), un objet est une paire (

    oid

    ,

    v

    ) o

    oid

    est lidentitde lobjet et

    v

    est sa valeur. Lidentit dun objet sert reprer celui-ci, elle est invariable au coursdu temps. Un objet peut par contre changer de valeur ( condition quil soit

    mutable

    ). De plus,plusieurs objets peuvent avoir la mme valeur.

    La valeur dun objet est reprsente par une ou plusieurs variables dinstance de divers typeslmentaires (entiers, rels, ) ou complexes. Implmenter un type abstrait consiste alors

    dfinir la structure interne des objets, cest--dire les variables dinstance qui vontreprsenter les valeurs de ce type et

    dfinir les algorithmes ncessaires pour raliser les oprations du type. Pour implmenter une type abstrait T on procdera par agrgation, cest dire quon construiraun objet de type T en utilisant un des objets de types T

    1

    , T

    2

    , , T

    k

    dj implments. Attention,il ne faut pas confondre cette technique avec lhritage multiple. De mme, limplmentation dechacun des T

    i

    se base sur dautres types dj implments, et ainsi de suite. Il y a donc construc-tion dune hirarchie dabstraction de types (qui nest pas la hirarchie des sous-classes) qui re-pose sur les types les plus simples ou types de base.

  • 44 Les types abstraits

    G. Falquet, CUI - Uni. Genve, 2001

    Suivant le langage et lenvironnement utilis, les types de base peuvent varier. Nous con-sidrerons comme types de base :

    les type lmentaire (entier, flottant, caractres, boolen) la rfrence un objet (identit dun objet, pointeur) les tableaux de valeurs lmentaires ou de rfrences.

    Un exemple: implmentation du type Cercle

    Nous avons prcdemment dfini un type abstrait cercle muni des oprations

    cercle-unit

    ,

    translater

    ,

    elargir

    ,

    rayon

    ,

    centre-x

    et

    centre-y

    .

    Une implmentation possible de ce type consiste dfinir une classe dobjets Cercle aveccomme structure interne les trois variables :

    entier x // coordonne x du centreentier y // coordonne y du centreentier r // rayon

    Lopration

    translater

    sera implmente par la procdure

    procedure translater(Cercle c, entier dx, entier dy) {c.x

    c.x + dx;c.y

    c.y + dy;}

    Lopration cercle-unit est un peu particulire car elle doit crer un nouveau cercle partirde rien. Pour cela nous supposeerons quil existe toujours une procdure

    new T

    qui produit unnouvel objet du type

    T

    dont les variables ne sont pas initialises.

    procdure cercle_unit {c

    new Cercle;c.x

    0;c.y

    0:c.r

    1;retourne c

    }

    Lopration new nous permettra galement de raliser des implmentation immuables quine changent jamais la valeur dun objet mais en cre un nouveau. Un implmentation immuablede translater pourrait tre :

    procedure translater(Cercle c, entier dx, entier dy) {res = new Cercle; // cre un nouvel objetres.x

    x + dx;res.y

    y + dy;retourne res;

    }

    Proprits de limplmentation

    On sintressera particulirement deux proprits dune implmentation dun type : la correction (obligatoire): les oprations implmentes doivent satisfaire les contraint-

    es de la spcification du type abstrait: types des paramtres et rsultats, quations, in-variants.

  • Les types abstraits 45

    G. Falquet, CUI - Uni. Genve, 2001

    la complexit (mesure): pour chaque implmentation on veut connaatre la complexiten temps de chaque opration (volution du temps de calcul en fonction de la taille desobjets traits) et la complexit en espace (mmoire occupe par la structure de don-nes).

    Une implmentation peut aussi possder dautres proprits moins formellement dfinies: simplicit : il est clair que plus une implmentation est simple dans sa structure et ses

    algorithmes, plus il sera facile de la vrifier, de la corriger et de la maintenir jour. utilisabilit : limplmentation na pas besoin de dfinir exactement les mmes opra-

    tions que le type abstrait. Dans lexemple du cercle, on pourrait dfinir une procdure

    translateEtAgrandit(x, y, r)

    qui fait la fois une translation et un agrandissement du cer-cle. Ou au contraire on pourrait implmenter lopration

    translater

    par deux proc-dures :

    translaterHorizontalement(x)

    et

    translaterVerticalement(y)

    .Un bon choix desprocdures qui constituent linterface du type peut grandement simplifier son utilisa-tion.

    extensibilit et rutilisabilit : dans quelle mesure les choix qui ont t faits du point devue de linterface et de limplmentation des procdures aident-ils ou empchent-ils larutilisation de ce travail pour dfinir dautres types ?

  • 46 Les types abstraits

    G. Falquet, CUI - Uni. Genve, 2001

  • 5 Les Types Abstraits Collection

    Les types abstraits qui reprsentent des collections de donnes jouent un rle important dansla modlisation de linformation et dans la programmation des algorithmes. Un objet dun typecollection est un conteneur dobjets qui possde un protocole particulier pour lajout, le retraitet la recherche dlments. Dans ce chapitre nous explorerons les types de collections les plusutiliss. Pour chacun nous donnerons une spcification sous forme dun type abstrait algbrique,qui dfinira la smantique des oprations.

    5.1 Piles

    Une pile est une collection dobjets qui obit au protocole FILO (First In Last Out), on nepeut accder et retirer de la pile que le dernier lment quon y a mis. On appelle cet lment lesommet de la pile.

    5.1.1 Le type abstrait: spcification algbrique

    Les lments quon met dans une pile nont aucune condition particulire remplir, il suffitquils obissent la spcification triviale

    SPECIFICATION

    Element

    SORTES

    elem

    On dfinit ensuite une notion gnrique de pile dont les lments sont de la sorte elem.:

    SPECIFICATION

    Pile(Element)

    UTILISE

    Bool, Nat

    SORTES

    pile

    OPERATIONS

    -- constructeursvide :

    fi

    pile;empiler : elem, pile

    fi

    pile;depiler : pile

    fi

    pile-- slecteurssommet : pile

    fi

    elem;est-vide : pile

    fi

    bool;

    AXIOMESVAR

    E, E1, E2 : elem; P : piledepiler(empiler(E,P)) == P // empiler puis dpiler laisse la pile dans ltat initial

    sommet(empiler(E,P)) == E // aprs avoir empil E, il se trouve au sommet de la pile

    est-vide(vide) == true // une pile vide est vide.

    est-vide(empiler(E,P)) == false// aprs avoir empil un lment la pile nest pas vide

    PRE

    depiler(P) == non est-vide(P)

    Exemple 1.

    Algorithme de vrification de lquilibrage des parenthses dans un texte. Il sagit de vrifier quun texte qui contient des caractres standard, des parenthses ou-

    vrantes "(", "[", ou "{" et des parenthses fermantes ")", "]" ou "}" est syntaxiquement correctdu point de vue des parenthses. Cela signifie qu toute parenthse ouvrante doit correspondre,plus loin dans le texte, une parenthse fermante du mme type. Le texte compris entre ces deux

  • 48 Les Types Abstraits Collection

    G. Falquet, CUI - Uni. Genve, 2001

    parenthses doit galement tre correct : une parenthse ouverte doit y tre referme. Lalgo-rithme ci-dessous utilise une pile de caractres, de la sorte

    pile

    de

    Pile(Element

    fi

    Caractre)

    pourmmoriser les ouvertures de parenthses.

    Entre:

    un tableau c de N caractres qui contient le texte

    Sortie:

    "OK" si les parenthses sont bien places, un message derreur sinon

    avec

    Pile(Caractre)pile p

    vide;

    pour

    i de 0 N-1 {

    si

    (c[i] = ) p

    empiler(p, c[i])

    sinon

    si (c[i] ) {

    si

    (est-vide(p))

    retourne

    "ERREUR: il manque une parenthse ouvrante"

    si

    (sommet(p) c[i]) p

    depiler(p)

    sinon

    retourne

    "ERREUR: parenthses de types diffrents"}

    }

    si

    (est-vide(p))

    retourne

    "OK"

    sinon

    retourne

    "ERREUR: il manque au moins une parenthse fermante"

    Pseudo-code

    Dans cet algorithme, les parties entre > nont pas t dfinies formellement. Il faud-rait les crire dans le langage algorithmique pour obtenir un vritable algorithme. Cependant onse persuade aisment que leur criture ne poserait pas de problme particulier, il nest donc pasncessaire de les dtailler ici. Dans ce cas on parle dexpression en

    pseudo-code

    . Le pseudo-codenest acceptable que si les parties informelles sont soit videntes formaliser, soit formalisesparment dans le langage algorithmique ou en pseudo-code. Par exemple, le fragment in-formel

    sommet(p) c[i]peut se formaliser en

    (sommet(p) = "(" et c[i] = ")") ou (sommet(p) = "{" et c[i] = "}") ou (sommet(p) = "[" et c[i] = "]")

    Lemploi du pseudo-code est souvent un bon moyen de concevoir les algorithmes ou les pro-grammes de manire top-down, cest--dire en commenant par les grandes lignes puis endfinissant peu peu les dtails laisss en suspens.

    Notation oriente-objet

    Dans lalgorithme de vrification de parenthses on utilise dans linstructionp

    empiler(p, c[i])qui modifie la valeur de la variable p. Si lon veut marquer le fait que p est implmente par unobjet mutable, on employera la notation pointe

    p.empiler(c[i])

  • Les Types Abstraits Collection 49

    G. Falquet, CUI - Uni. Genve, 2001

    qui montre bien quon agit sur lobjet p (ou lobjet rfrenc par p). On gardera la notation delaffectation (

    ) pour les objets non mutables ou pour montrer quon donne comme valeur lavariable un nouvel objet de la mmoire, comme cest le cas avec p

    vide. Par souci dunifor-mit on emploiera aussi cette notation pour les autres opration :

    p.sommet

    la place de

    som-met(p)

    .

    5.1.2 Polymorphisme

    Les langages objets possdent une notion de sous type, ou dextension de type. Un sous-type U dans type T possde les mmes oprations que T, plus des oprations propres

    1

    . Donc unobjet de type U peut tre utilis partout o un objet de type T est requis (selon le principe quipeut le plus peut le moins). Donc si lon a un type Forme muni des sous-types Rectangle, Carreet Cercle, il sera possible de placer dans une pile de Forme des objets de nimporte lequel de cestrois types. On obtiendra ainsi une pile polymorphe constitue dobjets de diffrents types (maistous sous-types de Forme).

    Dans beaucoup de systmes objets on a un type Objet dont tous les autres types sont dessous types. Donc si lon cre une pile dObjets on pourra mettra dedans nimporte quel objet denimporte quel type. Cest la pile la plus polymorphe quon puisse crer.

    5.2 Files

    Une file (queue en anglais) est une collection qui obit au protocole FIFO (First In First Out).Lajout dun lment se fait larrire de la file alors que le retrait se fait lavant. Les lmentsrestent dans le mme ordre tant quils sont dans la file (il est interdit de dpasser !). On appellepremier lment celui qui est devant tous les autres.

    5.2.1 Spcification algbrique

    SPECIFICATION

    File(Elem)

    UTILISE

    Bool, Nat

    SORTES

    file

    OPERATIONS

    -- constructeursvide : -> file;entrer : elem, file -> file;sortir : file -> file-- slecteurspremier : file -> elem;est-vide : file -> bool;longueur : file -> nat;

    AXIOMESVAR

    X : elem; F : file1. longueur(vide) == 0 // La longueur dune file vide est zro

    2. longueur(entrer(X,F)) == longueur(F) + 1// Entrer un nouvel llment augmente la longueur dune unit

    3. longueur(sortir(F)) == longueur(F) - 1// Sortir un lment diminue la longueur dune unit

    4. premier(entrer(X,F)) == X si longueur(F) = 0== premier(F) sinon

    1. Il existe diffrentes dfinitions, plus ou moins sophistiques, de la notion de sous-type. Nous nous con-tenterons de cette dfinition simple.

  • 50 Les Types Abstraits Collection

    G. Falquet, CUI - Uni. Genve, 2001

    // Quand la file est vide, llment quon y entre devient le premier.// Quand elle nest pas vide, le premier reste le mme.

    5. sortir(entrer(X,F)) == F si longueur(F) = 0 == entrer(X,sortir(F)) sinon

    // Si on entre un lment derrire une file vide et quon sort le premier// on retrouve une file vide. // Si la file nest pas vide, on peut inverser les deux oprations.

    PRE

    sortir(F) == non est-vide(F)

    PRE

    premier(F) == non est-vide(F)

    Utilisation de laxiome 5:

    premier(sortir(sortir(entrer(11,entrer(7,entrer(4,vide)))))) ==premier(sortir(entrer(11,sortir(entrer(7,entrer(4,vide)))))) ==premier(sortir(entrer(11,entrer(7,sortir(entrer(4,vide)))))) ==premier(sortir(entrer(11,entrer(7,vide)))) ==premier(entrer(11,sortir(entrer(7,vide)))) ==premier(entrer(11,vide)) == (par 4)11

    5.2.2 Utilisation des files

    La notion de file est utilise chaque fois quil sagit de grer lallocation dune ressource plusieurs clients. Dans le cas le plus simple on procde sur la base du premier arriv pre-mier servi. On peut crer des files plus sophistiques dans lesquelles les clients ont des prioritsdiffrentes qui leur permettent de dpasser les clients moins prioritaires. De tels problmes ap-parassent dans les systmes dexploitation dordinateurs, dans les rseaux de tlcommunic-tions, ou dans les programmes dea gestion du courrier lectronique.

    Les files servent galement de support au protocole producteur consommateur entre deuxprocessus asynchrones. Dans ce cas un processus P produit des donnes qui sont envoyes unprocessus C. Il faut passer par lintermdiaire dune file pour grer les priodes pendantlesquelles P produit plus vite que C ne peut consommer.

    Les files informatique peuvent galement servir simuler les files dattentes bien relles quise crent dans diverses situations (guichets, trafic automobile, etc.).

    5.3 Squence

    Une squence est une collection dobjets du mme type qui sont placs selon un ordre. Chaqueobjet possde donc une position. Le modle mathmatique dune liste dl-ments de type T est la fonction {1

    fi

    a

    1

    , 2

    fi

    a

    2

    , , n

    fi

    a

    n

    } de {1, , n} dans {a

    1

    , a

    2

    , , a

    n

    }.

    5.3.1 Spcification algbrique

    SPECIFICATION Sequence(Element)UTILISE Bool, NatSORTES seqOPERATIONS-- constructeursvide : -> seq;inserer : elem, nat, seq -> seq;supprimer : nat, seq -> seq;remplacer : elem, nat, seq -> seq;

  • Les Types Abstraits Collection 51

    G. Falquet, CUI - Uni. Genve, 2001

    -- slecteurselement : nat, seq -> elem;indice : elem, seq -> nat;indice-apres : elem, nat, seq -> nat;est-vide : seq -> bool;longueur : seq -> nat;

    VAR E : elem; S : seq; I : nat;

    PRE inserer(E, I, S) == I

    longueur(S)PRE remplacer(E, I, S) == I < longueur(S)PRE supprimer(I, S) == I < longueur(S)PRE element(I, S) == I < longueur(S)

    AXIOMES

    -- Si on insre un lment la position I et quon supprimer llment la position I on retrouve la squence de dpart.1. supprimer(I, inserer(E, I, S) == S;

    -- Aprs avoir insr un lment la position I, llment la position J est: le mme quavant si J< I; llment quon vient dinsrer si J=I et llment qui tait la position J-1 si J>I.2. element(J, inserer(E, I, S) == element(J, S) si J < I

    == E si J = I== element(J-1, S) sinon

    -- Aprs avoir supprim un lment la position I, llment la position J est: le mme quavant si J< I; llment qui tait la position J+1 si J

    I.3. element(J, supprimer(I, S)) == element(J, S) si J < I

    == element(J+1, S) sinon

    4. element(J, remplacer(I, E, S)) == E si J = I== element(J, S) sinon

    5. longueur(vide) == 06. longueur(inserer(E, I, S) == longueur(S)+1;7. longueur(supprimer(I, S) == longueur(S)-1;8. longueur(remplacer(E, I, S) == longueur(S);9. indice(E, vide) == 1;10. indice(E, S) == 0 si element(0, S) = E

    == indice(E, supprimer(0, S))+1 sinonN.B. si e ne se trouve pas dans l, le rsultat est l.longueur()+111. indice(E, I, S) == indice(E, I-1, supprimer(0, S)) si I > 0

    == indice(E, S) sinon;12. est-vide(S) == longueur(S) = 013. est-vide(vide) == vrai

    Exemples dapplication des quations:

    a.

    element(1, inserer(A, 0, inserer(B, 0, S)))== (par 2.) element(0, inserer(B, 0, S))== (par 2.) Bb.element(0, supprimer(0, inserer(A, 0, inserer(B, 0, S))))== (3) element(1, inserer(A, 0, inserer(B, 0, S)))== (2) element(0, inserer(B, 0, S))== (2) B

  • 52 Les Types Abstraits Collection

    G. Falquet, CUI - Uni. Genve, 2001

    Certaines expressions ne sont pas compltement valuable, cest--dire quon ne peut les rduire des expressions ne faisant intervenir que les constructeurs et les constantes. Par exemple :

    element(6, inserer(a, 0, inserer(b, 0, vide))) ==element(5, inserer(a, 0, vide)) ==element(4, vide)

    Aucun axiome ne permet de rduire cette dernire expression

    element(2, inserer(a, 6, (inserer(b, 12, vide))) ==element(2, (inserer(b, 12, vide)) ==element(2, vide)

    La dernire expression est irrductible.

    5.4 Listes binaires

    On peut dfinir une liste de manire rcursive en disant quelle est soit vide, soit compose dunette de liste et dun reste qui est lui-mme une liste.

    5.4.1 Une spcification algbrique

    SPECIFICATION Liste(Element)UTILISE Bool, NatSORTES listeOPERATIONS-- constructeursvide : -> liste;cons : elem, liste -> liste;-- slecteurstete : liste -> elem;reste : liste -> liste;est-vide : liste -> bool;element : elem, liste -> bool;position : elem, liste -> nat;AXIOMES

    VAR E, E1, E2 : elem; L : liste[1] tete(cons(E, L)) == E;[2] reste(cons(E, L)) == L;[3] est-vide(vide) == vrai;[4] est-vide(cons(E, L)) == faux;[5] element(E, vide) == faux;[6] element(E1, cons(E2, L)) == vrai si E1 = E2,

    == element(E1, L) sinon;[7] position(N, vide) == 0;[8] position(E1, cons(E2, L)) == 1 si E1 = E2

    == position(E1, L) + 1 sinon

    Exemples:Construire la liste :

    cons(6, cons(55, cons(444, vide)))

    Tte de la liste :

    tete(cons(6, cons(55, vide))) == 6 (par laxiome 1)

    Llment 22 se trouve-t-il dans la liste ?

  • Les Types Abstraits Collection 53

    G. Falquet, CUI - Uni. Genve, 2001

    element(22, cons(3, cons(1, cons(22, cons(7, vide)))))== element(22, cons(1, cons(22, cons(7, vide)))) [par 6]== element(22, cons(22, cons(7, vide))) [par 6]== true [par 6]

    Ce genre de liste est utilis dans les langages tels que LISP et PROLOG. En LISP la liste est lastructure de donnes de base, elle sert non seulement reprsenter les donnes mais galementles instructions dune programme. Les expressions qui forment un programme LISP sont deslistes dont la tte est un oprateur et le reste les arguments sur lesquels porte lopration. Par ex-emple:

    (+ 6 4) calcule 6 + 3(* 8 (- 12 x)) calcule 8 * (12 - x)(cond ((eq a 5) (+ 3 b)) ((eq a 7) x))

    == si a = 5 le rsultat est b+3 et si a = 7 le rsultat est x

    Ceci permet de traiter les programmes comme des donnes. On peut donc crire facilement desprogrammes qui construisent des expressions et les valuent (mta-programmes).Limplmentation de ce genre de liste est immdiat: il suffit de dfinir des objets de type Listemuni de deux variables dinstance, lun faisant rfrence lobjet tte et lautre faisant rfrence lobjet Liste qui constitue le reste.

    class Liste {Object tete; Liste reste;...

    }

    La programmation des mthodes est galement immdiate, il ne sagit qu