Vous êtes sur la page 1sur 12

Unité 4a: Architecture logicielle

Objectifs :
À la fin de cette unité vous connaîtrez :
• Le rôle du langage machine.
• La différence entre compilation et intreprétation.
• Le rôle d’un assembleur, d’un éditeur de liens et d’un chargeur.
• Les grandes lignes du fonctionnement d’un compilateur.
• La définition d’un langage informatique.

©Pierre Marchand, 2001 1

Unité 4a: Architecture logicielle

13.1 Langage machine


L e langage machine e s t u n e séquence de bits constituant des
instructions directement exécutables par le processeur.
Le langage d’assemblage ou assembleur est un langage qui permet au
programmeur d’utiliser des codes mnémoniques (ADD, DIV, SUB,
MOV, etc.) au lieu de ces séquences de bits. Ces mnémoniques sont
traduits en langage machine par un programme appelé assembleur.
Les adresses des instructions et des variables peuvent aussi être
données sous forme symbolique. Historiquement, l’assembleur a été le
premier langage de programmation.
Il y a généralement une instruction assembleur par instruction machine.
Il y a un langage d’assemblage différent pour chaque type de machine
ou processeur : Pentium, PowerPC, Alpha, Sparc, etc. L’assembleur
n’est donc pas un langage portable.

©Pierre Marchand, 2001 2

1
Unité 4a: Architecture logicielle

13.2 Traduction et interprétation


Les langages évolués tels que Pascal, C, FORTRAN, COBOL, BASIC,
APL, PL/1, ADA, Java, etc. convertissent des instructions de haut
niveau en langage machine. Ces langages sont plus portables que
l’assembleur au niveau du code source.
Cette conversion peut s’effectuer de deux façons : la traduction ou
l’interprétation.
La traduction consiste à générer, dans le langage binaire de la machine
cible, un programme ayant les fonctionnalités définies dans le pro-
gramme source. Ce programme exécutable est ensuite chargé en
mémoire pour être exécuté.
Le programme traducteur s’appelle compilateur. L’assembleur est aussi
un compilateur. Autres membres de cette catégorie : Pascal, C / C++,
FORTRAN, COBOL, Algol, etc.

©Pierre Marchand, 2001 3

Unité 4a: Architecture logicielle

13.2 Traduction et interprétation


Dans le cas de l’interprétation, le travail de traduction s’effectue au
moment de l’exécution. L’interprète doit donc se trouver dans la
machine cible au moment de l’exécution. Exemples : BASIC, APL,
Smalltalk. Chaque instruction de code source est convertie en une ou
plusieurs instructions en langage machine. L’exécution commence tout
de suite, contrairement au cas de la traduction, mais est plus lente.

Dans le cas du langage Java, on obtient une excellente portabilité en


utilisant une approche mixte. On utilise un compilateur pour convertir le
code source en code intermédiaire, indépendant de la plate-forme,
appelé byte-codes. Ces byte-codes sont ensuite interprétés par la
machine cible au moyen d’un interprète appelé machine virtuelle qui
convertit au fur et à mesure les byte-codes en langage machine.

©Pierre Marchand, 2001 4

2
Unité 4a: Architecture logicielle

13.3 Langage d’assemblage


Nous verrons en détail l’assembleur du Pentium III un peu plus loin.

13.4 Fonctionnement de l’assembleur


L’assembleur est un programme qui traduit en langage machine le
programme source écrit en langage d’assemblage.

13.4.1 Macroassembleur et cross-assembleur


Une macro-instruction ou macro est une séquence d’instructions à
laquelle on attribue un nom. Ensuite, chaque fois qu’on utilise ce
nom dans le programme, l’assembleur le remplace par la séquence
d’instructions en question. Un assembleur qui autorise l’utilisation de
macros est appelé un macro-assembleur.

©Pierre Marchand, 2001 5

Unité 4a: Architecture logicielle

13.4 Fonctionnement de l’assembleur


13.4.1 Macroassembleur et cross-assembleur
U n cross-assembleur traduit un programme source en un pro-
gramme objet pour une machine autre que celle sur laquelle il
effectue la traduction.
Un macroassembleur permet la création et l’utilisation de macros
dans le code source. Une macro est un nom qu’on donne à un
groupe d’instructions qui revient souvent dans un programme. On
peut ensuite remplacer chaque occurrence de ce groupe par son
nom, ce qui peut rendre le code source plus lisible.

©Pierre Marchand, 2001 6

3
Unité 4a: Architecture logicielle

13.5 Développement d’un programme


Les outils d’un environnement de développement (IDE) standard
s o n t l e s s u i v a n t s : éditeur de texte, traducteur (compilateur,
assembleur), éditeur de liens, chargeur et débogueur.

13.5.1 Éditeur de texte


Le code source est saisi et édité au moyen d’un éditeur de texte.
Idéalement, on utilise un éditeur syntaxique, capable de vérifier la
syntaxe des programmes dans un langage donné e t d e g é n érer
automatiquement les structures syntaxiques propres au langage
utilisé. Les meilleurs colorent différemment les mots réservés du
langage, les chaînes de caractères, les commentaires, etc., ce qui
améliore la lisibilité du code.

©Pierre Marchand, 2001 7

Unité 4a: Architecture logicielle

13.5 Développement d’un programme


L e traducteur o u compilateur convertit le programme source en
programme objet.

L’éditeur de liens combine plusieurs programmes objets pour


réaliser un programme exécutable.

Le chargeur place ce programme exécutable en mémoire.

Lors de l’exécution, un débogueur permet de suivre le déroulement


du programme ou d ’intervenir en cas d’erreur.

©Pierre Marchand, 2001 8

4
Unité 4a: Architecture logicielle

13.5 Développement d’un programme


13.5.2 Éditeur de liens
L’éditeur de liens (linker ou link editor) est un logiciel qui permet de
combiner plusieurs programmes objets en un seul.

On structure les gros programmes en modules q u e l’on traduit


indépendamment. Ainsi, un programme peut être constitué de
plusieurs fichiers contenant chacun un ou plusieurs sous-program-
mes. Tous ces fichiers sont traduits séparément, mais peuvent
utiliser les sous-programmes et les variables se trouvant dans les
autres fichiers, ce qui donne lieu à des références externes.

L’éditeur prend ces différents morceaux de programme et les groupe


pour former un programme complet et exécutable.

©Pierre Marchand, 2001 9

Unité 4a: Architecture logicielle

13.5.3 Chargeur

Le programme objet, obtenu après l’édition de liens, doit encore être


chargé en m émoire centrale pour être exécuté. Le chargeur
s’occupe de cette tâche. Dans les systèmes d’exploitation moder-
nes, on décide au dernier moment à quelle adresse charger le
programme, puisque plusieurs programmes peuvent résider simul-
tanément en mémoire.
Dans les anciens systèmes (comme DOS), on pouvait fixer les
adresses à l’avance et charger le programme à l’endroit spécifié. On
utilisait donc un chargeur absolu.
Ajourd’hui, les chargeurs s’occupent de reloger les programmes en
mémoire centrale. Ce sont des chargeurs relogeables.

©Pierre Marchand, 2001 10

5
Unité 4a: Architecture logicielle

13.5.4 Débogueur

Le débogueur (debugger) est un logiciel qui facilite la mise au point


de programmes et la correction des erreurs ou bogues (bugs). Il
permet d’examiner le contenu de la mémoire ainsi que celui des
différents registres du processeur.

Il permet également de créer des points d’arrêt (breakpoints) lors de


l’exécution du programme à mettre au point, et à partir de ces points
d’arrêt, d’exécuter le programme pas à pas, i.e. instruction par
instruction tout en observant le contenu des registres, des variables
et de la mémoire.

©Pierre Marchand, 2001 11

Unité 4a: Architecture logicielle

14.2 Langages évolués


14.2.1 Définition d’un langage
Un langage informatique comprend :
• un alphabet constitué des symboles élémentaires disponibles,
• des noms ou identificateurs formés de groupes de symboles de
l’alphabet,
• des phrases ou instructions constituées de séquences de noms
et de symboles de ponctuation.

Les phrases doivent respecter la syntaxe du langage, i.e. la


position des symboles les uns par rapport aux autres. Pour
représenter la syntaxe d’un langage, on utilise la notation BNF
(Backus-Naur Form) ou des diagrammes syntaxiques.

©Pierre Marchand, 2001 12

6
Unité 4a: Architecture logicielle

14.2 Langages évolués


14.2.1 Définition d’un langage
Syntaxe d’un langage en forme BNF

<lettre> ::= a | b | c | d …. y | z
<chiffre> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
<identificateur> ::= <lettre> | <identificateur><lettre>
| <identificateur><chiffre>
<entier> ::= <chiffre> | <entier><chiffre>
<terme> ::= <entier> | <identificater>
<opérateur> ::= + | - | * | /
<expression> ::= <terme> | <terme><opérateur><expression>
<affectation> ::= <identificateur> = <expression>

©Pierre Marchand, 2001 13

Unité 4a: Architecture logicielle

14.2 Langages évolués


14.2.1 Définition d’un langage
Syntaxe d’un langage à l’aide de diagrammes syntaxiques
lettre
identificateur lettre
chiffre

entier chiffre

entier
terme
identificateur

©Pierre Marchand, 2001 14

7
Unité 4a: Architecture logicielle

14.2 Langages évolués


14.2.1 Définition d’un langage
Syntaxe d’un langage à l’aide de diagrammes syntaxiques
+
-
opérateur
*
/

expression terme

opérateur

affectation identificateur = expression

©Pierre Marchand, 2001 15

Unité 4a: Architecture logicielle

14.3 Compilation
14.3.1 Structure d’un compilateur
Programme en
code source
Table des Arbre
Analyse lexicale syntaxique
symboles
Analyse syntaxique

Analyse sémantique

Génération de code
intermédiaire

Optimisation du code

Génération de code objet

Programme en
code objet
©Pierre Marchand, 2001 16

8
Unité 4a: Architecture logicielle

14.3 Compilation
14.3.2 Analyse lexicale
C’est la première phase de la compilation. Elle consiste à lire la
séquence de caractères constituant le programme source et à
produire une séquence d’éléments syntaxiques du langage
(tokens) traités ensuite par l’analyseur syntaxique : nombres,
identificateurs, opérateurs, mots réservés, séparateurs, etc.
Les identificateurs, tels que les noms des variables et des
procédures, ainsi que leurs attributs, sont stockés dans la table
des symboles. Les commentaires sont éliminés.
L’analyseur lexical détecte les erreurs telles que :
• identificateurs trop longs ou illégaux
• caractères ou nombres illégaux.

©Pierre Marchand, 2001 17

Unité 4a: Architecture logicielle

14.3 Compilation
14.3.3 Analyse syntaxique
L’analyseur syntaxique reçoit une liste d’éléments syntaxiques de
l’analyseur lexical. Il vérifie si cette liste est correcte par rapport à
la syntaxe du langage. À partir ce ces éléments, il génère l’arbre
syntaxique du programme.
Il y a deux approches pour étabir cet arbre. L’approche ascen-
dante et l’approche descendante.
L’approche ascendante consiste à partir des éléments constituant
la phrase à traiter pour trouver toutes les règles qui permettent de
remonter jusqu’à la racine.
L’approche descendante consiste à p a r t i r de l a r a c i n e et à
appliquer les règles qui permettent d’arriver à la phrase désirée.

©Pierre Marchand, 2001 18

9
Unité 4a: Architecture logicielle

14.3 Compilation
val := val + 20;
14.3.3 Analyse syntaxique if good then val := 0;

<programme>
<suite d’instructions>
<instruction> ; <instruction> ;
<affectation> <conditionnelle>

<ident> ;= <expression> if <booléenne> then <instruction>

val <ident><opérateur><nombre> <ident> <affectation>

val + <nombre> <chiffre> good <ident> ;= <constante>


<chiffre> 0 val <chiffre>

2 0

©Pierre Marchand, 2001 19

Unité 4a: Architecture logicielle

14.3 Compilation
14.3.3 Analyse syntaxique
Dans cette phase on détecte des erreurs telles que :
• Parenthèses non fermées,
• Structures de blocs ou instructions mal construites,
• Manque de délimiteurs.

©Pierre Marchand, 2001 20

10
Unité 4a: Architecture logicielle

14.3 Compilation
14.3.4 Analyse sémantique
L’analyseur sémantique s ’occupe du sens et de la signification
des phrases du langage. Il utilise l’arbre syntaxique pour identifier
les opérateurs et les opérandes des instructions. Il vérifie principa-
lement la correspondance des types à l’aide des informations de
la table des symboles.
Il détecte des erreurs telles que :
• identificateurs non déclarés ou déclarés plus d’une fois,
• Incompatibilité de type entre opérateur et opérandes.

©Pierre Marchand, 2001 21

Unité 4a: Architecture logicielle

14.3 Compilation
14.3.5 Génération de code intermédiaire
Le compilateur génère ici un code intermédiaire à partir de l’arbre
syntaxique. Ce code est le code d’une machine abstraite.

14.3.6 Optimisation de code


À cette étape, on tente d’améliorer le code pour le rendre plus
rapide à l ’exécution et/ou moins encombrant en mémoire. On
élimine d ’abord les redondances pour minimiser le nombre final
d’instructions. On essaye aussi d’évaluer les expressions utilisant
des constantes. Cette phase dépend fortement de l’architecture
de la machine cible.

©Pierre Marchand, 2001 22

11
Unité 4a: Architecture logicielle

14.3 Compilation
14.3.7 Génération de code objet
La génération de code objet est la phase finale de la compilation;
elle génère du code objet relogeable, i.e. relatif à l’origine 0. Elle
traduit chaque instruction du code intermédiaire en langage
machine de l’ordinateur cible.

©Pierre Marchand, 2001 23

12

Vous aimerez peut-être aussi