Représentation de. IFT 2030, v 1.0 Université de Montréal Représentation de données 1



Documents pareils
1. Structure d un programme C. 2. Commentaire: /*..texte */ On utilise aussi le commentaire du C++ qui est valable pour C: 3.

Brefs rappels sur la pile et le tas (Stack. / Heap) et les pointeurs

Conventions d écriture et outils de mise au point

LES TYPES DE DONNÉES DU LANGAGE PASCAL

Chapitre 1 : La gestion dynamique de la mémoire

Compilation (INF 564)

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Introduction au langage C

Centre CPGE TSI - Safi 2010/2011. Algorithmique et programmation :

Cours d Algorithmique et de Langage C v 3.0

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java

Bases de programmation. Cours 5. Structurer les données

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

Introduction à la programmation orientée objet, illustrée par le langage C++ Patrick Cégielski

as Architecture des Systèmes d Information

Langage et Concepts de ProgrammationOrientée-Objet 1 / 40

Le Langage C Version 1.2 c 2002 Florence HENRY Observatoire de Paris Université de Versailles florence.henry@obspm.fr


Logiciel de Base. I. Représentation des nombres

UE C avancé cours 1: introduction et révisions

Programmer en JAVA. par Tama

Claude Delannoy. 3 e édition C++

DE L ALGORITHME AU PROGRAMME INTRO AU LANGAGE C 51

Java Licence Professionnelle CISII,

Langage propre à Oracle basé sur ADA. Offre une extension procédurale à SQL

ARDUINO DOSSIER RESSOURCE POUR LA CLASSE

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours d initiation à la programmation en C++ Johann Cuenin

Algorithmique et Programmation, IMA

Cours de C. Allocation dynamique. Sébastien Paumier

Initiation. àl algorithmique et à la programmation. en C

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

Programmation en Java IUT GEII (MC-II1) 1

Rappels d architecture

Informatique Générale

Une introduction à Java

Programmation Orientée Objet Java

Cours de Programmation Impérative: Zones de mémoires et pointeurs

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

Plan du cours. Historique du langage Nouveautés de Java 7

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Introduction à la programmation concurrente

Chapitre 10 Arithmétique réelle

Le langage C. Introduction, guide de reference

Analyse de sécurité de logiciels système par typage statique

Programmation en langage C

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Les chaînes de caractères

Programmation VBA/Excel. Programmation VBA. Pierre BONNET. Masters SMaRT & GSI - Supervision Industrielle P. Bonnet

Algorithmique, Structures de données et langage C

Cours 1 : La compilation

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

Gestion de la mémoire

Principes des langages de programmation INF 321. Eric Goubault

Programmation impérative

Langage C. Patrick Corde. 22 juin Patrick Corde ( Patrick.Corde@idris.fr ) Langage C 22 juin / 289

Cours de C++ François Laroussinie. 2 novembre Dept. d Informatique, ENS de Cachan

ALGORITHMIQUE ET PROGRAMMATION En C

COMPARAISONDESLANGAGESC, C++, JAVA ET

Arbres binaires de recherche

Cours de Programmation 2

INITIATION A LA PROGRAMMATION

Travaux pratiques. Compression en codage de Huffman Organisation d un projet de programmation

Plan du cours Cours théoriques. 29 septembre 2014

Génie Logiciel avec Ada. 4 février 2013

UE Programmation Impérative Licence 2ème Année

Rappels Entrées -Sorties

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Prénom : Matricule : Sigle et titre du cours Groupe Trimestre INF1101 Algorithmes et structures de données Tous H2004. Loc Jeudi 29/4/2004

Cours de C. Petits secrets du C & programmation avancée. Sébastien Paumier

Généralités sur le Langage Java et éléments syntaxiques.

Objets et Programmation. origine des langages orientés-objet

Les structures. Chapitre 3

Recherche dans un tableau

Corrigé des TD 1 à 5

TP 1. Prise en main du langage Python

Architecture des ordinateurs

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Cours Programmation Système

Le langage C. Séance n 4

Argument-fetching dataflow machine de G.R. Gao et J.B. Dennis (McGill, 1988) = machine dataflow sans flux de données

Gestion mémoire et Représentation intermédiaire

INF111. Initiation à la programmation impérative en C amini/cours/l1/inf111/ Massih-Reza Amini

6 - Le système de gestion de fichiers F. Boyer, UJF-Laboratoire Lig, Fabienne.Boyer@imag.fr

Chapitre VI- La validation de la composition.

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

SUPPORT DE COURS. Langage C

Débuter avec EXPRESS. Alain Plantec. 1 Schema 2

Java Licence Professionnelle CISII,

Codage d information. Codage d information : -Définition-

03/04/2007. Tâche 1 Tâche 2 Tâche 3. Système Unix. Time sharing

INTRODUCTION À LA PROGRAMMATION PRATIQUE DU LANGAGE C. M. Le Gonidec

Présentation du langage et premières fonctions

Les structures de données. Rajae El Ouazzani

Introduction à MATLAB R

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Transcription:

Représentation de données Université de Montréal Représentation de données 1

Donnée et représentation Distinguer entre objet et représentation : - Objet = donnée du point de vue de l application - Représentation = organisation des valeurs composant l objet (i.e. encodage de l objet) Exemple : date du 21 janvier A : l entier 21 [jour 21 de l année] B : les entiers 21 et 1 C : chaîne 21/01 Université de Montréal Représentation de données 2

Types de données Définition : Type = ensemble d objets possiblement infini Exemples : 1. Type booléen = {vrai, faux} 2. Type entier = {0, 1, 1, 2, 2,... } Université de Montréal Représentation de données 3

Types de données II Classifiés en 2 groupes : I. Types simples (scalaires) : normalement prédéfinis (sauf type énuméré) indivisibles : entier, caractère, booléen, pointeur, point flottant taille de mémoire fixe II. Types composés : normalement définis explicitement formés à l aide d autres types type composé homogène : tableau type composé hétérogène : produit (eg, enregistrement) ou union d autres types ensemble (Pascal) Université de Montréal Représentation de données 4

Entiers Unités de mesure = bit, octet, mot (32/64 bits = 4/8 octets) Représentation des entiers en binaire : (seul problème : entiers négatifs) R0 signe+valeur absolue : R 0 ( 1) = 1001, R 0 ( 2) = 1010 n est pas très efficace R1 complément à 1 : R 1 ( 1) = 1110, R 1 ( 2) = 1101 Cray et CDC : on a +0 et 0 R2 complément à 2 : R 2 ( 1) = 1111, R 2 ( 2) = 1110 plupart des processeurs complément à deux : a. 2 N 1... 2 N 1 1 sur N bits b. 2 N 1 k < 0 est représenté par 2 N + k c. R 2 (a + b) = R 2 (a) + R 2 (b) mod 2 N si a + b 2 N 1... 2 N 1 1 Université de Montréal Représentation de données 5

Entiers II C permet de choisir la taille des entiers et signé ou pas : signed/unsigned et short/long Note 1 : char est un type entier qui occupe une unité d espace (1 octet) Exemple : unsigned char x ; 0 x 255 Note 2 : char short int long Note 3 : #include <limits.h> pour avoir les limites de chaque type : INT_MIN/INT_MAX Université de Montréal Représentation de données 6

Entiers III ordre des octets dans un mot représentant un entier : I. big-endian (MIPS, SPARC, M68000) II. little-endian (Intel, DEC Alpha) Exemple : l entier 16 bits 258 = 1*256 + 2 0000000100000010 big-endian 0000001000000001 little-endian problèmes lors de la communication entre ordinateurs Il faut convertir dans une représentation standard pour envoyer la donnée (Perl : pack et unpack) Université de Montréal Représentation de données 7

Type sous-intervalle (sous-ensemble du type entier) Pascal : const 1.. const 2 Nombre bits pour représentation : log 2 (const 2 const 1 + 1) Exemples : 1..2 1 bit, 5..7 2 bits Souvent les compilateurs arrondissent vers l octet le plus proche pour un accès rapide Utilisé en Pascal pour définir les bornes des tableaux : var T1 : array [10..20] of integer; T2 : array [char] of integer; Université de Montréal Représentation de données 8

Type énuméré Chaque objet élément du type a un nom symbolique Exemple en Pascal : var j : (lundi,mardi,mercredi,jeudi, vendredi,samedi,dimanche); begin j := mercredi; if j = lundi then...; j := succ(j); (* j=jeudi *) j := pred(j); (* j=mercredi *) end Représenté comme type sous-intervalle Le type booléen de Pascal est un type énuméré. Université de Montréal Représentation de données 9

Type énuméré II Exemple en C : enum Jours {lundi=1,mardi,mercredi,jeudi,vendredi, samedi,dimanche=99} j; traités comme entiers : j=99 est OK. Université de Montréal Représentation de données 10

point flottant ou fixe Type réel point flottant : 1.45 10 11 = 14.5 10 12 = 0.0145 10 9 binaire : 1.01 2 4 = 101 2 2 = signe+exposant+mantisse nombre normalisé : 1 mantisse < 2 représentation (IEEE 754 précision simple) : nombre x = ( 1) s 2 e b (1 + f) est stocké par s signe en 1 bit e exposant biaisé en 8 bits, 0 < e < 255 b = 127 biais 0 < f < 1 fraction en 23 bits Université de Montréal Représentation de données 11

Type réel II IEEE-754 : précision double : exposant de 11 bits, fraction de 52 bits, biais b = 1023 précision double extendue : 64 bits (128 : quadruple) valeurs spéciales : valeur exposant e fraction f ± 11 1 binaire 0 ±0 0 0 NaN 11 1 binaire non-zéro NaN : n est pas un nombre (Not A Number) arithmétique étendue : (+ ) + (+ ) = +, (+ ) + ( ) = NaN 1/(+ ) = +0, 1/( ) = 0 log( 0) = NaN, log(+0) = exceptions (pas celles de Java!) Université de Montréal Représentation de données 12

Tableaux Pascal : var T : array [ type index ] of typeélem type index doit être sous-intervalle ou énuméré var B : array [boolean] of real; var Col : array [(rouge,vert,bleu)] of boolean; var I : array [10..12] of integer; var T2 : array [0..4] of array [0..9] of real; B[false] := 1.5; Col[vert] := true; I[11] := 123; T2[2][3] := 3.2; T2[3,4] := 4e-11 En Pascal, les indices font partie du type tableau!! très mauvaise idée. Université de Montréal Représentation de données 13

Tableaux II C : typeélem T[ constante ] ; int T[2]; T[0] = 123; float T[5][10]; T[2][3] = 1.5; int D[] = {2,3,4}; /* tableau à 3 élems */ - borne inférieure fixée à 0 - dépassement de bornes est permis : int X[2]; X[2]=4; n est pas toujours une erreur Algol 68 : tableaux dynamiques int n;... { [-n:n] real petit tableau; } tranches : a[3 :8] := b[1 :6] ; bornes accéssibles : lwb et upb, dépassement interdit Université de Montréal Représentation de données 14

Tableaux III Exemple : tableau en Pascal var T array[bas..haut] of integer; stockage typique : élément T [i] est à l adresse a i = D + (i bas)e où - D est l adresse de base de T - E est la taille d un élément (en octets) donc a i = K + ie avec K = D E bas - K peut être calculé en avance si tableau statique - multiplication rapide (décalage) si E est multiple de 2 Université de Montréal Représentation de données 15

Tableaux IV tableaux multi-dimensionels row-major : (tableau 2D=tableau de rangées) a ij = D + (i b 1 )(h 2 b 2 + 1)E + (j b 2 )E = K + ir + je column-major : (tableau 2D=tableau de colonnes) a ij = D + (j b 2 )(h 1 b 1 + 1)E + (i b 1 )E C, Java : row-major FORTRAN : column-major tableaux dynamiques : il faut stocker les bornes accès aux éléments prend plus de temps Université de Montréal Représentation de données 16

Enregistrements (=produit cartésien de types) groupe ordonné d objets accessibles par leur nom - Nom connu à la compilation (sélecteur de champ) - Offset connu à la compilation (contrairement aux tableaux) - En général hétérogène Représentation : disposition contiguë des champs en mémoire Université de Montréal Représentation de données 17

Pascal : Enregistrements II record a : char; (* adr rel. = 0 *) b : array [1..2] of integer; (* adr rel. = 1 *) c : real; (* adr rel. = 9 *) end C : contrôle fin (au niveau des bits) sur la disposition des champs struct ByteS { unsigned int a : 3; /* 0..7 */ unsigned int b : 1; /* 0..1 */ unsigned int c : 4; /* 0..15 */ } x; Les contraintes de la machine peuvent affecter la position : e.g. entier (réel) à des adresses qui sont des multiples de 4 (8) langages OO : objets («évolution de l enregistrement») Université de Montréal Représentation de données 18

Unions type union = (union de types) En C la syntaxe est similaire aux structures union UnionABC { char a; /* adr relative = 0 */ int b; /* adr relative = 0 */ double c; /* adr relative = 0 */ } abc; Taille = taille du plus grand champs Seulement un des champs est actif à un instant donné et c est impossible de savoir lequel uniquement en examinant l objet Université de Montréal Représentation de données 19

Unions II Algol : union (int, real) z; z := 9.998;... case (z) in (int i): i := i+2, (real r): r := r-0.02 esac (représentation de z n est pas accéssible) Université de Montréal Représentation de données 20

usage de union en C stocker l état Unions III struct { enum {CHAR, INT} sorte; union { char a; int b; } val; } T[10];... for (i=0; i<10; i++) switch (T[i].sorte) { case CHAR: printf("%c ", T[i].val.a); break; case INT: printf("%d", T[i].val.b); break; } Université de Montréal Représentation de données 21

Unions IV usage de union en C (cont.) accéder la même valeur de manières altérnatives union { unsigned char bytes[4]; unsigned int i; } mon_entier; mon_entier.i=1; if (mon_entier.bytes[0]==1) puts("little endian"); else puts("big endian"); Université de Montréal Représentation de données 22

[type très rare] l exception : Pascal Ensembles var s1, s2, s3 : set of 1..5; s1 := [1,4,5]; (* 0000000000011001 = 25 *) s2 := [2,4]; (* 0000000000001010 = 10 *) s3 := s1 + s2; (* 0000000000011011 = 27 *) s3 := s1 * s2; (* 0000000000001000 = 8 *) s3 := s1 - s2; (* 0000000000010001 = 17 *) if 2 in s1 then...; représentation : un mot machine avec 1 bit par élément possible (1=présent, 0=absent) Université de Montréal Représentation de données 23

Pointeurs pointeur = objet qui permet un accès indirect à un autre objet pourquoi? exemple : liste chaînée chaque élément est un enregistrement typedef struct Liste_s { int valeur; struct Liste_s prochain; } elem; erreur! (taille de elem=?) solution : typedef struct Liste_s { int valeur; struct Liste_s* prochain; } elem; Université de Montréal Représentation de données 24

Pointeurs II La taille du pointeur est indépendante de la taille de l objet pointé (typiquement 1 mot machine) En général, un pointeur est représenté par l adresse en mémoire de l objet pointé Cas spécial : pointeur nul nil en Pascal, NULL en C =adresse invalide Type de pointeur inclut le type de l objet pointé (en général) Université de Montréal Représentation de données 25

Pointeurs III I. Applications Structures de données dont la taille varie à l exécution (chaînes, listes, arbres, graphes) Manipulation rapide d objets (la copie d un pointeur est plus rapide que la copie de l objet pointé) Exemple : trier des enregistrements II. Opérations principales sur les pointeurs Allocation d un objet dans le tas (trouve espace inutilisé + marque comme utilisé) Récupération de l espace alloué à un objet (marque inutilisé) Indirection (accès à l objet pointé) Université de Montréal Représentation de données 26

Pointeurs IV Pascal C SIMULA DECLARATION DE TYPE ET VARIABLE type R = struct R class R; record { begin x, y : integer; int x, y; integer x, y; end; }; end; var p, q : ^char; char *p, *q; a, b : ^R; struct R *a, *b; ref(r) a, b; INDIRECTION p^ := X ; *p = X ; a^.x := 20; (*a).x = 20; a->x = 20; a.x := 20; AFFECTATION DE POINTEUR q := p; q = p; b := a; b = a; b :- a; b := nil; b = NULL; b :- none; AFFECTATION DE L OBJET POINTE b^ := a^; *b = *a; b := a; EGALITE if a=b then... if (a==b) then... if a==b then... ALLOCATION new(a); a = (struct R*) malloc( a :- new R; sizeof(struct R)); RECUPERATION dispose(a); free(a); **AUTOMATIQUE** Université de Montréal Représentation de données 27

Pointeurs V Il y a des dangers importants lorsque la récupération de la mémoire est sous la responsabilité du programmeur(récupération manuelle) I. récupérer l espace trop tôt : pointeurs fous (pointeur vers un espace réservé pour un autre usage) pointeur à une variable déjà relâchée, pointeur à une variable locale ou un paramètre (alloués sur la pile), pointeur à une adresse invalide, accès à l extérieur des bornes d un tableau. une solution : «tombes» Université de Montréal Représentation de données 28

Pointeurs VI II. récupérer l espace trop tard (ou même jamais) : fuites de mémoire new(p); (* allocation de l objet 1 *) p^ := 10; new(q); (* allocation de l objet 2 *) p := q; (* fuite de memoire: l objet 1 n est plus accessible et ne peut plus etre recupere *) objet mort = objet qui n est plus accessible par le programme Une fois qu un objet est mort il le restera pour toujours fuite de mémoire = création d objets morts Bogue insidieuse car le programme peut marcher longtemps sans problèmes mais tranquillement la performance se dégrade et cause éventuellement un arrêt total (e.g. Microsoft Word) Université de Montréal Représentation de données 29

Pointeurs VII Lisp, SIMULA et Java possèdent des «ramassesmièttes» ( garbage collectors) qui récupèrent automatiquement l espace associé aux objets morts. Deux techniques répandues : 1. Associer un compteur de référence à chaque objet = nombre de pointeurs vers l objet. Récupérer espace lorsque compteur = 0. Ne fonctionne pas dans le cas des structures cycliques. 2. À partir des variables globales et la pile, traverser tous les objets atteignables en passant par des pointeurs et marquer ces objets. À la fin, les objets non-marqués sont récupérés. Université de Montréal Représentation de données 30

Pointeurs VIII C possède plusieurs routines de gestion mémoire (disponibles dans stdlib.h) void *malloc (int taille_bloc); void *calloc (int nb_elem, int taille_elem); void *realloc (void *ptr, int nouvelle_taille); void free (void *ptr); malloc alloue un bloc, calloc alloue un tableau et realloc change la taille d un objet alloué (ce qui demande parfois d allouer un nouveau bloc et de copier l objet) Le pointeur retourné est de type void* (pointeur universel) et il faut le convertir vers le bon type de pointeur avec un «cast» NULL est retourné si la mémoire est épuisée C++ possède 2 opérateurs de gestion mémoire de plus haut niveau que C int *p; char *s; p = new int; // p = (int*)malloc(sizeof(int)); s = new char[5]; // s = (char*)calloc(5,sizeof(char)); delete p; // free(p); delete [] s; // free(s); Université de Montréal Représentation de données 31

Pointeurs IX Le langage C permet une forme d arithmétique sur les pointeurs (opérateurs + et -) & var : pointeur vers var p+n (où n est de type entier et p est de type T *) : pointeur vers n-ième objet de type T après objet pointé par p p2-p1 (où p1 et p2 sont de type T *) : nombre d objets de type T de *p1 à *p2 t (où t est un tableau) : pointeur vers premier élément du tableau C définit : x[y] = *(x+y) = *(y+x) Donc (!) : 1[t] = t[1] et 1[t1][t2] = t2[t1[1]] Les opérateurs ++ et -- sont utilisables sur les pointeurs pour avancer ou reculer un élément Université de Montréal Représentation de données 32

Pointeurs X Le traitement de chaînes de caractères en C est basé sur les pointeurs char t[4]; char *p, *q; p = "ABC"; putchar (p[2]); /* imprime C */ putchar ("XYZ"[2]); /* imprime Z */ q = t; /* copier dans t */ while (*p!= \0 ) *q++ = *p++; *q = \0 ; if (t == "ABC")...; /* toujours faux! */ /* utiliser strcmp(t,"abc") de <string.h> */ *p= Z ; /* erreur: pointeur vers une constante */ Université de Montréal Représentation de données 33

Typage et sûreté La notion de type est utile pour définir la notion d erreur Exemples 1. int *p;... abs(p)... est incorrect car (en C) l argument de abs doit être de type entier 2. int t[10];... t[1.5]... est incorrect car l index doit être de type entier 3. enregistrement variant en Pascal (comme union en C) Déf : Une erreur de type survient lorsqu une fonction (ou opérateur) est appelée avec un argument qui n est pas du type attendu Université de Montréal Représentation de données 34

Typage et sûreté II Les vérifications de type permettent de garantir qu aucune opération incorrecte ne sera exécutée I. Vérifications de type à la compilation (typage statique) exécution plus rapide programme plus sûr : moindre erreurs de type II. Vérifications de type à l exécution (typage dynamique) requis dans certains cas (Lisp, unions de C) programme moins sûr Université de Montréal Représentation de données 35

Équivalence de types Est-ce que les variables ont le même type? struct Sif {int i; float f;} reg1; struct Sif2 {int i; float f;} reg2; struct Sfi {float f; int i;} reg3; équivalence par nom ou par structure C : par nom pour struct et union, par structure pour autres Ada : par nom (les types suivants ne sont pas compatibles) type celsius is new FLOAT; type fahrenheit is new FLOAT; Algol 68 : par structure (les types suivants sont compatibles) mode a = struct (int val, ref a next); mode b = struct (int val, ref struct (int val, ref b next) next); Université de Montréal Représentation de données 36

Conversion de types I. explicite Ada : FLOAT(I) (fonction) C, C++, Java : (float) i (opérateur) II. implicite (coercition) élargissement (widening) : short int int float double rétrécissement (narrowing) int i=2.99; (etc.) Université de Montréal Représentation de données 37

Conversion de types II conversion automatique : utile mais aussi une cause d erreurs I. perte de précision int float int z=1234567890; float f=z; /* z=1234567936.0 */ II. conversion signed unsigned unsigned int u=0; if (u<-1) puts("bizarre."); III. ou une conversion souhaitée... float C, F;... C=(F-32)*(5/9); hélas, pas de conversion automatique pour 5/9 Pascal : division entière div et flottante / Université de Montréal Représentation de données 38