STIC A – SYSTÈMES INFORMATIQUE
LANGAGES INFORMATIQUES
[Link]@[Link]
LANGAGES INFORMATIQUES
§ Au début, la programmation consistait à établir des listes
d'instructions machine à 101001100110
§ Nécessité d'écrire des programmes sous une forme plus naturelle,
dans laquelle les éléments (fonctions, instructions, déclarations,
expressions, etc.) sont combinés selon des règles précises
§ À la fin des années 50 sont apparus les premiers langages de
programmation
– Comment définir formellement un tel langage ?
– Quel niveau d’expressivité et d’abstraction ?
– Comment traduire un algorithme exprimé dans ce langage vers un
code exécutable?
STIC A - Systèmes Informatiques 2 Département Informatique, École Navale
DÉFINITION D’UN LANGAGE INFORMATIQUE
• Alphabet et mots
– Un alphabet A = {a, b, c...} est un ensemble fini et non vide
– Les éléments de A sont appelés lettres, caractères ou symboles
– Un mot sur un alphabet A est une suite finie, éventuellement vide, de
symboles de A.
– Le mot vide est noté ε
– An désigne l'ensemble des mots de longueur n ϵ N
– A* = A0 u A1 u A2 … désigne l’ensemble de tous les mots
• Langage formel
– Un langage formel L sur un alphabet A est une partie de A
Le langage des mots de deux lettres au plus sur A = {a, b, c}
est
L = {ε, a, b, c, aa, bb, cc, ab, ba, bc, cb, ac, ca}
STIC A - Systèmes Informatiques 3 Département Informatique, École Navale
LANGAGE ENGENDRÉ PAR UNE GRAMMAIRE
• Une grammaire est un quadruplet G = (N; T; P; S)
– N est l'ensemble des symboles non terminaux
– T est l'ensemble des symboles terminaux : caractères de l'alphabet
– P est un ensemble de règles de production de la forme α → β , avec
α ϵ (N ∪ T)+; β ϵ (N ∪ T)*
– S = symbole de départ appelé l'axiome
• Pour une grammaire G, on note L(G) le langage engendré par G
• L(G) est l'ensemble des mots que l'on peut définir a partir de
l'axiome de G en appliquant un nombre fini de fois des règles de G
STIC A - Systèmes Informatiques 4 Département Informatique, École Navale
GRAMMAIRE EN FORME BACKUS-NAUR (BNF)
• Moyen simple et élégant de décrire toutes les phrases permises
d'un langage (de programmation)
Exemple (en langage naturel) :
<phrase > : := <sujet ><verbe ><objet >
<sujet > : := <déterminant ><nom >
<objet > : := <déterminant ><nom > | représente une alternative
< > entoure les objets du langage
<verbe > : := mangent | voient
<déterminant > : := les | des
<nom > : := chats | lions | souris| jambons
Exemple de phrase permise : les jambons mangent des lions
STIC A - Systèmes Informatiques 5 Département Informatique, École Navale
GRAMMAIRE EN FORME BACKUS-NAUR (BNF)
<phrase > : := <sujet > <verbe ><objet >
⇒ <déterminant ><nom><verbe><objet>
phrase
⇒ les <nom><verbe><objet>
⇒ ...
sujet verbe objet
déterminant nom déterminant nom
les jambons mangent des lions
Cet arbre syntaxique constitue une preuve que la
phrase appartient bien au langage
STIC A - Systèmes Informatiques 6 Département Informatique, École Navale
LES NIVEAUX DE LANGAGE DE PROGRAMMATION
• Chaque processeur possède son propre jeu d’instructions machine
et son langage associé (chaîne binaire). Seules ces instructions
sont exécutables par le processeur
• Le langage d’assemblage est l’équivalent du langage machine.
Chaque champ binaire de l’instruction machine est remplacé par
un mnémonique alphanumérique
• Le langage de haut niveau est indépendant de la machine
physique. Pour pouvoir être exécuté, un programme en langage
de haut niveau doit être traduit vers son équivalent machine :
c’est le rôle du compilateur
000001010000 0001 00000000000000000000
ADDIm R1 0
STIC A - Systèmes Informatiques 7 Département Informatique, École Navale
LES PARADIGMES DE PROGRAMMATION
• Il existe de nombreux paradigmes de programmation : impérative,
fonctionnelle, événementielle, logique, objet, composant,
procédurale, par contraintes, concurrente…
• La relation entre les paradigmes de programmation et les
langages de programmation peut être complexe
– Un langage de programmation peut supporter des paradigmes
multiples
– Par exemple, C++ mélange des éléments de programmation
procédurale, de programmation orientée objet et de programmation
générique
• Parmi les modèles majoritaires : 3 grandes époques
– Spaghetti
– Structuré/procédural
– Object
STIC A - Systèmes Informatiques 8 Département Informatique, École Navale
LE MODÈLE DE PROGRAMMATION SPAGHETTI
• La programmation spaghetti est un style d'écriture de code qui
favorise l'apparition du syndrome du plat de spaghettis :
– un code très linéaire, peu clair et qui fait un usage excessif de sauts
inconditionnels
– Logique de saut « goto »
• Caractéristique des langages tels que Assembleur, Fortran I, Basic
• Absence d'entités autonomes et modifiables indépendamment du
reste du programme (monolithe)
10 i = 0
20 i = i + 1
• Code et données étroitement imbriqués 30 IF i <> 11 THEN GOTO 80
40 IF i = 11 THEN GOTO 60
50 GOTO 20
60 PRINT "Programme terminé."
70 END
80 PRINT i & " au carré = " & i * i
90 GOTO 20
STIC A - Systèmes Informatiques 9 Département Informatique, École Navale
LE MODÈLE DE PROGRAMMATION STRUCTURÉ
• La programmation structurée décrit les opérations en un ensemble
de séquences d'instructions (typique du modèle procédural)
• Caractéristique des langages tels que Pascal, C, Algol, Perl, Python
• Vers plus de modularité :
– Expression séparée des données et des traitements
– Données typées et possibilité de création de types complexes
– Structures de contrôle remplaçant les sauts
– Notion de sous-programmes et compilation séparée (entités
autonomes)
• Le modèle est très largement répandu dans la mesure où la quasi-
totalité des processeurs qui équipent les ordinateurs fonctionnent
eux-mêmes selon ce modèle
STIC A - Systèmes Informatiques 10 Département Informatique, École Navale
LE MODÈLE DE PROGRAMMATION OBJET
• La programmation par objets repose sur la définition et
l'interaction d’éléments logiciels appelés objets
– Un objet représente un concept, une idée ou toute entité du monde
physique (objets « chronomètre », « voiture »)
– Il possède une structure interne et un comportement, et il sait
interagir avec ses pairs
• Caractéristique des langages tels que Simula, SmallTalk, Eiffel, C+
+, Pascal objet, Java, C#
• Approche qui regroupe les données et les traitements dans une
même entité appelée objet : les objets réels ne sont ni des
traitements purs, ni des données pures mais une combinaison des
deux
STIC A - Systèmes Informatiques 11 Département Informatique, École Navale
STIC A – SYSTÈMES INFORMATIQUE
DE L’ÉCRITURE DU PROGRAMME À L’EXÉCUTION DES INSTRUCTIONS
COMMENT PERCEVOIR LA MACHINE
• De règle générale, une machine informatique définit un langage et
réciproquement un langage définit une machine informatique
• Les ordinateurs peuvent être vus comme un ensemble de N
couches superposées correspondant à N machines (virtuelles)
– L’ordinateur est alors défini comme une « collection structurée
d ’abstractions »
– Une des couches est traitée par des circuits électroniques (la machine
réelle)
• Dans ce modèle, chaque niveau d ’abstraction repose sur le
niveau précédent
– Chaque niveau est défini par un nouveau jeu d ’instructions plus
pratique à utiliser, par l’humain, que le langage du niveau précédent
– Ces nouvelles instructions forment un nouveau langage Li, i ϵ {1..N}
STIC A - Systèmes Informatiques 13 Département Informatique, École Navale
UN EMPILEMENT DE MACHINE VIRTUELLES
• Deux techniques existent pour qu’un programme écrit en langage
évolué Ln d’une couche N devienne exécutable par une couche
inférieure N-i, i ϵ {1..n}
– La traduction ou la compilation
– L’interprétation
Définition pour chaque niveau un
« ordinateur hypothétique » que l’on
appelle une machine virtuelle
On peut écrire des programmes pour
les machines virtuelles comme si elles
existaient réellement
Pour que la traduction ou
l'interprétation reste assez simple il faut
que les langages Ln et Ln-1 ne soient
pas trop différents
STIC A - Systèmes Informatiques 14 Département Informatique, École Navale
LA TRADUCTION DE PROGRAMME
• Le programme écrit en langage évolué (couche N) est traduit dans
un autre langage généralement moins expressif (couche N ou
inférieure)
• Cette traduction appelée compilation est réalisée par un
compilateur
• Le résultat de la compilation est a son tour compilé, interprété ou
exécuté
Langage d’assemblage
Langage C
MOV R2, 5
function addition (long j) { MOV R1, adresse de J
long i=5; Compilation
J=J+i; ADD [R1], R2 LOAD R5, [R1]
} ADD R5, R2
STORE [R1], R5
Processeur CISC Processeur RISC
STIC A - Systèmes Informatiques 15 Département Informatique, École Navale
L’INTERPRÉTATION DE PROGRAMME
• Le programme écrit en langage évolué de la couche N n’est pas
traduit ou est traduit dans un langage intermédiaire
• Un interprète (ou interpréteur) est un programme exécutable
ayant pour tâche d'analyser, de traduire et d'exécuter (à la volée)
le programme source (ou intermédiaire)
Langage Bytecode
Langage Java public static void main
public class TestStack { 0: iconst_5
1: istore_1
static public void main (String argv[]) { 2: iconst_2
3: istore_2
int x=5; y=2; z=4; Compilation 4: iconst_4
5: istore_3
z = z+(x*x)+(y+y); 6: iload_3
[Link] ("Le résultat bidon est : "+z); 7: iload_1
} 8: iload_1
} 9: imul
10: iadd
Machine Virtuelle Java (JVM) …
Lire et analyser une instruction Bytecode 38: invokevirtual #9
Si l'instruction est syntaxiquement correcte, l'exécuter 41: return
Passer à l'instruction suivante }
STIC A - Systèmes Informatiques 16 Département Informatique, École Navale
LA COMPILATION VS. L’INTERPRÉTATION
Programme en langage
d ’assemblage du
processeur B
Programme en
Programme en langage langage évolué 1
d ’assemblage du
processeur A
Cross-compilateur Compilateur langage
processeur B vers évolué 1 pour
processeur A machine virtuelle C
Compilateur
Compilateur langage
assembleur pour
Couche évolué 1 pour
processeur A
logicielle processeur A Programme en
utilisateur langage pour la
Couche logicielle machine C
système Langage machine Machine
(1000110100101) virtuelle C
Processeur
A
Le cross-compilateur traduit le Un langage évolué est un langage A chaque instruction en langage
langage d’assemblage d’un puissant : une instruction en langage d’assemblage (langage symbolique le
processeur dans le langage évolué sera traduite par le compilateur à plus proche de la machine) correspond
machine d’un autre processeur l’aide de plusieurs instructions machine une instruction en langage machine
STIC A - Systèmes Informatiques 17 Département Informatique, École Navale
DU LANGAGE AUX TRANSISTORS EN 6 COUCHES
• Modèle en 6 couches constituant le fonctionnement de la plupart
des ordinateurs modernes
Couche des langages d’application
Niveau ❺
(fonctionnel, impératif, objet)
Traduction (compilateur)
Niveau ❹ Couche du langage d’assemblage
Traduction en code binaire (assembleur)
Niveau ❸ Couche du système d’exploitation
Interprétation partielle (système d’exploitation)
Niveau ❷ Couche du Processeur (architecture
numérique binaire) Interprétation (microprogramme)
ou exécution directe
Niveau ❶ Portes logiques et bascules
Transistors (architecture La couche du processeur
Niveau électronique) peut également contenir
plusieurs couches en interne
STIC A - Systèmes Informatiques 18 Département Informatique, École Navale
DU LANGAGE AUX TRANSISTORS EN 6 COUCHES
• La couche logique digitale (L0)
– Les objets manipulés sont des portes logiques (ET, OU)
– Combinaisons de portes (registres, circuits du CPU)
– Données manipulées : niveaux logiques 0, 1, tensions 0-5 V
• La couche micro-architecture (L1)
– Comporte des registres et une unité arithmétique et logique (ALU)
– Données manipulées : Signaux de contrôle provenant du
microprogramme (unité de contrôle)
• La couche ISA (Instruction Set Architecture) (L2)
– Forme la vue externe du processeur
– Données manipulées : Les instructions machines,
codes d’instructions en binaire
STIC A - Systèmes Informatiques 19 Département Informatique, École Navale
DU LANGAGE AUX TRANSISTORS EN 6 COUCHES
• La couche OS (L3)
– Données manipulées : Instructions interprétées par le OS
– Instructions interprétées directement par le microprogramme
• La couche langage d’assemblage (L4)
– Données manipulées : Forme symbolique d’un
des langages L2, L3
– Un assembleur traduit le langage assembleur (L4)
en codes d’instruction
• La couche langage de haut niveau (L5)
– Données manipulées : Instructions de haut niveau
– Langages C, C++, JAVA etc…
– Un compilateur traduit le langage de haut niveau en
langage L3 ou L4
– Interprétation dans certain cas (JAVA)
STIC A - Systèmes Informatiques 20 Département Informatique, École Navale
EXÉCUTION INTERNE AU PROCESSEUR (1/2)
• Problématique, on veut (typique des processeurs compatibles) :
– Pouvoir utiliser un langage machine sur différents processeurs de
manière transparente
– Que ces processeurs puissent être construit indépendamment par
différentes entreprises
– Que le langage machine utilisé permette d’utiliser toutes les
ressources d’un processeur
Langage machine commun 100101101….111001
Processeur, différent d’une A
S
B
machine à l’autre
Un processeur est compatible avec un autre si il reconnaît le même ensemble d’instructions
STIC A - Systèmes Informatiques 21 Département Informatique, École Navale
LES PROCESSEURS COMPATIBLES (2/2)
• La solution repose sur l’introduction d’une couche supplémentaire
– La solution a été proposée par IBM dans les années 60
– Les processeurs n’exécutent plus directement le langage machine, ils
le décodent avant de l’exécuter :
• On définit les instructions une fois pour toutes
• Chaque processeur se charge de traduire les instructions du langage
machine vers son microcode (interne et propriétaire)
Langage machine Le microcode est un programme
dont l'exécution au sein du
processeur définit le jeu
Décodage du langage machine d'instructions de celui-ci (le langage
machine)
Le langage machine (dites macro-
instructions) sont interprétées par le
microcode qui lui seul contrôle les
Microcode du processeur éléments internes au processeur
STIC A - Systèmes Informatiques 22 Département Informatique, École Navale
ARCHITECTURE & SYSTÈMES
INFORMATIQUES
LE PROCESSUS DE COMPILATION
LE PROCESSUS DE COMPILATION
• Un compilateur traduit un programme source écrit en langage de
haut niveau en un programme objet en langage de bas niveau
– Prend en entrée une donnée textuelle source (programme)
– La reconnaît (l’analyse) pour vérifier sa correction
– Emet éventuellement un message d'erreur
– Le traduit dans un langage cible
• Le travail du compilateur se divise en plusieurs phases :
– Analyse lexicale (recherche des mots-clés)
– Analyse syntaxique (vérification de la syntaxe)
– Analyse sémantique (vérification de la sémantique)
– Génération de code intermédiaire (.o)
– Optimisateur de code
programme programme
Compilateur
– Génération de code (.exe) source cible
messages d'erreur
STIC A - Systèmes Informatiques 24 Département Informatique, École Navale
ANALYSE LEXICALE
• L’analyse lexicale est le seul module au contact du code source
• L'analyseur lexical est un (gros) automate fini déterministe
• Son but est de reconnaître les unités lexicales ou lexèmes
– Les identificateurs et les mots clefs du langage
– L’affectation et les operateurs
• L'analyse lexicale produit des lexèmes à la volée en fonction de la
demande de l'analyseur syntaxique
identificateur
ab := y * x + 20
affectation operateur nombre
STIC A - Systèmes Informatiques 25 Département Informatique, École Navale
ANALYSE SYNTAXIQUE
• L’analyse syntaxique regroupe les unités lexicales en structures
grammaticales en suivant les règles figurant dans une grammaire
– Vérifier que le texte d'entrée est conforme a la grammaire
– Indiquer les erreurs de syntaxe
– Construire une représentation intermédiaire pour les autres modules
du compilateur (arbre de syntaxe abstraite BNF)
• Représentation unique du texte source : l’analyse doit être
déterministe
:=
La structure hiérarchique d'un programme est
exprimée a l'aide de règles
− Tout identificateur est une expression ab +
− Tout nombre est une expression
− Si expr1 et expr2 sont des expressions alors * 20
expr1 expr2 est une expression
y x
STIC A - Systèmes Informatiques 26 Département Informatique, École Navale
ANALYSE SÉMANTIQUE
• L’analyse syntaxique peut s’avérer insuffisante
– Par exemple : 3 + true > 2 est syntaxiquement correct
• Nécessite d'une analyse sémantique qui vérifie la présence
d'erreurs d'ordre sémantique incluant notamment
– Vérification de typage
– Vérification des déclarations
• L’analyse sémantique annote l’arbre abstrait avec des informations
qui préparent la génération de code (ex : adresses mémoire)
– Quels sont les objets manipulés et leurs propriétés ? type, durée de
vie, taille, adresse
– Contrôle la cohérence dans l'utilisation des objets : erreur de type,
absence de déclarations, déclarations multiples, déclarations inutiles,
expressions incohérentes
STIC A - Systèmes Informatiques 27 Département Informatique, École Navale
PARTIE SYNTHÈSE
• La partie synthèse génère le programme cible à partir de la
représentation intermédiaire résultante de la partie analyse
• Génération du code intermédiaire
– Utilisation de variables temporaires
– Choix de l'ordre pour faire un calcul
• Optimisation du code
– Amélioration du code intermédiaire
– Réduction du nombre de variables et d'instructions
• Génération du code
– Choix des emplacements mémoire pour les variables
– Assignation de variables aux registres
STIC A - Systèmes Informatiques 28 Département Informatique, École Navale
TABLE DES SYMBOLES
• Le compilateur manipule une table des symboles qui contient
toutes les informations sur les propriétés des objets du
programme
– Chaque identifiant (variable) a une entrée dans la table des symboles
– Enregistre les identifiants et les attributs (emplacement mémoires,
type, portée)
• L'analyseur lexical crée une entrée dans la table des symboles a
chaque fois qu'il rencontre un nouvel identificateur
• L'analyseur sémantique se sert de la table des symboles pour
vérifier la concordance des types
nom type taille adresse
A entier 4 octets (0)H
B entier 4 octets (4)H
STIC A - Systèmes Informatiques 29 Département Informatique, École Navale
AUTRES ELÉMENTS DE LA CHAINE DE PRODUCTION
• Un éditeur de liens est un logiciel qui permet de combiner
plusieurs modules objet obtenus par compilation séparée pour
construire un seul programme exécutable
• Une bibliothèque logicielle est un ensemble de fonctions compilées
regroupées dans un fichier
– Regroupées par thème (mathématiques, graphiques, fonctions
systèmes)
– Prédéfinies et réutilisables : le programmeur n’a pas à réécrire le
code; il utilise la fonction fournie (par exemple SQRT())
Eclipse Compilateur Editeur de liens
[Link] hello.o
(source) (ensemble de
programmes objet) [Link] : programme
exécutable enregistré sur
le disque
[Link] Bibliothèques
Chargeur
Exécutable en mémoire
STIC A - Systèmes Informatiques 30 Département Informatique, École Navale