Vous êtes sur la page 1sur 43

1

INTRODUCTION
IFT580 – Compilation et interprétation des langages
2

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)


3

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)
4

Qu’est-ce qu’un compilateur ?


Programme Programme
source Compilateur cible Données

S L C E

Résultats
5

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
6

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++?
7

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!


8

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
9

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
10

Qu’est-ce qu’un compilateur ?


Code source
Préprocesseur
Code source modifié
Compilateur
Code en langage d’assemblage
Assembleur
Code translatable
Relieur Fichiers de bibliothèque, etc.

Programme exécutable
11

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
12

Qu’est-ce qu’un interpréteur ?


Programme
source

Interpréteur Résultats
E

Données
13

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


14

Qu’est-ce qu’un compilateur hybride ?


Programme Code
source Compilateur intermédiaire Données

S L I E

Résultats Interpréteur
15

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
16

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
17

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
18

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
19

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
20

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!
21

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!
22

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
23

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
24

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
25

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
26

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
27

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 »
28

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.
29

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.
30

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
31

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.
32

Structure d’un compilateur


Partie frontale Arbre syntaxique abstrait
décoré
Générateur

Table des symboles


Analyseur Analyseur Analyseur
de code
lexical syntaxique sémantique
intermédiaire
Flot d’unités Arbre syntaxique
lexicales abstrait

Partie finale Code intermédiaire

Optimiseur de Optimiseur de code


Générateur
code dépendant indépendant de la
de code
de la machine machine
Code cible Code intermédiaire
Code cible
optimisé optimisé
33

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
34

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
35

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!


36

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
37

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
38

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)
39

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
40

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
41

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
42

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
43

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!

Vous aimerez peut-être aussi