Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf ·...

43
INTRODUCTION IFT580 Compilation et interprétation des langages 1

Transcript of Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf ·...

Page 1: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

INTRODUCTION IFT580 – Compilation et interprétation des langages

1

Page 2: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 3: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 4: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

Qu’est-ce qu’un compilateur ?

4

S C L

Programme

source Compilateur Programme

cible

E

Données

R

Résultats

Page 5: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 6: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 7: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 8: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 9: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 10: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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.

Page 11: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 12: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

12

S

E

R

Programme

source

Données

Interpréteur Résultats

Page 13: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 14: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 15: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 16: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 17: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 18: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 19: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 20: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 21: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 22: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 23: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 24: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 25: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 26: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 27: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 28: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 29: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 30: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 31: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 32: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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é

Page 33: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 34: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 35: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 36: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 37: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 38: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 39: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 40: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 41: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 42: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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

Page 43: Introduction - Université de Sherbrookeinfo.usherbrooke.ca/.../ift580/notes/01-Introduction.pdf · 2018. 1. 5. · Assembleur Code source Code source modifié Code en langage d’assemblage

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