Post on 07-Mar-2021
INTRODUCTION IFT580 – Compilation et interprétation des langages
1
Qu’est-ce qu’un compilateur ? • C’est un programme qui reçoit en entrée un texte écrit
dans un langage source (S) et produit en sortie un texte
écrit dans un langage cible (C)
• Le compilateur traduit le texte source vers le texte cible
• Le compilateur est écrit dans un langage quelconque (L)
2
Qu’est-ce qu’un compilateur ?
• Si le texte cible est un programme exécutable, il peut être
démarré
• Les données reçues en entrées (E) sont transformées par
le texte cible pour produire les résultats (R)
3
Qu’est-ce qu’un compilateur ?
4
S C L
Programme
source Compilateur Programme
cible
E
Données
R
Résultats
Qu’est-ce qu’un compilateur ?
• Il y a donc trois langages impliqués dans la conception
d’un compilateur
• Le langage source, qui peut être simple ou complexe
• Le langage cible, qui peut être simple ou complexe
• Le langage utilisé pour écrire le compilateur
5
Qu’est-ce qu’un compilateur ?
• Il n’est pas obligatoire pour le compilateur d’écrire le code
cible dans le langage de la machine
• LaTex PDF
• Lorsqu’on développe un nouveau langage, pourquoi
serait-il intéressant de le compiler vers le langage C++?
6
Qu’est-ce qu’un compilateur ? • Quel langage devrait être utilisé pour écrire le
compilateur?
• Comment était écrit le premier compilateur puisqu’il n’y
avait pas de compilateur pour compiler ce compilateur?
• Problème de l’œuf et de la poule!
7
Qu’est-ce qu’un compilateur ? • Habituellement, la première version du compilateur est écrite
avec un langage existant pour une sous-partie du langage source
• On peut ensuite réécrire le compilateur avec la partie supportée du langage, et utiliser le premier compilateur pour compiler le second
• On recommence une itération pour ajouter des fonctionnalités au langage
8
Qu’est-ce qu’un compilateur ?
• Il est possible que la création d’un programme exécutable
requière plusieurs autres programmes qu’un compilateur
pour transformer le code source en programme
9
Qu’est-ce qu’un compilateur ?
10
Compilateur
Préprocesseur
Relieur
Assembleur
Code source
Code source modifié
Code en langage d’assemblage
Code translatable
Programme exécutable
Fichiers de bibliothèque, etc.
Qu’est-ce qu’un interpréteur ? • C’est un programme qui reçoit en entrée un texte écrit
dans un langage source (S), ainsi que les entrées
requises par le programme (E) et produit en sortie les
résultats du texte d’entrée (R)
• L’interpréteur lit chacune des instructions indiquées dans
le texte d’entrée et exécute les instructions appropriées
sur la machine cible
11
Qu’est-ce qu’un interpréteur ?
12
S
E
R
Programme
source
Données
Interpréteur Résultats
Qu’est-ce qu’un compilateur hybride ?
• C’est une approche qui combine le compilateur et
l’interpréteur
• Le texte source est transformé en code intermédiaire (I)
qui peut être lu et exécuté par l’interpréteur à l’aide des
données en entrée
• L’interpréteur produit les résultats finaux
13
Qu’est-ce qu’un compilateur hybride ?
14
S I L
Programme
source Compilateur Code
intermédiaire
E
Données
R
Résultats Interpréteur
Qu’est-ce qu’un compilateur hybride ?
• Les avantages d’un compilateur hybride sont
• Grande portabilité du code
• Habituellement, une meilleure gestion des erreurs
• Les désavantages sont
• Souvent une vitesse d’exécution plus lente
15
Compilateur vs Interpréteur • Un compilateur produit habituellement du code plus
rapide qu’un interpréteur
• Le code produit par un compilateur est adapté à une
machine en particulier. Le code est donc difficilement
portable
16
Compilateur vs Interpréteur • L’interprète est habituellement écrit dans un langage de
haut niveau, il est donc plus portable.
• L’écriture d’un interpréteur demande habituellement moins de travail qu’un compilateur standard
• L’interpréteur travaille directement avec la représentation sémantique, ce qui améliore la sécurité et la gestion des erreurs
17
Histoire des compilateurs • Dans les années 1940, les premiers ordinateurs sont
construits
• L’ENIAC (Electronic Numerical Integrator And Computer) à
l’Université de Pennsylvanie
• Sert à calculer des tables de tir de calculs balistiques
• Remplace 200 personnes qui calculaient manuellement les tables
• Personne n’avait jamais programmé un ordinateur
• Il fallait programmer de façon manuelle, en enfichant des câbles et en
manipulant des commutateurs
18
Histoire des compilateurs • Les premières programmeuses de l’ENIAC étaient 6
femmes
• Kathleen McNulty Mauchly Antonelli
• Jean Jennings Bartik
• Frances Synder Holberton
• Marlyn Wescoff Meltzer
• Frances Bilas Spence
• Ruth Lichterman Teitelbaum
19
Histoire des compilateurs • Aucune documentation
• Seriez-vous capable de
programmer un ordinateur
sans aucune information,
outre les schémas
techniques du câblage de
la machine?
• C’est une tâche très
ardue!
20
Histoire des compilateurs • Au début des années 1950, Grace Murray Hopper est
programmeuse sur le Harvard Mark I
• Elle lance l’idée folle de créer un nouveau langage de programmation, basé sur l’anglais, pour indiquer à l’ordinateur ce qu’il doit faire
• Personne ne la prend au sérieux, un ordinateur est seulement fait pour faire du calcul, et rien d’autre!
21
Histoire des compilateurs • Elle écrit le premier programme qui
interprète du code et écrit le code
machine associé
• C’est ce qu’on appelle aujourd’hui
compiler un programme!
• Elle crée ensuite le langage
COBOL
22
Histoire des compilateurs
• De 1945 à 1960
• On faisait de la génération de code
• Comment produire du code pour une machine spécifique?
• Souvent de l’assembleur au code machine manuellement
• Les programmes compilés étaient souvent plus longs et moins
efficaces que ceux écrits par des programmeurs
23
Histoire des compilateurs • Développement des premiers langages
• FORTRAN (FORmula TRANslator) – 1954
• LISP (LISt Processing) – 1958
• ALGOL (ALGorithmic Oriented Language) – 1958
• COBOL (Common Business Oriented Language) – 1959
• ALGOL introduit deux concepts novateurs :
• Structure en blocs imbriqués
• Notions de portée
24
Histoire des compilateurs • De 1960 à 1975
• Introduction de l’analyse syntaxique et des formalismes
• Prolifération des langages
• Développement de la plupart des paradigmes retrouvés dans les
langages modernes
• Concept de classe
• Ramasse-miette
• Compilation JIT (Just-in-time)
• La majorité des langages sont basés sur les langages précédents
25
Histoire des compilateurs • Inspiré d’ALGOL
• SIMULA 1 (SIMple Universal LAnguage) – 1962
• SIMULA 67 – 1967 : Ajout d’un modèle de classe et de la simulation par événement discret
• C (évolution du langage B) – 1969-1973
• SmallTalk – 1970
• Inspiré de FORTRAN • BASIC (Beginner’s All-purpose Symbolic Instruction Code) – 1964
• ML (Meta Language) – 1973 • Fournira l’inspiration pour Haskell et CamL
26
Histoire des compilateurs • De 1975 à 1990
• Consolidation des langages et des paradigmes
• Développement d’une nouvelle architecture matérielle
• Le matériel doit faciliter l’écriture des compilateurs, et non faciliter la vie
des programmeurs assembleur!
• Le problème devient : Comment optimiser le code?
• Création de C++, Ada, Eiffel, Perl, etc.
• On met l’emphase sur « comment compiler » au lieu de « vers quoi
compiler »
27
Histoire des compilateurs • 1990 et +
• Gestion du parallélisme, hiérarchie de mémoires
• Apparition des langages « modernes »
• Python – 1991
• Java – 1995
• Php et Javascript – 1995
• C# – 2000
• Etc.
28
Génération des langages • Première génération
• Langage machine : binaire, switchboard, etc.
• Deuxième génération
• Langages d’assemblage : propre à chaque architecture (IFT209)
• Troisième génération
• Fortran, Algol, Cobol, C++, Java, C#
• Quatrième génération
• SQL, Matlab, R, Mathematica
• Cinquième génération
• Prolog, programmation par contraintes, etc.
29
Paradigmes des langages
• Programmation impérative
• Suite d’instructions, boucle, etc.
• Programmation orientée objet
• Classe, méthodes, objets, etc.
• Programmation fonctionnelle
• Sans effet de bord, appels de fonctions imbriqués
30
Paradigmes des langages
• Programmation logique
• Utilise un moteur d’inférence, applique un ensemble de règles
• Programmation parallèle
• Plusieurs fils d’exécution, en coopération, en compétition, etc.
• Programmation événementielle
• « Callback », asynchrone, etc.
31
Structure d’un compilateur
32
Analyseur
lexical
Analyseur
syntaxique
Analyseur
sémantique
Générateur
de code
intermédiaire
Optimiseur de code
indépendant de la
machine
Générateur
de code
Optimiseur de
code dépendant
de la machine
Table
des s
ym
bole
s
Partie frontale
Partie finale
Flot d’unités
lexicales
Arbre syntaxique
abstrait
Arbre syntaxique abstrait
décoré
Code intermédiaire
Code intermédiaire
optimisé Code cible
Code cible
optimisé
Structure d’un compilateur
• Une phase représente une transformation entre les
données reçues en entrées et celles produites en sorties
• Une passe représente un ensemble de phases
• On lit d’un fichier, on fait les transformations, et on écrit le résultat
dans un fichier pour qu’il soit utilisé dans une passe suivante
33
Structure d’un compilateur • Il y a trois types de compilateurs
• Compilateur étroit (narrow)
• Une boucle de lecture lit quelques lexèmes et génère la partie de code associé
• Compilateur large
• Lecture de l’ensemble du texte source et génération entière du code
• Compilateur à la volée (JIT)
• Lit une partit du code et le compile en appliquant des optimisations dépendantes du contexte d’exécution
34
Propriétés d’un bon compilateur • Il doit bien fonctionner (correct)
• Le temps requis pour compiler doit être acceptable
• Il doit y avoir peu de limitations (ex : longueur des noms)
• Les messages d’erreurs produits doivent être clairs!
35
Propriétés d’un bon compilateur • Le code généré doit être rapide à exécuter (qualité)
• La taille du code généré doit être acceptable
• L’énergie consommée par le code généré doit être
acceptable
36
Propriétés d’un bon compilateur • Le compilateur doit avoir une conception modulaire pour
permettre
• d’être portable (portabilité)
• d’être reciblé facilement (reciblage)
• d’être maintenu simplement (maintenabilité)
• de fournir des versions différentes
37
Propriétés d’un bon compilateur • Portabilité
• Facilité à installer sur
• Une autre machine
• Un autre système d’exploitation
• Permettre de générer du code pour une plateforme différente que
celle sur laquelle il s’exécute (cross-compiler)
38
Propriétés d’un bon compilateur • Reciblage
• Permet de modifier le compilateur pour générer du code spécifique
à un processeur différent
• Ex : Un compilateur C++ qui compile pour un ordinateur Intel ou un
Smartphone possédant un processeur ARM
39
Propriétés d’un bon compilateur • Maintenabilité
• Permet de corriger rapidement les bogues potentiels
• Différentes versions
• Permet de modifier et d’ajouter simplement de nouvelles
fonctionnalités
• Permet de les activer ou les désactiver pour être compatible avec
d’anciennes versions du langage
40
Pourquoi étudier les compilateurs ? • C’est une branche de l’informatique qui est fondamentale
• Pour intégrer un vaste ensemble de connaissances vu
dans les cours d’informatique
• Pour comprendre pourquoi les langages sont construits
de la façon qu’ils le sont
41
Pourquoi étudier les compilateurs ? • C’est intéressant de voir comment la magie se passe
• Plusieurs des concepts et algorithmes utilisés par les
compilateurs peuvent être utiles à d’autres problèmes
• Vous pourriez avoir à travailler sur des problèmes qui ont
un lien indirect avec les compilateurs
42
Pourquoi étudier les compilateurs ? • Pour mieux comprendre les messages d’erreurs des
compilateurs
• Pour être plus efficace lorsque vous écrivez du code
• C’est juste trop amusant d’apprendre!
43