csi 3525, noms etc., page 1 noms, attachement, porté, vérification de type noms, variables...

38
CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables • Attachement • Porté • Constantes Initialisation des variables Vérification de type Compatibilité de type Plan:

Upload: amandine-georges

Post on 04-Apr-2015

112 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 1

Noms, attachement, porté, vérification de type

• Noms, variables

• Attachement

• Porté

• Constantes

• Initialisation des variables

• Vérification de type

• Compatibilité de type

Plan:

Page 2: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 2

Points à discuter:

• Qu’est-ce qui nécessite un nom?

• Une variable, en tant que six-tuplet

Page 3: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 3

م Un nom est un descripteur pour une entitée dans un programme. On réfère aux entitées par leur nom, quand on veut les créer, les utiliser, les modifier et les détruire.

م Déclaration, usage, durée de vie et porté des noms: ces propriétés sont importantes pour les langages de programmation.

Page 4: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 4

Pourquoi a-t’on besoin de noms?

• constantes, variables,

• opérateurs,

• étiquettes « label »,

• types,

• procédures, fonctions,

• modules, programmes,

• fichiers, disques,

• commandes, items d’un menu,

• ordinateurs, réseaux, utilisateurs (login).

Page 5: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 5

Noms et Identificateurs

• Un nom est dénoté par un identificateur.

• En générale, les identificateurs sont formes de lettres, chiffres et traits de soulignement « underscore ». Prolog, Perl et Scheme permettent plus.

• Une discussion de la forme des identificateurs: manuel, Section 5.2.

Page 6: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 6

• Les mots clefs (e.g. for, if, int, new…) servent de balises syntaxique dans un programme. Considérez:

if ( C ) S1 else S2

• En fait, ce n’est qu’un triplet: C - S1 - S2, qui aurait aussi bien pu être défini comme:

If C then S1 else S2 end if; ou {C -> S1 ; S2}

en autant que le compilateur et les programmeurs comprennent tous deux son sens profond.

• De même,

while ( C ) S ou while C do S

est essentiellement un paire: C - S.

Page 7: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 7

• D’un autre coté, les mots clefs déterminent le style d’un langage.

• Ils permettent de rendre un programme lisible.  

• Il serait très facile de substituer les mots clefs d’un langage: ça serait une modification triviale de l’analyseur lexical, par exemple, de lui faire reconnaître:

si C alors S1 sinon S2 fin si;

Au lieu de

if C then S1 else S2 end if;

Page 8: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 8

Variables

• Une variable, dans un langage impératif, est un six-tuplet:

‹nom, adresse, valeur, type, durée de vie, porté›

• Par exemple:

int x;

on décide le nom et le type de x.

• L’endroit ou la déclaration se trouve dans un programme détermine où et combien longtemps x est disponible (porté, durée de vie). Son adresse est déterminée lors de l’exécution. Finalement, l’utilisation de x dans une instruction décidera de sa valeur.

Page 9: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 9

• Un problème pour plusieurs langages de programmation:un même nom peut être utilisé dans différents contextes, et dénoter différentes entités:

void a(){int b; ...

} void b(){;int a;...

}

• Différent types, adresses et valeurs peuvent être associés aux différentes occurrences du nom. Chaque occurrence a une différente durée de vie (quand et pour combien longtemps est-elle créée, et une différente porté (où peut-elle être utilisée).

Page 10: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 10

Valeur d’une variable

• Le concept de valeur est plus générale:l-value (l pour « left ») et r-value (r pour « right ») représentent la source et la destination d’une assignation. exemple:

x = y;

• La l-value est l’adresse de x, et la r-value est la valeur de y. Ceci devient compliqué pour les éléments de tableaux dénoté par des indexes devant être évaluée:

T[i*2+1] = y;

• Cet index adresse dépend de la valeur courante de i.

Page 11: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 11

Attachement « binding »

• Points:

• Une présentation informelle

• Attachement en différent temps

• Attachement d’une variable

• Porté

Page 12: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 12

Attachement

• L’attachement n’est pas formellement défini. Intuitivement, on associe (ou attache) un attribut à un objet. Les attributs peuvent être des noms, types, valeurs.

• L’attachement peut se faire à différent moments. On considère normalement trois périodes:

• À la compilation (en fait, à la traduction, parce que l’attachement se fait dans les compilateurs et les interpréteurs);

• Au chargement (Lorsque le code objet est préparé pour l’exécution, quand le code nécessaire aux instructions prédéfinies du langage ou aux librairies utilisées est obtenu);

• À l’exécution (Lors de l’exécution du programme).

Page 13: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 13

Attachement Statique et Dynamique

• On distingue aussi deux types d’attachement selon sa durée:

• Attachement statique est permanent, pour la durée du programme;

• Attachement dynamique effectif durant certaines parties de l’exécution seulement.

Page 14: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 14

Assigner des propriétés aux variables • variable nom

• À la compilation

– Décrit dans les déclarations

• variable adresse

• Au chargement et à l’exécution (e.g. C),

• à l’exécution (e.g. Smalltalk)

– Habituellement fait implicitement

• variable type

• À la compilation (e.g. Java),

• à l’exécution (e.g. Scheme)

– décrit dans la déclaration

Page 15: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 15

• variable valeur

• à l’exécution,

• Au chargement (initialisation)

– Spécifié dans les instructions, surtout les assignations

• variable durée

• à la compilation

– Décrit dans la déclaration

• variable porté

• à la compilation– Exprimé par l’emplacement des déclarations

Page 16: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 16

Durée de vie

• L’attribution de la mémoire pour un objet se fait au chargement. Deux classes de variables peuvent être distinguées:

• Variables statique

• Variables dynamiques

Page 17: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 17

Variables statiques

• L’attribution se fait une seul fois, avant le début du programme.

• Fortran IV est un langage important ou c’est la seul façon d’attribuer la mémoire aux objets.

• Ceci est désuet, trop rigide, mais conceptuellement simple et peux coûteux. Ceci rend la récursivité impossible.

Page 18: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 18

Variables dynamiques

• L’attribution se fait après le début du programme, lors de son exécution.

• Deux possibilités d’attribution dynamique:

• Attribution et libération Explicite, c’est à dire que le programmeur doit le faire. C’est ce qui est fait quand on utilise des pointeurs. Par exemple, en Pascal on attribue avec new(p), et libère avec dispose(p). En C on utilise malloc().

• Attribution implicite (quand on entré dans un bloc) et libération implicite (quand on en sort).

Page 19: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 19

Porté

• Blocs et structures de bloc

• Blocs anonymes

• Diagrammes d’imbrication

• Graphes d’appels

• Porté dynamique

Page 20: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 20

Blocs

• On regroupe des déclarations et des instructions pour:

- regrouper les étapes d’une même activité (e.g.,les étapes d’un algorithme de trie),

- assurer une interprétation correcte des noms.

• Les Noms sont attaches à divers éléments d’un programme. On fait référence à ces noms dans des instructions.

• La porté d’un nom N signifie l’ensemble des endroits dans un programme où N dénote le même objet.

Page 21: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 21

ال Les blocs peuvent être imbriqués. Les noms introduit dans un bloc sont appelé attachements locaux.

ال Un nom utilisé sans avoir été déclaré dans un même bloc, doit avoir été déclaré dans un bloc englobant ce bloc .

Page 22: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 22

• Les blocs peuvent être imbriqués. Les noms introduit dans un bloc sont appelé attachements locaux. Un nom qui est utilisée, sans avoir été déclaré dans un même bloc, doit avoir été déclaré dans un bloc englobant ce bloc .

• L’imbrication des blocs est possible en Pascal, Ada et (sous certaines formes) en C. Elle n’est pas permise en Fortran.

• Un programme, une procédure ou une fonction consiste en une entête et un bloc nommé. Par rapport aux blocs anonymes disponible en Algol 60, Algol 68, PL/I, Ada et C – mais pas en Pascal.

Page 23: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 23

Blocs anonymes

• Un bloc anonyme est comme une procédure définie (sans nom) et appelé immédiatement et une seule fois.

• De tels blocs sont utiles quand un calcul est nécessaire une seule fois, et des variables auxiliaires sont nécessaires pour ce calcul. On ne veut pas déclarer ces variables à l’extérieur du bloc (une procédure aurait pu être utilisé pour parvenir au même résultat)

Page 24: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 24

Diagrammes d’imbrication

En C:

main P(){ int X; void A(){ char Y; void B(){ float Z; SB } SA } void C(){ int Z; SC }SP }

P XAC

SA

A YB

B

SB

Z

C

SC

Z

SP

Page 25: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 25

Graphes d’appels

• Montre quel unités du programme peuvent appeler quel autres unités. Les flèches pointant vers l’unité d’où elles proviennent montrent la possibilité de récursivité.

P

B

A C

Page 26: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 26

Visibilité, l’environnement de référence

PA

BSB P.X, P.A.Y, P.A.B.Z

SA P.X, P.A.Y 

CSC P.X, P.C.Z

SP P.X

P.X signifie "variable X déclarée dans P".

Page 27: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 27

• Trous dans la porté (variables cachées): le même nom est utiliser dans un bloc et dans un bloc imbriqué à l’intérieur de celui-ci.

• Les variables visible dans SP : P.X, P.Y

• Les variables visible dans SA : P.A.X, P.Y, P.A.Z

• Les variables visible dans SB : P.X, P.B.Y, P.B.Z

• Donc, P.X est visible partout dans P sauf dans SA, où P.A.X la cache en devenant elle même visible.

• Et, P.Y est visible partout dans P sauf dans SB, où P.B.Y la cache en devenant elle même visible.

• Il n’y a pas de trous dans la porté de P.A.Z ou P.B.Z car elles ont des régions de visibilité disjointes.

PXYAB

A XZ

SASP

B YZ

SB

Page 28: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 28

Genres de porté

• Jusqu’ici on a parlé de porté statique (ou porté lexicale). Celle-ci permet de déterminer l’usage des variables de façon statique, avant l’exécution.

• La Porté Dynamique est une alternative aux avantages qui ne sont pas claire. L’idée est de chercher le nom dans une chaîne des procédures qui sont appelé, en commencent par le programme principale. Cette chaîne est construite selon les règles de visibilités, mais en ignorant l’imbrication des procédures.

Page 29: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 29

Exemple de porté

main P(){ int X; void A(){ X = X + 1; print(X); } void B(){ int X; X = 17; A(); } X = 23; B();}

• Le programme appel B, puis B appel A. Quand A utilise X, Lequel des X est-ce?

• Avec la porté statique, c’est le X de P, le bloc dans lequel A est imbriquée. Le résultat est 24.

• Avec la porté dynamique (où la recherche est faite dans la chaîne d’appels), c’est le X de B, le bloc le plus récemment appelé contenant une déclaration de X. Le résultat est 18.

Page 30: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 30

Porté dynamique

• La règle de porté dynamique a été utilisée dans APL, SNOBOL-4 et le Lisp classique. Elle est peu utilisée aujourd’hui. Même Common Lisp, une version plus récente de Lisp a adopter la porté statique.

• La règle de porté dynamique est plus facile à implémenter, mais:

• Il est impossible de savoir, à la compilation, à quel objet réfèrent les variables, donc la vérification des types est impossible.

• Les variables internes ne sont plus protégées. Dans l’exemple, X est locale dans B, mais peut être accédé à partir de A.

Page 31: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 31

Constantes et Initialisation de variables

• Les points importants peuvent être trouvé dans le manuel aux sections 5.11-5.12.

Page 32: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 32

Vérification des Type

• Points

• Opérations et opérandes

• Typage fort

• Conversion et conversion implicite

Page 33: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 33

Types d’opérations

• Sauf certaines exceptions, les opérations d’un langage de programmation nécessitent des opérandes (paramètres) bien défini, et d’un type spécifique.

• Exemples d’opérations

• Booléennes (comparaison, et, ou, etc),

• Arithmétiques (+, -, *, /, sin, tan, exp etc.),

• De chaînes de caractères (concaténation, sous-chaînes etc.),

• Assignations (une opération avec deux opérandes),

• La transmission d’un paramètre à une procédure.

Page 34: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 34

Vérification de type

• La vérification de type assure que lorsqu’un opérateur est utilisé, il reçoit des paramètres d’un type qu’il peut traiter. La vérification de type peut être faite à la compilation ou à l’exécution.

• Une erreur de type se produit lorsqu’un paramètre de type inapproprié est passé à une opération. Ceci peut également être signalé à la compilation ou à l’exécution.

Page 35: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 35

Typage fortUn langage de programmation utilise le typage fort quand toutes les

erreurs de type peuvent être découverte à la compilation. Ceci n’est pas facile, même dans un langage très stricte tel que Pascal.

Le problème: les sous-types des types énumérés.

type

day = (mo,tu,we,th,fr,sa,su);

workday = (mo,tu,we,th,fr);

var x : day; y : workday;

{...}

y := x; {???}

Il y a aussi les enregistrements qui ont des variantes. (dont des exemples seront présentés plus tard).

Page 36: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 36

Typage fort (2)

• Une définition moins stricte du typage fort: toutes les erreurs de types peuvent être détectés, et préférablement à la compilation.

• Il est intéressant de noter qu’aucun langage populaire inclus le typage fort parfait. Il y a toujours des petites exceptions. Java a peu de telles d’exceptions.

Page 37: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 37

Mais…

• Le typage stricte des opérandes est élégant et désirable, quoi que possiblement peu pratique. Que faire quand deux opérandes possible ont un sens compatible?

• Example:

var

x : real; n: integer;

{...} n := 2; {...}

x := n * 3.14;

• Cette multiplication sera rejetée par un compilateur stricte. Il faudrait utiliser une conversion « type casting ».

x := float(n) * 3.14;

Page 38: CSI 3525, Noms etc., page 1 Noms, attachement, porté, vérification de type Noms, variables Attachement Porté Constantes Initialisation des variables Vérification

CSI 3525, Noms etc., page 38

Forçage de type

• On peut aussi utiliser une conversion implicite: le changement automatique de la forme d’une opérande avec un type légèrement inapproprié.

• Pour l’exemple précédant, la valeur de n peut être représentée comme un float, et cette nouvelle valeur peut être utilisé pour la multiplication.  

• C et Perl sont des exemples de langages ou la conversion implicite est utilisé de façon exagérée.