Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
1
Cours de compilation 2 - Intranet
Evaluation partielle et compilation 21 septembre 2007 Cours de compilation 2 - Intranet
2
Les grandes lignes du cours
Définitions de base Composition de compilateurs L’environnement d’un compilateur Evaluation partielle et compilation Analyses lexicales et syntaxiques Techniques d’analyse descendantes Techniques d’analyse ascendantes YACC Analyse sémantique Environnement d’exécution Génération de code Optimisation de code 21 septembre 2007 Cours de compilation 2 - Intranet
3
Cours de compilation 2 - Intranet
I N T R O D U C T I O N 21 septembre 2007 Cours de compilation 2 - Intranet
4
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre 21 septembre 2007 Cours de compilation 2 - Intranet
5
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète 21 septembre 2007 Cours de compilation 2 - Intranet
6
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète un compilateur 21 septembre 2007 Cours de compilation 2 - Intranet
7
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! un compilateur Il ne possède aucune donnée ! 21 septembre 2007 Cours de compilation 2 - Intranet
8
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un compilateur Il ne possède aucune donnée ! Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
9
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un évaluateur (interprète) partiel un compilateur Il ne possède aucune donnée ! Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
10
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un évaluateur (interprète) partiel Il possède une partie des données ! un compilateur Il ne possède aucune donnée ! Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
11
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un évaluateur (interprète) partiel Il possède une partie des données ! Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! un compilateur Il ne possède aucune donnée ! Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
12
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un évaluateur (interprète) partiel Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! un compilateur Il ne possède aucune donnée ! Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
13
Cours de compilation 2 - Intranet
Définitions de base Classiquement, on distingue entre un interprète Il possède toutes les données ! Il exécute tout le programme ! un évaluateur (interprète) partiel Il ne possède aucune donnée ! Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! un compilateur Il n’exécute rien du tout ! 21 septembre 2007 Cours de compilation 2 - Intranet
14
Cours de compilation 2 - Intranet
Définitions de base Un évaluateur partiel est donc un outil hybride entre interprète et compilateur, 21 septembre 2007 Cours de compilation 2 - Intranet
15
Cours de compilation 2 - Intranet
Définitions de base Un évaluateur partiel est donc un outil hybride entre interprète et compilateur, qui englobe les deux notions 21 septembre 2007 Cours de compilation 2 - Intranet
16
Cours de compilation 2 - Intranet
Définitions de base Un évaluateur partiel est donc un outil hybride entre interprète et compilateur, qui englobe les deux notions et permet de construire automatiquement un compilateur en partant de son interprète ! 21 septembre 2007 Cours de compilation 2 - Intranet
17
Cours de compilation 2 - Intranet
Définitions de base Un évaluateur partiel est donc un outil hybride entre interprète et compilateur, qui englobe les deux notions et permet de construire automatiquement un compilateur en partant de son interprète ! La théorie en a été faite par Futamura en 1971: Les trois projections de Futamura. 21 septembre 2007 Cours de compilation 2 - Intranet
18
Cours de compilation 2 - Intranet
Définitions de base Un évaluateur partiel est donc un outil hybride entre interprète et compilateur, qui englobe les deux notions et permet de construire automatiquement un compilateur en partant de son interprète ! La théorie en a été faite par Futamura en 1971: Les trois projections de Futamura. Les premières réalisations datent de 1986. 21 septembre 2007 Cours de compilation 2 - Intranet
19
Cours de compilation 2 - Intranet
Q U E L Q U E S N O T A T I O N S E T D E F I N I T I O N S 21 septembre 2007 Cours de compilation 2 - Intranet
20
Cours de compilation 2 - Intranet
Notations et définitions Pour un programme, nous distinguons entre son code source, indiqué par le suffixe .c prog.c 21 septembre 2007 Cours de compilation 2 - Intranet
21
Cours de compilation 2 - Intranet
Notations et définitions Pour un programme, nous distinguons entre son code source, indiqué par le suffixe .c son exécutable, indiqué par le suffixe .o prog.c prog.o 21 septembre 2007 Cours de compilation 2 - Intranet
22
Cours de compilation 2 - Intranet
Notations et définitions Pour un programme, nous distinguons entre son code source, indiqué par le suffixe .c son exécutable, indiqué par le suffixe .o prog.c prog.o Nous distinguons aussi entre les programmes unaires, indiqués par le 1 prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
23
Cours de compilation 2 - Intranet
Notations et définitions Pour un programme, nous distinguons entre son code source, indiqué par le suffixe .c son exécutable, indiqué par le suffixe .o prog.c prog.o Nous distinguons aussi entre les programmes unaires, indiqués par le 1 les programmes binaires, indiqués par le 2 prog1.c prog2.o 21 septembre 2007 Cours de compilation 2 - Intranet
24
Cours de compilation 2 - Intranet
Notations et définitions Un interprète Int est un programme binaire dont les arguments sont : 21 septembre 2007 Cours de compilation 2 - Intranet
25
Cours de compilation 2 - Intranet
Notations et définitions Un interprète Int est un programme binaire dont les arguments sont : le texte source d’un programme unaire Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
26
Cours de compilation 2 - Intranet
Notations et définitions Un interprète Int est un programme binaire dont les arguments sont : le texte source d’un programme unaire Prog1.c l’unique donnée D de ce programme. 21 septembre 2007 Cours de compilation 2 - Intranet
27
Cours de compilation 2 - Intranet
Notations et définitions Un interprète Int est un programme binaire dont les arguments sont : le texte source d’un programme unaire Prog1.c l’unique donnée D de ce programme. Nous avons les propriétés suivantes : Int.o ( Prog1.c , D ) = Résultat 21 septembre 2007 Cours de compilation 2 - Intranet
28
Cours de compilation 2 - Intranet
Notations et définitions Un interprète Int est un programme binaire dont les arguments sont : le texte source d’un programme unaire Prog1.c l’unique donnée D de ce programme. Nous avons les propriétés suivantes : Int.o ( Prog1.c , D ) = Résultat Prog1.o ( D ) = Résultat 21 septembre 2007 Cours de compilation 2 - Intranet
29
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : 21 septembre 2007 Cours de compilation 2 - Intranet
30
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c 21 septembre 2007 Cours de compilation 2 - Intranet
31
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c la première donnée D1 de ce programme. 21 septembre 2007 Cours de compilation 2 - Intranet
32
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c la première donnée D1 de ce programme. Nous avons les propriétés suivantes : Ep.o ( Prog2.c , D1 ) = Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
33
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c la première donnée D1 de ce programme. Nous avons les propriétés suivantes : Ep.o ( Prog2.c , D1 ) = Prog1.c On dit encore que le programme Prog2.c est « spécialisé » par rapport à la donnée D1 ! 21 septembre 2007 Cours de compilation 2 - Intranet
34
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c la première donnée D1 de ce programme. Nous avons les propriétés suivantes : Ep.o ( Prog2.c , D1 ) = Prog1.c Prog1.o ( D2 ) = Résultat Int.o ( Prog1.c , D2 ) = Résultat Pour tout D2 : 21 septembre 2007 Cours de compilation 2 - Intranet
35
Cours de compilation 2 - Intranet
Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont : le source d’un programme binaire Prog2.c la première donnée D1 de ce programme. Nous avons les propriétés suivantes : Ep.o ( Prog2.c , D1 ) = Prog1.c Prog1.o ( D2 ) = Résultat Prog2.o ( D1 , D2 ) = Résultat Pour tout D2 : 21 septembre 2007 Cours de compilation 2 - Intranet
36
Cours de compilation 2 - Intranet
E X E M P L E S 21 septembre 2007 Cours de compilation 2 - Intranet
37
Cours de compilation 2 - Intranet
Exemples L’évaluateur Ep évalue les sous-expressions connues et laisse les autres telles quelles. 21 septembre 2007 Cours de compilation 2 - Intranet
38
Cours de compilation 2 - Intranet
Exemples L’évaluateur Ep évalue les sous-expressions connues et laisse les autres telles quelles. L’idée est la suivante : ( x + 3 ) * ( y – 4 ) plus le fait que x vaille 5 21 septembre 2007 Cours de compilation 2 - Intranet
39
Cours de compilation 2 - Intranet
Exemples L’évaluateur Ep évalue les sous-expressions connues et laisse les autres telles quelles. L’idée est la suivante : ( x + 3 ) * ( y – 4 ) plus le fait que x vaille 5 donne 8 * ( y – 4 ) 21 septembre 2007 Cours de compilation 2 - Intranet
40
Cours de compilation 2 - Intranet
Exemples L’évaluateur Ep évalue les sous-expressions connues et laisse les autres telles quelles. L’idée est la suivante : ( x + 3 ) * ( y – 4 ) plus le fait que x vaille 5 donne 8 * ( y – 4 ) 8 5 21 septembre 2007 Cours de compilation 2 - Intranet
41
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
42
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) 21 septembre 2007 Cours de compilation 2 - Intranet
43
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) 21 septembre 2007 Cours de compilation 2 - Intranet
44
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
45
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
46
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
47
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
48
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
49
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
50
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
51
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
52
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
53
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) Faux 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
54
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == 1 ) return( d1 + d2 ) else return( ( d1 * d1 ) + d2 ) l ( d2 ) return( 9 + d2 ) Faux 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
55
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 21 septembre 2007 Cours de compilation 2 - Intranet
56
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 21 septembre 2007 Cours de compilation 2 - Intranet
57
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
58
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
59
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
60
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
61
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
62
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) l ( d2 ) if ( 3 == d2 ) return( 3 * d2 ) else return( 9 ) 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
63
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : Un humain aurait fait mieux avec un raisonnement conditionnel ! 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
64
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : Un humain aurait fait mieux avec un raisonnement conditionnel ! 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 d2 vaut 3 ici !!! 3 9 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
65
Cours de compilation 2 - Intranet
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : Un humain aurait fait mieux avec un raisonnement conditionnel ! 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 d2 vaut 3 ici !!! 3 Le résultat vaut donc toujours 9 !!! 9 l ( d2 ) return( 9 ) 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
66
Un évaluateur partiel ne fait rien de tel !
Exemples Ep.o ( Prog2.c , D1 ) = Prog1.c Peuvent être calculées : Il nous reste : Un humain aurait fait mieux avec un raisonnement conditionnel ! 3 3 l ( d1 , d2 ) if ( d1 == d2 ) return( d1 * d2 ) else return( ( d1 * d1 ) ) 3 d2 vaut 3 ici !!! 3 Le résultat vaut donc toujours 9 !!! 9 l ( d2 ) return( 9 ) 3 3 21 septembre 2007 Cours de compilation 2 - Intranet
67
Cours de compilation 2 - Intranet
L A B A S E D E S P R O J E C T I O N S D E F U T A M U R A 21 septembre 2007 Cours de compilation 2 - Intranet
68
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale est la suivante : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
69
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale est la suivante : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
70
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale est la suivante : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Int.o ( Prog1.c , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
71
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale est la suivante : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Int.o ( Prog1.c , D2 ) = Res Prog1.o ( D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
72
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale plus précisément : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
73
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale plus précisément : Prog1.c Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res Prog1.o ( D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
74
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale plus précisément : Prog1.c Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res Prog1.o ( D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
75
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
L’équivalence fondamentale L’équivalence fondamentale plus précisément : Les projections de Futamura sont des instances particulières de cette équivalence, avec des choix tout à fait particuliers pour Prog2.c , D1 et D2 ! Prog1.c Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res Prog1.o ( D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
76
Cours de compilation 2 - Intranet
P R E M I E R E P R O J E C T I O N D E F U T A M U R A 21 septembre 2007 Cours de compilation 2 - Intranet
77
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Première projection de Futamura L’équivalence fondamentale est instanciée par : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
78
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Première projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Int.c D1 = Prog1.c D2 = D Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
79
Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = Res
Première projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Int.c D1 = Prog1.c D2 = D Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = Res Int.o ( Prog1.c , D ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
80
Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = « Val »
Première projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Int.c D1 = Prog1.c D2 = D Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = « Val » Int.o ( Prog1.c , D ) = « Val » 21 septembre 2007 Cours de compilation 2 - Intranet
81
Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = « Val »
Première projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Int.c D1 = Prog1.c D2 = D Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = « Val » Int.o ( Prog1.c , D ) = « Val » 21 septembre 2007 Cours de compilation 2 - Intranet
82
Première projection de Futamura ----------------------------------------------------------------
L’équivalence fondamentale est instanciée par : Prog2.c = Int.c D1 = Prog1.c D2 = D Compile_Prog1.c Int.o ( Ep.o ( Int.c , Prog1.c ) , D ) = « Val » Int.o ( Prog1.c , D ) = « Val » Compile_Prog1.o ( D ) = « Val » 21 septembre 2007 Cours de compilation 2 - Intranet
83
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? 21 septembre 2007 Cours de compilation 2 - Intranet
84
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... 21 septembre 2007 Cours de compilation 2 - Intranet
85
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... 21 septembre 2007 Cours de compilation 2 - Intranet
86
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
87
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! L’analyse du programme est donc déjà réalisée ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
88
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! L’analyse du programme est donc déjà réalisée ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... Ce qui n’est pas connu ! ! ! ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
89
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! L’analyse du programme est donc déjà réalisée ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... Ce qui n’est pas connu ! ! ! ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
90
Cours de compilation 2 - Intranet
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! L’analyse du programme est donc déjà réalisée ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... Ce qui n’est pas connu ! ! ! L’exécution du programme n’est pas encore réalisée ! ! ! ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
91
Cela s'appelle "compiler" ! ! !
Première projection de Futamura Pourquoi ? Ce qui est connu ! ! ! L’analyse du programme est donc déjà réalisée ! ! ! Int.c : l ( P , D ) case is_cst? ( P ) return ( P ) is_var? ( P ) return ( value ( P , D )) is_add? ( P ) return ( add_int ( ... , ... ) ) ... Ce qui n’est pas connu ! ! ! L’exécution du programme n’est pas encore réalisée ! ! ! ... ... ... 21 septembre 2007 Cours de compilation 2 - Intranet
92
Cours de compilation 2 - Intranet
Première projection de Futamura La première projection de Futamura donne donc le texte source du code que l’interprète aurait exécuté s’il avait eu les données ! 21 septembre 2007 Cours de compilation 2 - Intranet
93
Cours de compilation 2 - Intranet
Première projection de Futamura La première projection de Futamura donne donc le texte source du code que l’interprète aurait exécuté s’il avait eu les données ! Nous obtenons un « compilateur interprétatif », c’est-à-dire réalisé par inspection de l’interprète : Comp_int.c = l ( P ) Ep.o ( Int.c , P ) 21 septembre 2007 Cours de compilation 2 - Intranet
94
Cours de compilation 2 - Intranet
Première projection de Futamura La première projection de Futamura donne donc le texte source du code que l’interprète aurait exécuté s’il avait eu les données ! Nous obtenons un « compilateur interprétatif », c’est-à-dire réalisé par inspection de l’interprète : Comp_int.c = l ( P ) Ep.o ( Int.c , P ) Comp_int.o ( Prog1.c ) = Compile_Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
95
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c
Résumé Résumons : Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
96
Cours de compilation 2 - Intranet
D E U X I E M E P R O J E C T I O N D E F U T A M U R A 21 septembre 2007 Cours de compilation 2 - Intranet
97
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
98
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
99
Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res Ep.o ( Int.c , Prog1.c ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
100
Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : La première projection pour comparaison : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res Ep.o ( Int.c , Prog1.c ) = Res Prog2.c = Int.c D1 = Prog1.c D2 = D 21 septembre 2007 Cours de compilation 2 - Intranet
101
Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : La première projection pour comparaison : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res Ep.o ( Int.c , Prog1.c ) = Res Prog2.c = Int.c D1 = Prog1.c D2 = D 21 septembre 2007 Cours de compilation 2 - Intranet
102
Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Res Ep.o ( Int.c , Prog1.c ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
103
Cours de compilation 2 - Intranet
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Compile_Prog1.c Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
104
Cours de compilation 2 - Intranet
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Compile_Prog1.c Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
105
Cours de compilation 2 - Intranet
Deuxième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Compilateur_Int.c Int.o ( Ep.o ( Ep.c , Int.c ) , Prog1.c ) = Compile_Prog1.c Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c Compilateur_Int.o ( Prog1.c ) = Compile_Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
106
Résumé ----------------------------------------------------------------
Résumons : Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c 21 septembre 2007 Cours de compilation 2 - Intranet
107
Cours de compilation 2 - Intranet
T R O I S I E M E P R O J E C T I O N D E F U T A M U R A 21 septembre 2007 Cours de compilation 2 - Intranet
108
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
109
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res Prog2.o ( D1 , D2 ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
110
Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res Ep.o ( Ep.c , Int.c ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
111
Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : La deuxième projection pour comparaison : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res Ep.o ( Ep.c , Int.c ) = Res Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
112
Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : La deuxième projection pour comparaison : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res Ep.o ( Ep.c , Int.c ) = Res Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c 21 septembre 2007 Cours de compilation 2 - Intranet
113
Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Res Ep.o ( Ep.c , Int.c ) = Res 21 septembre 2007 Cours de compilation 2 - Intranet
114
Cours de compilation 2 - Intranet
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c 21 septembre 2007 Cours de compilation 2 - Intranet
115
Cours de compilation 2 - Intranet
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c 21 septembre 2007 Cours de compilation 2 - Intranet
116
Cours de compilation 2 - Intranet
Troisième projection de Futamura L’équivalence fondamentale est instanciée par : Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Gen_Compil.c Int.o ( Ep.o ( Ep.c , Ep.c ) , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c Gen_Compil.o ( Int.c ) = Compilateur_Int.c 21 septembre 2007 Cours de compilation 2 - Intranet
117
Résumé ----------------------------------------------------------------
Résumons : Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Ep.c ) = Gen_Compil.c 21 septembre 2007 Cours de compilation 2 - Intranet
118
Cours de compilation 2 - Intranet
S Y N T H E S E 21 septembre 2007 Cours de compilation 2 - Intranet
119
Synthèse ----------------------------------------------------------------
Les trois projections de Futamura : Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Ep.c ) = Gen_Compil.c 21 septembre 2007 Cours de compilation 2 - Intranet
120
Synthèse ----------------------------------------------------------------
Les trois projections de Futamura : Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.c Ep.o ( Ep.c , Int.c ) = Compilateur_Int.c Ep.o ( Ep.c , Ep.c ) = Gen_Compil.c 21 septembre 2007 Cours de compilation 2 - Intranet
121
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
122
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
123
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
124
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
125
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) = Ep.o ( Ep.c , Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
126
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) = Ep.o ( Ep.c , Ep.c ) 21 septembre 2007 Cours de compilation 2 - Intranet
127
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) = Ep.o ( Ep.c , Ep.c ) = Gen_Compil.c 21 septembre 2007 Cours de compilation 2 - Intranet
128
Cours de compilation 2 - Intranet
Synthèse Remarquable : Gen_Compil.o ( Ep.c ) = Int.o ( Gen_Compil.c , Ep.c ) = Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c ) = Ep.o ( Ep.c , Ep.c ) = Gen_Compil.c 21 septembre 2007 Cours de compilation 2 - Intranet
129
Cours de compilation 2 - Intranet
Synthèse Quelques commentaires : 21 septembre 2007 Cours de compilation 2 - Intranet
130
Cours de compilation 2 - Intranet
Synthèse Quelques commentaires : Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure). 21 septembre 2007 Cours de compilation 2 - Intranet
131
Cours de compilation 2 - Intranet
Synthèse Quelques commentaires : Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure). De 1986 à 1995, construction de générateurs de compilateurs pour des langages fonctionnels. 21 septembre 2007 Cours de compilation 2 - Intranet
132
Cours de compilation 2 - Intranet
Synthèse Quelques commentaires : Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure). De 1986 à 1995, construction de générateurs de compilateurs pour des langages fonctionnels. Depuis, on fait de l’évaluation partielle de sous-ensembles de C . 21 septembre 2007 Cours de compilation 2 - Intranet
133
Cours de compilation 2 - Intranet
Synthèse Quelques commentaires : Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure). De 1986 à 1995, construction de générateurs de compilateurs pour des langages fonctionnels. Depuis, on fait de l’évaluation partielle de sous-ensembles de C . Parfois, on obtient des accélérations d’un facteur 100 et plus (synthèse d’images). 21 septembre 2007 Cours de compilation 2 - Intranet
134
Cours de compilation 2 - Intranet
Résumé Evaluation partielle et compilation 21 septembre 2007 Cours de compilation 2 - Intranet
135
Cours de compilation 2 - Intranet
C ’ e S t L a F i N ! ! ! b O n N e J o U r N é E ! ! ! 21 septembre 2007 Cours de compilation 2 - Intranet
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.