Cours 1 : La compilation



Documents pareils
Machines virtuelles Cours 1 : Introduction

Cours 1 : Qu est-ce que la programmation?

Évaluation et implémentation des langages

Compilation (INF 564)

Éléments d informatique Cours 3 La programmation structurée en langage C L instruction de contrôle if

IN Cours 1. 1 Informatique, calculateurs. 2 Un premier programme en C

Traduction des Langages : Le Compilateur Micro Java

Logiciel Libre Cours 3 Fondements: Génie Logiciel

Manuel d utilisation 26 juin Tâche à effectuer : écrire un algorithme 2

Programmation C. Apprendre à développer des programmes simples dans le langage C

Suivant les langages de programmation, modules plus avancés : modules imbriqués modules paramétrés par des modules (foncteurs)

Introduction au langage C

Chapitre VI- La validation de la composition.

Éléments de programmation et introduction à Java

Bases de programmation. Cours 5. Structurer les données

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Cours de Programmation 2

Cours intensif Java. 1er cours: de C à Java. Enrica DUCHI LIAFA, Paris 7. Septembre Enrica.Duchi@liafa.jussieu.fr

modules & compilation

UE Programmation Impérative Licence 2ème Année

Classes et Objets en Ocaml.

Analyse de sécurité de logiciels système par typage statique

TP1 : Initiation à Java et Eclipse

L informatique en BCPST

Gestion mémoire et Représentation intermédiaire

Conception de circuits numériques et architecture des ordinateurs

Conventions d écriture et outils de mise au point

Grandes lignes ASTRÉE. Logiciels critiques. Outils de certification classiques. Inspection manuelle. Definition. Test

1/24. I passer d un problème exprimé en français à la réalisation d un. I expressions arithmétiques. I structures de contrôle (tests, boucles)

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

Exceptions. 1 Entrées/sorties. Objectif. Manipuler les exceptions ;

Le langage C++ est un langage de programmation puissant, polyvalent, on serait presque tenté de dire universel, massivement utilisé dans l'industrie

Logiciel Libre Cours 2 Fondements: Programmation

Algorithmique et Programmation, IMA

Introduction à la programmation Travaux pratiques: séance d introduction INFO0201-1

Initiation à l algorithmique

F. Barthélemy. 17 mai 2005

Cours 1 : Introduction Ordinateurs - Langages de haut niveau - Application

Concept de machine virtuelle

INITIATION AU LANGAGE C SUR PIC DE MICROSHIP

Virtualisation logicielle De la machine réelle à la machine virtuelle abstraite

Algorithmique I. Algorithmique I p.1/??

Cours 1 : Introduction. Langages objets. but du module. contrôle des connaissances. Pourquoi Java? présentation du module. Présentation de Java

length : A N add : Z Z Z (n 1, n 2 ) n 1 + n 2

Rappel. Analyse de Données Structurées - Cours 12. Un langage avec des déclaration locales. Exemple d'un programme

Représentation d un entier en base b

Plan du cours. Historique du langage Nouveautés de Java 7

Info0101 Intro. à l'algorithmique et à la programmation. Cours 3. Le langage Java


Annexe : La Programmation Informatique

Licence Sciences et Technologies Examen janvier 2010

UEO11 COURS/TD 1. nombres entiers et réels codés en mémoire centrale. Caractères alphabétiques et caractères spéciaux.

IV- Comment fonctionne un ordinateur?

Une dérivation du paradigme de réécriture de multiensembles pour l'architecture de processeur graphique GPU

# let rec concat l1 l2 = match l1 with [] -> l2 x::l 1 -> x::(concat l 1 l2);; val concat : a list -> a list -> a list = <fun>

La technologie Java Card TM

Machines virtuelles fonctionnelles (suite) Compilation ML Java

EPREUVE OPTIONNELLE d INFORMATIQUE CORRIGE

ALGORITHMIQUE ET PROGRAMMATION En C

ACTIVITÉ DE PROGRAMMATION

OCL - Object Constraint Language

Exclusion Mutuelle. Arnaud Labourel Courriel : arnaud.labourel@lif.univ-mrs.fr. Université de Provence. 9 février 2011

Chapitre I Notions de base et outils de travail

Licence Bio Informatique Année Premiers pas. Exercice 1 Hello World parce qu il faut bien commencer par quelque chose...

STAGE IREM 0- Premiers pas en Python

Entraînement au concours ACM-ICPC

La mémoire. Un ordinateur. L'octet. Le bit

Architecture des ordinateurs

Informatique UE 102. Jean-Yves Antoine. Architecture des ordinateurs et Algorithmique de base. UFR Sciences et Techniques Licence S&T 1ère année

Machines virtuelles. Brique ASC. Samuel Tardieu Samuel Tardieu (ENST) Machines virtuelles 1 / 40

Quelques éléments de compilation en C et makefiles

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Cours d Algorithmique et de Langage C v 3.0

Théorie de la Programmation

4. Utilisation d un SGBD : le langage SQL. 5. Normalisation

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

basée sur le cours de Bertrand Legal, maître de conférences à l ENSEIRB Olivier Augereau Formation UML

Outils pour la pratique

Programmer en JAVA. par Tama

Vérification formelle de la plate-forme Java Card

Génie Logiciel avec Ada. 4 février 2013

Cours d Algorithmique-Programmation 2 e partie (IAP2): programmation 24 octobre 2007impérative 1 / 44 et. structures de données simples

Représentation des Nombres

TP1. Outils Java Eléments de correction

Poker. A rendre pour le 25 avril

Machines Virtuelles. et bazard autour. Rémi Forax

Cours d initiation à la programmation en C++ Johann Cuenin

Présentation du langage et premières fonctions

Table des matières Avant-propos... V Scripting Windows, pour quoi faire?... 1 Dans quel contexte?

INF2015 Développement de logiciels dans un environnement Agile. Examen intra 20 février :30 à 20:30

Rappels d architecture

CCI Génie Logiciel UFR - IMA. Objectifs du cours d'aujourd'hui. Génie Logiciel Validation par le test. Qu est-ce que tester un programme?

Architecture matérielle des systèmes informatiques

Définitions. Numéro à préciser. (Durée : )

Cours d algorithmique pour la classe de 2nde

INTRODUCTION AUX SYSTEMES D EXPLOITATION. TD2 Exclusion mutuelle / Sémaphores

Expression des contraintes. OCL : Object C o n t r a i n t L a n g u a g e

Préparation à l examen EFA en Macro

Transcription:

/38 Interprétation des programmes Cours 1 : La compilation Yann Régis-Gianas yrg@pps.univ-paris-diderot.fr PPS - Université Denis Diderot Paris 7

2/38 Qu est-ce que la compilation? Vous avez tous déjà tapé : % javac Fact.java Que se passe-t-il ensuite?

3/38 Qu est-ce qu un compilateur? Il se peut que votre programme soit rejeté : Fact.java:3: incompatible types found : boolean required: int if (n == 0) return (true) ; ˆ 1 error Il se peut aussi que votre programme soit accepté. Dans ce cas, vous pouvez exécuter le programme : % java Fact 2004310016

4/38 Qu attend-t-on du compilateur?

/38 Qu attend-t-on du compilateur? Pour donner une spécification à un compilateur, il faut d abord bien comprendre ce qu est la programmation. Informellement, la programmation est l art de résoudre des problèmes efficacement, par le calcul.

/38 Résoudre des problèmes? Il existe de nombreux types de problèmes : certains sont simples à résoudre et d autres sont plus difficiles, certains ont une solution connue, d autres pas, certains ont un énoncé très court tandis que d autres nécessitent une description gigantesque. Dans tous les cas, cependant, un problème, bien posé, peut se spécifier à l aide d une formule logique de la forme : I, P(I) O, Q(I, O) où : P est la précondition du problème : le domaine de ses entrées valides. Q est sa postcondition : la relation attendue entre les entrées et les sorties.

7/38 Exemple de spécification I, Precondition(I) = O, Postcondition(I, O) Un algorithme de tri : Entrée : un tableau t. Précondition : il existe une relation d ordre sur les éléments du tableau. Sortie : un tableau u. Postcondition : u est trié et contient exactement les mêmes éléments que t.

/38 Distance entre spécification et réalisation Ce n est pas parce que l on peut démontrer qu il existe une solution à un problème que cette solution est calculable efficacement. C est au programmeur de l expliciter à l aide du langage de programmation.

9/38 À quel niveau de détails doit-on expliciter la solution? Spécification du problème Résolution effective par la machine F. I. I, F I S Programmeur Compilateur Langage de programmation Autrefois, il y a bien longtemps, les programmes étaient écrits sur des fiches perforées. La manipulation de ces fiches était un travail de fourmi, long et fastidieux. Éviter les erreurs dans la réalisation d un programme était alors très difficile. Aujourd hui, les outils de développement logiciel ont simplifié ce processus.

10/38 Comment éviter les erreurs? Le premier «bug».

1/38 Comment éviter les erreurs? Il y a différents types d erreurs dans un programme. Les erreurs de fonctionnement apparaissent lorsque la description du calcul contient une opération illicite qui empêche l obtention d un résultat : segmentation fault : écriture dans une zone mémoire non allouée ; Uncaught exception : un cas exceptionnel n est pas traité. Il faut s assurer que les opérations effectuées par la machine ont un sens. Lorsque le programme produit un résultat mais qu il ne respecte pas la spécification, on parle d erreur de correction. Le calcul n est pas le bon! Il faut raisonner sur le programme pour comprendre ce qu il calcule. Est-il facile de raisonner sur un programme? Peut-on prouver qu un programme vérifie une spécification?

2/38 Résoudre la tension entre le «quoi?» et le «comment?» Pour faciliter le raisonnement sur les programmes, les langages de programmation réduisent la distance entre le «quoi?» et le «comment?» en Introduisant des mécanismes calculatoires de plus en plus en abstraits et éloignés des détails de la machine. Abstraire, c est capturer ce qui est strictement utile à la programmation en mettant de côté certains détails d implémentation non pertinents (relativement aux types de programmes écrits). La programmation est ainsi plus sûre.

13/38 Des langages de programmation plus ou moins abstraits Plus un langage de programmation fournit des mécanismes calculatoires abstraits des détails de fonctionnement de la machine et plus le langage est dit de haut-niveau. Comparez les deux programmes suivants, sont-ils équivalents? let neglist = List.map (fun x - x) list_t neglist (list_t l) { list_t result = empty_list ; while (l!= empty_list) { result = insert (- l element, result) ; l = l next ; } return result ; }

Des langages de programmation plus ou moins abstraits Plus un langage de programmation fournit des mécanismes calculatoires abstraits des détails de fonctionnement de la machine et plus le langage est dit de haut-niveau. Comparez les deux programmes suivants, sont-ils équivalents? Non! Pas du tout! 13/38 let neglist = List.map (fun x - x) list_t neglist (list_t l) { list_t result = empty_list ; while (l!= empty_list) { result = insert (- l element, result) ; l = l next ; } return result ; }

14/38 Exemple : s abstraire de l ordre des calculs Langages fonctionnels : Un programme est un ensemble de fonctions. Langages logiques : Un programme est un ensemble de formules. Langages de programmation par contraintes : Un programme est un ensemble de contraintes à satisfaire. Langages orientés objets : Un programme est un ensemble d objets qui collaborent en communiquant par envoi de messages.

5/38 Comment décrire le calcul? Dès lors qu ils s affranchissent des opérations élémentaires de la machine qui les exécutent, les mécanismes des langages de programmation ne peuvent plus s exprimer simplement en fonction de ces derniers. Il faut se doter d une interprétation univoque et indépendante de chaque langage de programmation : une sémantique.

6/38 Comment définir une sémantique? On peut donner la sémantique à un langage de plusieurs façons. Une sémantique dénotationnelle interprète un programme dans un espace mathématique (comme une fonction par exemple). fact : N N n n! Une sémantique opérationnelle en donne une description calculatoire : n! = 1 2... (n 1) n En suivant les règles données par la sémantique opérationnelle d un langage de programmation L, on peut écrire un programme, appelé interprète, qui permet d exécuter tout programme écrit en L. Nous nous intéresserons à la sémantique opérationnelle uniquement. Ses règles sont données vis-à-vis d une syntaxe.

7/38 Syntaxe Définition Un langage est accompagné d une syntaxe concrète et d une syntaxe abstraite, toutes deux spécifiées par des grammaires formelles. La syntaxe concrète est un langage de mots tandis que la syntaxe abstraite est un langage d arbres. C est l analyse syntaxique qui fait le lien entre ces deux syntaxes en associant son arbre de syntaxe abstraite à tout mot du langage de la syntaxe concrète.

8/38 Syntaxe Exemple La syntaxe concrète des expressions arithmétiques est donnée par la grammaire suivante : e ::= n où n N e + e e e e / e e e ( e ) La syntaxe abstraite des expressions arithmétiques est donnée par la grammaire suivante : e ::= n où n N e + e e e e/e e e dans la suite, on note pour représenter une opération arithmétique binaire.

19/38 Langage de spécification des sémantiques On a coutume de spécifier les sémantiques opérationnelles par des jugements définis à l aide règles de la forme : H 1... H n C

20/38 Sémantique à petits pas e 1 e 1 e 1 e 2 e 1 e 2 e 2 e 2 n 1 e 2 n 1 e 2 n 1 n 2 m avec m = n 1 N n 2 Une sémantique à petits pas est spécifiée par un jugement qui associe un terme au terme obtenu à l étape suivante du calcul (si elle existe).

21/38 Sémantique à grands pas (Const) n n (Add) e 1 n 1 e 2 n 2 e 1 e 2 n 1 N n 2 Une sémantique à grands pas est spécifiée par un jugement qui associe un terme à son résultat.

22/38 En OCaml... (* La syntaxe *) type t = Int of int BinOp of t binop t and binop = Add Sub Mul Div (* La sémantique à petits pas. *) let rec step : t t = function Int _ None BinOp (Int m, Add, Int n) Some (Int (m + n)) BinOp (Int m, Mul, Int n) Some (Int (m n)) BinOp (Int m, Div, Int n) Some (Int (m / n)) BinOp (Int m, Sub, Int n) Some (Int (m - n)) BinOp (Int m, op, e ) Some (BinOp (Int m, op, step e )) BinOp (e, op, e ) Some (BinOp (step e, op, e )) (* La sémantique à grands pas. *) type value = int let rec eval : t value = function Int x x BinOp (e, Add, e ) eval e + eval e BinOp (e, Mul, e ) eval e eval e BinOp (e, Div, e ) eval e / eval e BinOp (e, Sub, e ) eval e - eval e

3/38 Qu est-ce qui différencie un langage d un autre? Il y a une infinité de façon de représenter un calcul. Dans le cas précédent, un calcul est une succession de lignes tracées à l écran. En C, un calcul est une transformation de l état de la machine. Dans le cas d un mélange chimique, un calcul est un ensemble de réactions. Ce sont autant de modèles de calcul différents.

4/38 Une machine abstraite pour chaque modèle de calcul Une machine abstraite décrit l environnement et les règles d évaluation d un modèle de calcul. Très peu de modèles possèdent une réalisation physique de leur machine abstraite (à l exception du modèle de Von Neumann). On peut cependant émuler une machine abstraite à l aide d un autre programme. Un tel programme est appelé machine virtuelle.

5/38 Exemples de machines virtuelles La Java Virtual Machine (JVM) est une machine virtuelle implémentée par le progamme java. Le programme ocamlrun est la machine virtuelle du langage OCaml. Le programme Qemu émule un ordinateur IBM PC. On peut écrire un programme qui émule une machine de Turing.

26/38 Une limitation gênante, un compilateur pour la contrer L émulation d une machine abstraite ou l utilisation d un interprète introduisent une inévitable inefficacité : pour chaque opération X de la machine abstraite, il est nécessaire de décoder sa représentation et de l émuler au fur et à mesure par des instructions de la machine réelle. Il y a donc une couche supplémentaire de traduction. Un compilateur répond à l objectif de limitation de ces couches d interprétation en traduisant un programme écrit dans un langage L en un programme équivalent écrit dans un langage L et qui possède une réalisation efficace de sa machine abstraite.

7/38 Exemples de compilation Le langage C se compile en code assembleur i386 qui est interprété (très) efficacement par les processeurs d architecture Intel. Le langage Java se compile vers un langage appelé code-octet Java qui est interprété par la machine virtuelle Java. Python est compilé vers un sous-ensemble de Python qui est interprété par la machine virtuelle de Python.

28/38 La spécification d un compilateur Un compilateur attend des programmes écrits dans un certain langage source et qui ont un sens. La précondition d un compilateur est donc une certaine propriété de bonne formation des programmes d entrée (être syntaxiquement corrects, être bien typés,... ). La sortie d un compilateur est un programme écrit dans le langage cible. On s attend d une part à ce que ce programme ait un sens mais, et c est bien plus fort, à ce qu il ait un sens équivalent au programme d entrée. En résumé, la propriété fonctionnelle essentielle d un compilateur est donc d être une traduction préservant la sémantique des programmes.

29/38 Quelques mises au point... Un compilateur est une fonction qui traduit un programme écrit dans un langage source en un programme écrit dans un langage cible. Un interprète pour un langage L est une fonction qui évalue un programme écrit dans le langage L. En pratique, ces outils s utilisent de multiples façons : Le mode batch qui consiste à intégrer la fonction de compilation ou d interprétation dans un programme et à l utiliser sur des fichiers, appelés unités de compilation. Le mode interactif qui consiste à intégrer la fonction de compilation et/ou d interprétation dans une boucle interactive de façon à compiler et/ou interpréter les entrées de l utilisateur au fur et à mesure de leur définition.

0/38 Exemples d outils d interprétation et de compilation Le programme python est un interprète en mode interactif quand il est utilisé sans argument, en mode batch si on lui donne un fichier py. Le programme ocaml est un compilateur vers la machine virtuelle ocaml et un interprète pour cette machine virtuelle dans une boucle interactive. Les programmes gcc, ocamlc, ocamlopt, javac sont des compilateurs en mode batch.

31/38 Quels sont les techniques d implémentation utilisées en compilation?

32/38 Architecture d un compilateur (de loin) p L S Compilateur c L C

33/38 Architecture d un compilateur (d un peu plus près) L 3 C L S Partie avant L I Partie arrière L 2 C L 1 C Une architecture très courante consiste à séparer le compilateur en deux sous-compilateurs. La partie avant (front-end) traduit un programme du langage source L S en un programme d un langage intermédiaire L I. Ce programme de L I est ensuite traduit par la partie arrière du compilateur en programmes de langages cibles différents.

33/38 Architecture d un compilateur (d un peu plus près) P ascal P.A. Pascal ARM LLV M Partie arrière P P C C P.A. C i386 On peut ainsi réutiliser la partie arrière pour factoriser la conversion vers des cibles différentes. Le choix du langage intermédiaire est crucial.

34/38 L architecture d un compilateur : la partie avant Code source Analyse lexicale Flux lexical Analyse syntaxique Arbre de syntaxe abstraite Analyse sémantique Arbre de syntaxe bien formé

5/38 Le programme de Interprétation des programmes 1. Rappels sur la compilation des langages du premier ordre 2. Les types sommes et les enregistrements. 3. Langages d ordre supérieur. 4. Langages d instructions

6/38 Fonctionnement du cours Un cours orienté projet Le cours sera dédié à l étude des différents composants du compilateur et à leur programmation (qui sera faite pendant le cours). Les TPs seront dédiés au projet : il s agira de compléter le code source écrit pendant les cours pour obtenir votre projet final. Le cours qui suivra le TP servira à comprendre où vous rencontrez des problèmes et à revenir sur ces problèmes. Les TPs sont pris en charge par Pierre Letouzey. Séances de cours Un calendrier pour savoir si vous avez TP ou cours. Globalement : 2 cours pour 1 TP. (Implication : Vous devez travailler sur votre projet en dehors des TPs!)

7/38 Evaluation du cours Le projet est obligatoire. L examen portera sur des extensions du projet. La note finale est : 70% projet + 30% examen.

38/38 La chaîne de compilation du projet de cette année Funi RawFuni XFuni FopiLight Fopi RTL... ARM-Linux