21 septembre 2007 Cours de compilation 2 - Intranet 1
Cours de compilationCours de compilation
Evaluation partielleEvaluation partielleetet
compilationcompilation
21 septembre 2007 Cours de compilation 2 - Intranet 2
Les grandes lignes du coursLes grandes lignes du cours
•Définitions de baseDéfinitions de base•Composition de compilateursComposition de compilateurs•L’environnement d’un compilateurL’environnement d’un compilateur•Evaluation partielle et compilationEvaluation partielle et compilation•Analyses lexicales et syntaxiquesAnalyses lexicales et syntaxiques•Techniques d’analyse descendantesTechniques d’analyse descendantes•Techniques d’analyse ascendantesTechniques d’analyse ascendantes•YACCYACC•Analyse sémantiqueAnalyse sémantique•Environnement d’exécutionEnvironnement d’exécution•Génération de codeGénération de code•Optimisation de codeOptimisation de code
21 septembre 2007 Cours de compilation 2 - Intranet 3
I N T R O D U C T I O NI N T R O D U C T I O N
21 septembre 2007 Cours de compilation 2 - Intranet 4
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
21 septembre 2007 Cours de compilation 2 - Intranet 5
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète
21 septembre 2007 Cours de compilation 2 - Intranet 6
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète
– un compilateurun compilateur
21 septembre 2007 Cours de compilation 2 - Intranet 7
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !
21 septembre 2007 Cours de compilation 2 - Intranet 8
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 9
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un évaluateur (interprète) partielun évaluateur (interprète) partiel
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 10
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un évaluateur (interprète) partielun évaluateur (interprète) partiel• Il possède une partie des données !Il possède une partie des données !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 11
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un évaluateur (interprète) partielun évaluateur (interprète) partiel• Il possède une partie des données !Il possède une partie des données !• Il exécute les parties du programme pour Il exécute les parties du programme pour
lesquelles il a toutes les données et laisse tel quel lesquelles il a toutes les données et laisse tel quel le reste !le reste !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 12
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un évaluateur (interprète) partielun évaluateur (interprète) partiel• Il possède Il possède toutes les données !toutes les données !• Il exécute les parties du programme pour Il exécute les parties du programme pour
lesquelles il a toutes les données et laisse tel quel lesquelles il a toutes les données et laisse tel quel le reste !le reste !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 13
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Classiquement, on distingue entreClassiquement, on distingue entre
– un interprèteun interprète• Il possède toutes les données !Il possède toutes les données !• Il exécute tout le programme !Il exécute tout le programme !
– un évaluateur (interprète) partielun évaluateur (interprète) partiel• Il Il nene possède possède aucune donnée !aucune donnée !• Il exécute les parties du programme pour Il exécute les parties du programme pour
lesquelles il a toutes les données et laisse tel quel lesquelles il a toutes les données et laisse tel quel le reste !le reste !
– un compilateurun compilateur• Il ne possède aucune donnée !Il ne possède aucune donnée !• Il n’exécute rien du tout ! Il n’exécute rien du tout !
21 septembre 2007 Cours de compilation 2 - Intranet 14
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel est donc unUn évaluateur partiel est donc un
– outil hybride entre interprète et outil hybride entre interprète et compilateur,compilateur,
21 septembre 2007 Cours de compilation 2 - Intranet 15
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel est donc unUn évaluateur partiel est donc un
– outil hybride entre interprète et outil hybride entre interprète et compilateur,compilateur,
– qui englobe les deux notionsqui englobe les deux notions
21 septembre 2007 Cours de compilation 2 - Intranet 16
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel est donc unUn évaluateur partiel est donc un
– outil hybride entre interprète et outil hybride entre interprète et compilateur,compilateur,
– qui englobe les deux notionsqui englobe les deux notions
– et permet de construire automatiquement et permet de construire automatiquement un compilateur en partant de son un compilateur en partant de son interprète !interprète !
21 septembre 2007 Cours de compilation 2 - Intranet 17
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel est donc unUn évaluateur partiel est donc un
– outil hybride entre interprète et compilateur,outil hybride entre interprète et compilateur,
– qui englobe les deux notionsqui englobe les deux notions
– et permet de construire automatiquement un et permet de construire automatiquement un compilateur en partant de son interprète !compilateur en partant de son interprète !
• La théorie en a été faite par Futamura en 1971:La théorie en a été faite par Futamura en 1971:
Les trois projections de Futamura.Les trois projections de Futamura.
21 septembre 2007 Cours de compilation 2 - Intranet 18
Définitions de baseDéfinitions de base----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel est donc unUn évaluateur partiel est donc un
– outil hybride entre interprète et compilateur,outil hybride entre interprète et compilateur,
– qui englobe les deux notionsqui englobe les deux notions
– et permet de construire automatiquement un et permet de construire automatiquement un compilateur en partant de son interprète !compilateur en partant de son interprète !
• La théorie en a été faite par Futamura en 1971:La théorie en a été faite par Futamura en 1971:
Les trois projections de Futamura.Les trois projections de Futamura.
• Les premières réalisations datent de 1986.Les premières réalisations datent de 1986.
21 septembre 2007 Cours de compilation 2 - Intranet 19
Q U E L Q U E SQ U E L Q U E S
N O T A T I O N SN O T A T I O N S
E T D E F I N I T I O N SE T D E F I N I T I O N S
21 septembre 2007 Cours de compilation 2 - Intranet 20
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Pour un programme, nous distinguons entrePour un programme, nous distinguons entre
– son code source, indiqué par le suffixe .cson code source, indiqué par le suffixe .c
prog.cprog.c
21 septembre 2007 Cours de compilation 2 - Intranet 21
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Pour un programme, nous distinguons entrePour un programme, nous distinguons entre
– son code source, indiqué par le suffixe .cson code source, indiqué par le suffixe .c– son exécutable, indiqué par le suffixe .oson exécutable, indiqué par le suffixe .o
prog.cprog.c prog.oprog.o
21 septembre 2007 Cours de compilation 2 - Intranet 22
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Pour un programme, nous distinguons entrePour un programme, nous distinguons entre
– son code source, indiqué par le suffixe .cson code source, indiqué par le suffixe .c– son exécutable, indiqué par le suffixe .oson exécutable, indiqué par le suffixe .o
prog.cprog.c prog.oprog.o
• Nous distinguons aussi entreNous distinguons aussi entre
– les programmes unaires, indiqués par le 1les programmes unaires, indiqués par le 1
prog1.cprog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 23
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Pour un programme, nous distinguons entrePour un programme, nous distinguons entre
– son code source, indiqué par le suffixe .cson code source, indiqué par le suffixe .c– son exécutable, indiqué par le suffixe .oson exécutable, indiqué par le suffixe .o
prog.cprog.c prog.oprog.o
• Nous distinguons aussi entreNous distinguons aussi entre
– les programmes unaires, indiqués par le 1les programmes unaires, indiqués par le 1– les programmes binaires, indiqués par le 2les programmes binaires, indiqués par le 2
prog1.cprog1.c prog2.o prog2.o
21 septembre 2007 Cours de compilation 2 - Intranet 24
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un interprète Un interprète IntInt est un programme binaire est un programme binaire
dont les arguments sont :dont les arguments sont :
21 septembre 2007 Cours de compilation 2 - Intranet 25
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un interprète Un interprète IntInt est un programme binaire est un programme binaire
dont les arguments sont :dont les arguments sont :
– le texte source d’un programme unaire le texte source d’un programme unaire Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 26
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un interprète Un interprète IntInt est un programme binaire est un programme binaire
dont les arguments sont :dont les arguments sont :
– le texte source d’un programme unaire le texte source d’un programme unaire Prog1.cProg1.c
– l’unique donnée l’unique donnée DD dede ce programme. ce programme.
21 septembre 2007 Cours de compilation 2 - Intranet 27
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un interprète Un interprète IntInt est un programme binaire est un programme binaire
dont les arguments sont :dont les arguments sont :
– le texte source d’un programme unaire le texte source d’un programme unaire Prog1.cProg1.c
– l’unique donnée l’unique donnée DD dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Int.o ( Prog1.c , D ) = RésultatInt.o ( Prog1.c , D ) = Résultat
21 septembre 2007 Cours de compilation 2 - Intranet 28
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un interprète Un interprète IntInt est un programme binaire est un programme binaire
dont les arguments sont :dont les arguments sont :
– le texte source d’un programme unaire le texte source d’un programme unaire Prog1.cProg1.c
– l’unique donnée l’unique donnée DD dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Int.o ( Prog1.c , D ) = RésultatInt.o ( Prog1.c , D ) = Résultat
Prog1.o ( D ) = RésultatProg1.o ( D ) = Résultat
21 septembre 2007 Cours de compilation 2 - Intranet 29
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
21 septembre 2007 Cours de compilation 2 - Intranet 30
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c
21 septembre 2007 Cours de compilation 2 - Intranet 31
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c– la première donnée la première donnée D1D1 dede ce programme. ce programme.
21 septembre 2007 Cours de compilation 2 - Intranet 32
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c– la première donnée la première donnée D1D1 dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 33
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c– la première donnée la première donnée D1D1 dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
• On dit encore que le programme On dit encore que le programme Prog2.cProg2.c est est « spécialisé » par rapport à la donnée « spécialisé » par rapport à la donnée D1D1 ! !
21 septembre 2007 Cours de compilation 2 - Intranet 34
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c– la première donnée la première donnée D1D1 dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
Prog1.o ( D2 ) = RésultatProg1.o ( D2 ) = Résultat
Int.o ( Prog1.c , D2 ) = RésultatInt.o ( Prog1.c , D2 ) = Résultat
Pour tout Pour tout D2D2 : :
21 septembre 2007 Cours de compilation 2 - Intranet 35
Notations et définitionsNotations et définitions----------------------------------------------------------------------------------------------------------------------------
----• Un évaluateur partiel Un évaluateur partiel EpEp est un programme est un programme
binaire dont les arguments sont :binaire dont les arguments sont :
– le source d’un programme binaire le source d’un programme binaire Prog2.cProg2.c– la première donnée la première donnée D1D1 dede ce programme. ce programme.
• Nous avons les propriétés suivantes :Nous avons les propriétés suivantes :
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
Prog1.o ( D2 ) = RésultatProg1.o ( D2 ) = Résultat
Prog2.o ( D1 , D2 ) = RésultatProg2.o ( D1 , D2 ) = Résultat
Pour tout Pour tout D2D2 : :
21 septembre 2007 Cours de compilation 2 - Intranet 37
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----• L’évaluateur L’évaluateur Ep Ep
– évalue les sous-expressions connuesévalue les sous-expressions connues– et laisse les autres telles quelles.et laisse les autres telles quelles.
21 septembre 2007 Cours de compilation 2 - Intranet 38
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----• L’évaluateur L’évaluateur Ep Ep
– évalue les sous-expressions connuesévalue les sous-expressions connues– et laisse les autres telles quelles.et laisse les autres telles quelles.
• L’idée est la suivante :L’idée est la suivante :
( x + 3 ) * ( y – 4 )( x + 3 ) * ( y – 4 )
plusplus
le fait que le fait que xx vaille vaille 55
21 septembre 2007 Cours de compilation 2 - Intranet 39
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----• L’évaluateur L’évaluateur Ep Ep
– évalue les sous-expressions connuesévalue les sous-expressions connues– et laisse les autres telles quelles.et laisse les autres telles quelles.
• L’idée est la suivante :L’idée est la suivante :
( x + 3 ) * ( y – 4 )( x + 3 ) * ( y – 4 )
plusplus
le fait que le fait que xx vaille vaille 55
donnedonne
8 * ( y – 4 )8 * ( y – 4 )
21 septembre 2007 Cours de compilation 2 - Intranet 40
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----• L’évaluateur L’évaluateur Ep Ep
– évalue les sous-expressions connuesévalue les sous-expressions connues– et laisse les autres telles quelles.et laisse les autres telles quelles.
• L’idée est la suivante :L’idée est la suivante :
( x + 3 ) * ( y – 4 )( x + 3 ) * ( y – 4 )
plusplus
le fait que le fait que xx vaille vaille 55
donnedonne
8 * ( y – 4 )8 * ( y – 4 )
5588
21 septembre 2007 Cours de compilation 2 - Intranet 41
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 42
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == 1 )if ( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
21 septembre 2007 Cours de compilation 2 - Intranet 43
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == 1 )if ( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
33
21 septembre 2007 Cours de compilation 2 - Intranet 44
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == 1 )if ( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
21 septembre 2007 Cours de compilation 2 - Intranet 45
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == 1 )if ( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
21 septembre 2007 Cours de compilation 2 - Intranet 46
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if if ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
21 septembre 2007 Cours de compilation 2 - Intranet 47
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if if ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
21 septembre 2007 Cours de compilation 2 - Intranet 48
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
21 septembre 2007 Cours de compilation 2 - Intranet 49
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( ( d1 * d1 ) + d2 )return( ( d1 * d1 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
21 septembre 2007 Cours de compilation 2 - Intranet 50
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) + d2 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
21 septembre 2007 Cours de compilation 2 - Intranet 51
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) + d2 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
99
21 septembre 2007 Cours de compilation 2 - Intranet 52
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) + d2 ) + d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
99
Il nousIl nousreste :reste :
21 septembre 2007 Cours de compilation 2 - Intranet 53
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) + d2 )+ d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
99
Il nousIl nousreste :reste :
21 septembre 2007 Cours de compilation 2 - Intranet 54
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
ifif ( d1 == 1 )( d1 == 1 )
return( d1 + d2 )return( d1 + d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) + d2 )+ d2 )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
FauxFaux
99
Il nousIl nousreste :reste :
(( d2 )d2 )
return(return( 99 + d2 )+ d2 )
21 septembre 2007 Cours de compilation 2 - Intranet 55
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( ( d1 * d1 ) )return( ( d1 * d1 ) )
21 septembre 2007 Cours de compilation 2 - Intranet 56
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( ( d1 * d1 ) )return( ( d1 * d1 ) )
33
21 septembre 2007 Cours de compilation 2 - Intranet 57
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( ( d1 * d1 ) )return( ( d1 * d1 ) )
3333
33
33
33 33
21 septembre 2007 Cours de compilation 2 - Intranet 58
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) ) )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
21 septembre 2007 Cours de compilation 2 - Intranet 59
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) ) )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
21 septembre 2007 Cours de compilation 2 - Intranet 60
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
( d1 , d2 )( d1 , d2 )
if ( d1 == d2 )if ( d1 == d2 )
return( d1 * d2 )return( d1 * d2 )
elseelse
return( return( ( d1 * d1 )( d1 * d1 ) ) )
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
21 septembre 2007 Cours de compilation 2 - Intranet 61
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
21 septembre 2007 Cours de compilation 2 - Intranet 62
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
(( d2 )d2 )
if (if ( 33 == d2 )== d2 )
return(return( 33 * d2 )* d2 )
elseelse
return(return( 99 ))
21 septembre 2007 Cours de compilation 2 - Intranet 63
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
Un humain auraitUn humain auraitfait mieux avec unfait mieux avec un
raisonnement conditionnel !raisonnement conditionnel !
21 septembre 2007 Cours de compilation 2 - Intranet 64
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
Un humain auraitUn humain auraitfait mieux avec unfait mieux avec un
raisonnement conditionnel !raisonnement conditionnel !
d2d2 vaut vaut 33 ici !!! ici !!!
21 septembre 2007 Cours de compilation 2 - Intranet 65
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
Un humain auraitUn humain auraitfait mieux avec unfait mieux avec un
raisonnement conditionnel !raisonnement conditionnel !
d2d2 vaut vaut 33 ici !!! ici !!!
Le résultat vautLe résultat vautdonc toujours donc toujours 99 !!! !!!
( d2 )( d2 )
return( return( 99 ) )
21 septembre 2007 Cours de compilation 2 - Intranet 66
ExemplesExemples----------------------------------------------------------------------------------------------------------------------------
----
Ep.o ( Prog2.c , D1 ) = Prog1.cEp.o ( Prog2.c , D1 ) = Prog1.c
(( d1 , d1 , d2 )d2 )
if (if ( d1 d1 == d2 )== d2 )
return(return( d1 d1 * d2 )* d2 )
elseelse
return(return( ( d1 * d1 )( d1 * d1 ) ))
3333
33
33
33 33
Peuvent êtrePeuvent êtrecalculées :calculées :
99
Il nousIl nousreste :reste :
Un humain auraitUn humain auraitfait mieux avec unfait mieux avec un
raisonnement conditionnel !raisonnement conditionnel !
d2d2 vaut vaut 33 ici !!! ici !!!
Le résultat vautLe résultat vautdonc toujours donc toujours 99 !!! !!!
( d2 )( d2 )
return( return( 99 ) )
21 septembre 2007 Cours de compilation 2 - Intranet 67
L A B A S EL A B A S E
D E SD E S
P R O J E C T I O N SP R O J E C T I O N S
D ED E
F U T A M U R AF U T A M U R A
21 septembre 2007 Cours de compilation 2 - Intranet 68
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
• L’équivalence fondamentale est la suivante :L’équivalence fondamentale est la suivante :
Prog2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 69
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
• L’équivalence fondamentale est la suivante :L’équivalence fondamentale est la suivante :
Prog2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 70
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
• L’équivalence fondamentale est la suivante :L’équivalence fondamentale est la suivante :
Prog2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
Int.o ( Int.o ( Prog1.cProg1.c , D2 ) = Res , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 71
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
• L’équivalence fondamentale est la suivante :L’équivalence fondamentale est la suivante :
Prog2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
Int.o ( Int.o ( Prog1.cProg1.c , D2 ) = Res , D2 ) = ResProg1.oProg1.o ( D2 ) = Res ( D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 72
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale plus précisément :L’équivalence fondamentale plus précisément :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = Res
Prog2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 73
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale plus précisément :L’équivalence fondamentale plus précisément :
Int.o ( Ep.o ( Int.o ( Ep.o ( Prog2.cProg2.c , , D1D1 ) , ) , D2D2 ) = ) = ResRes
Prog2.oProg2.o ( ( D1D1 , , D2D2 ) = ) = ResRes
Prog1.cProg1.c
Prog1.oProg1.o ( ( D2D2 ) = ) = ResRes
21 septembre 2007 Cours de compilation 2 - Intranet 74
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale plus précisément :L’équivalence fondamentale plus précisément :
Int.o ( Ep.o ( Int.o ( Ep.o ( Prog2.cProg2.c , , D1D1 ) , ) , D2D2 ) = ) = ResRes
Prog2.oProg2.o ( ( D1D1 , , D2D2 ) = ) = ResRes
Prog1.cProg1.c
Prog1.oProg1.o ( ( D2D2 ) = ) = ResRes
21 septembre 2007 Cours de compilation 2 - Intranet 75
L’équivalence fondamentaleL’équivalence fondamentale----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale plus précisément :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 Les projections de Futamura sont des instances particulières de cette équivalence, avec des choix tout à fait particuliers pour Prog2.cProg2.c , , D1D1 et et D2D2 ! !
Int.o ( Ep.o ( Int.o ( Ep.o ( Prog2.cProg2.c , , D1D1 ) , ) , D2D2 ) = ) = ResRes
Prog2.oProg2.o ( ( D1D1 , , D2D2 ) = ) = ResRes
Prog1.cProg1.c
Prog1.oProg1.o ( ( D2D2 ) = ) = ResRes
21 septembre 2007 Cours de compilation 2 - Intranet 76
P R E M I E R EP R E M I E R E
P R O J E C T I O NP R O J E C T I O N
D ED E
F U T A M U R AF U T A M U R A
21 septembre 2007 Cours de compilation 2 - Intranet 77
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 78
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 79
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Int.cInt.c , , Prog1.cProg1.c ) , ) , DD ) = Res ) = ResInt.oInt.o ( ( Prog1.cProg1.c , , DD ) = Res ) = Res
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 80
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Int.cInt.c , , Prog1.cProg1.c ) , ) , DD ) = « Val » ) = « Val »Int.oInt.o ( ( Prog1.cProg1.c , , DD ) = « Val » ) = « Val »
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 81
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Int.cInt.c , , Prog1.cProg1.c ) , ) , DD ) = « Val » ) = « Val »Int.oInt.o ( ( Prog1.cProg1.c , , DD ) = « Val » ) = « Val »
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 82
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Int.cInt.c , , Prog1.cProg1.c ) , ) , DD ) = « Val » ) = « Val »Int.oInt.o ( ( Prog1.cProg1.c , , DD ) = « Val » ) = « Val »
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
Compile_Prog1.cCompile_Prog1.c
Compile_Prog1.oCompile_Prog1.o ( ( DD ) = « Val » ) = « Val »
21 septembre 2007 Cours de compilation 2 - Intranet 83
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
21 septembre 2007 Cours de compilation 2 - Intranet 84
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
( P , D )( P , D ) casecase is_cst? ( P )is_cst? ( P ) return ( P )return ( P ) is_var? ( P )is_var? ( P ) return ( value ( P , D ))return ( value ( P , D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
21 septembre 2007 Cours de compilation 2 - Intranet 85
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
( P , D )( P , D ) casecase is_cst? ( P )is_cst? ( P ) return ( P )return ( P ) is_var? ( P )is_var? ( P ) return ( value ( P , D ))return ( value ( P , D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
21 septembre 2007 Cours de compilation 2 - Intranet 86
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
( ( PP , D ) , D ) casecase is_cst? ( P )is_cst? ( P ) return ( return ( PP ) ) is_var? ( P )is_var? ( P ) return ( value ( return ( value ( PP , D )) , D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 87
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
( ( PP , D ) , D ) casecase is_cst? ( P )is_cst? ( P ) return ( return ( PP ) ) is_var? ( P )is_var? ( P ) return ( value ( return ( value ( PP , D )) , D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
L’analyse du programmeL’analyse du programmeest donc déjà réalisée ! ! !est donc déjà réalisée ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 88
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
( ( PP , D ) , D ) casecase is_cst? ( P )is_cst? ( P ) return ( return ( PP ) ) is_var? ( P )is_var? ( P ) return ( value ( return ( value ( PP , D )) , D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
L’analyse du programmeL’analyse du programmeest donc déjà réalisée ! ! !est donc déjà réalisée ! ! !
Ce qui n’est pas connu ! ! !Ce qui n’est pas connu ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 89
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
(( PP , , D )D ) casecase is_cst? ( P )is_cst? ( P ) return (return ( PP )) is_var? ( P )is_var? ( P ) return ( value (return ( value ( PP , D )), D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
L’analyse du programmeL’analyse du programmeest donc déjà réalisée ! ! !est donc déjà réalisée ! ! !
Ce qui n’est pas connu ! ! !Ce qui n’est pas connu ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 90
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
(( PP , , D )D ) casecase is_cst? ( P )is_cst? ( P ) return (return ( PP )) is_var? ( P )is_var? ( P ) return ( value (return ( value ( PP , D )), D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
L’analyse du programmeL’analyse du programmeest donc déjà réalisée ! ! !est donc déjà réalisée ! ! !
Ce qui n’est pas connu ! ! !Ce qui n’est pas connu ! ! !L’exécution duL’exécution du
programme n’est pasprogramme n’est pasencore réalisée ! ! !encore réalisée ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 91
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• Pourquoi ?Pourquoi ?
Int.c :Int.c :
(( PP , , D )D ) casecase is_cst? ( P )is_cst? ( P ) return (return ( PP )) is_var? ( P )is_var? ( P ) return ( value (return ( value ( PP , D )), D )) is_add? ( P )is_add? ( P ) return ( add_int ( ... , ... ) )return ( add_int ( ... , ... ) ) ......
Ce qui est connu ! ! !Ce qui est connu ! ! !
L’analyse du programmeL’analyse du programmeest donc déjà réalisée ! ! !est donc déjà réalisée ! ! !
Ce qui n’est pas connu ! ! !Ce qui n’est pas connu ! ! !L’exécution duL’exécution du
programme n’est pasprogramme n’est pasencore réalisée ! ! !encore réalisée ! ! !
...... ............
21 septembre 2007 Cours de compilation 2 - Intranet 92
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• La première projection de Futamura donne La première projection de Futamura donne
doncdonc
– le texte source du codele texte source du code
que l’interprète aurait exécutéque l’interprète aurait exécuté
s’il avait eu les données !s’il avait eu les données !
21 septembre 2007 Cours de compilation 2 - Intranet 93
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• La première projection de Futamura donne La première projection de Futamura donne
doncdonc
– le texte source du codele texte source du code
que l’interprète aurait exécutéque l’interprète aurait exécuté
s’il avait eu les données !s’il avait eu les données !
• Nous obtenons un « compilateur Nous obtenons un « compilateur interprétatif », c’est-à-dire réalisé par interprétatif », c’est-à-dire réalisé par inspection de l’interprète :inspection de l’interprète :Comp_int.c = Comp_int.c = ( P ) Ep.o ( Int.c , P ) ( P ) Ep.o ( Int.c , P )
21 septembre 2007 Cours de compilation 2 - Intranet 94
Première projection de FutamuraPremière projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• La première projection de Futamura donne La première projection de Futamura donne
doncdonc
– le texte source du codele texte source du code
que l’interprète aurait exécutéque l’interprète aurait exécuté
s’il avait eu les données !s’il avait eu les données !
• Nous obtenons un « compilateur Nous obtenons un « compilateur interprétatif », c’est-à-dire réalisé par interprétatif », c’est-à-dire réalisé par inspection de l’interprète :inspection de l’interprète :Comp_int.c = Comp_int.c = ( P ) Ep.o ( Int.c , P ) ( P ) Ep.o ( Int.c , P )
Comp_int.o ( Prog1.c ) = Compile_Prog1.cComp_int.o ( Prog1.c ) = Compile_Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 95
RésuméRésumé----------------------------------------------------------------------------------------------------------------------------
----• Résumons :Résumons :
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.cEp.o ( Int.c , Prog1.c ) = Compile_Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 96
D E U X I E M ED E U X I E M E
P R O J E C T I O NP R O J E C T I O N
D ED E
F U T A M U R AF U T A M U R A
21 septembre 2007 Cours de compilation 2 - Intranet 97
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 98
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 99
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) = Res ) = ResEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 100
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
• La première projection pour comparaison :La première projection pour comparaison :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) = Res ) = ResEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 101
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
• La première projection pour comparaison :La première projection pour comparaison :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) = Res ) = ResEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
Prog2.c = Prog2.c = Int.cInt.c D1 = D1 = Prog1.cProg1.c D2 = D2 = DD
21 septembre 2007 Cours de compilation 2 - Intranet 102
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) = Res ) = ResEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 103
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) ) = Compile_Prog1.c= Compile_Prog1.cEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Compile_Prog1.c ) = Compile_Prog1.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 104
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) ) = Compile_Prog1.c= Compile_Prog1.cEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Compile_Prog1.c ) = Compile_Prog1.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 105
Deuxième projection de FutamuraDeuxième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Int.cInt.c ) , ) , Prog1.cProg1.c ) ) = Compile_Prog1.c= Compile_Prog1.cEp.oEp.o ( ( Int.cInt.c , , Prog1.cProg1.c ) = Compile_Prog1.c ) = Compile_Prog1.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
Compilateur_Int.cCompilateur_Int.c
Compilateur_Int.oCompilateur_Int.o ( ( Prog1.cProg1.c ) ) = Compile_Prog1.c= Compile_Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 106
RésuméRésumé----------------------------------------------------------------------------------------------------------------------------
----• Résumons :Résumons :
Ep.o ( Ep.c , Int.c ) = Compilateur_Int.cEp.o ( Ep.c , Int.c ) = Compilateur_Int.c
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.cEp.o ( Int.c , Prog1.c ) = Compile_Prog1.c
21 septembre 2007 Cours de compilation 2 - Intranet 107
T R O I S I E M ET R O I S I E M E
P R O J E C T I O NP R O J E C T I O N
D ED E
F U T A M U R AF U T A M U R A
21 septembre 2007 Cours de compilation 2 - Intranet 108
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
21 septembre 2007 Cours de compilation 2 - Intranet 109
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResInt.o ( Ep.o ( Prog2.c , D1 ) , D2 ) = ResProg2.o ( D1 , D2 ) = ResProg2.o ( D1 , D2 ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
21 septembre 2007 Cours de compilation 2 - Intranet 110
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) = Res ) = ResEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
21 septembre 2007 Cours de compilation 2 - Intranet 111
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
• La deuxième projection pour comparaison :La deuxième projection pour comparaison :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) = Res ) = ResEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 112
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
• La deuxième projection pour comparaison :La deuxième projection pour comparaison :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) = Res ) = ResEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Int.cInt.c D2 = D2 = Prog1.cProg1.c
21 septembre 2007 Cours de compilation 2 - Intranet 113
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) = Res ) = ResEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Res ) = Res
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
21 septembre 2007 Cours de compilation 2 - Intranet 114
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) ) = Compilateur_Int.c= Compilateur_Int.cEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Compilateur_Int.c ) = Compilateur_Int.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
21 septembre 2007 Cours de compilation 2 - Intranet 115
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) ) = Compilateur_Int.c= Compilateur_Int.cEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Compilateur_Int.c ) = Compilateur_Int.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
21 septembre 2007 Cours de compilation 2 - Intranet 116
Troisième projection de FutamuraTroisième projection de Futamura----------------------------------------------------------------------------------------------------------------------------
----• L’équivalence fondamentale est instanciée par :L’équivalence fondamentale est instanciée par :
Int.o ( Ep.o ( Int.o ( Ep.o ( Ep.cEp.c , , Ep.cEp.c ) , ) , Int.cInt.c ) ) = Compilateur_Int.c= Compilateur_Int.cEp.oEp.o ( ( Ep.cEp.c , , Int.cInt.c ) = Compilateur_Int.c ) = Compilateur_Int.c
Prog2.c = Prog2.c = Ep.cEp.c D1 = D1 = Ep.cEp.c D2 = D2 = Int.cInt.c
Gen_Compil.cGen_Compil.c
Gen_Compil.oGen_Compil.o ( ( Int.cInt.c ) ) = Compilateur_Int.c= Compilateur_Int.c
21 septembre 2007 Cours de compilation 2 - Intranet 117
RésuméRésumé----------------------------------------------------------------------------------------------------------------------------
----• Résumons :Résumons :
Ep.o ( Ep.c , Int.c ) = Compilateur_Int.cEp.o ( Ep.c , Int.c ) = Compilateur_Int.c
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.cEp.o ( Int.c , Prog1.c ) = Compile_Prog1.c
Ep.o ( Ep.c , Ep.c ) = Gen_Compil.cEp.o ( Ep.c , Ep.c ) = Gen_Compil.c
21 septembre 2007 Cours de compilation 2 - Intranet 119
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----• Les trois projections de Futamura :Les trois projections de Futamura :
Ep.o ( Ep.c , Int.c ) = Compilateur_Int.cEp.o ( Ep.c , Int.c ) = Compilateur_Int.c
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.cEp.o ( Int.c , Prog1.c ) = Compile_Prog1.c
Ep.o ( Ep.c , Ep.c ) = Gen_Compil.cEp.o ( Ep.c , Ep.c ) = Gen_Compil.c
21 septembre 2007 Cours de compilation 2 - Intranet 120
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----• Les trois projections de Futamura :Les trois projections de Futamura :
Ep.o ( Ep.c , Ep.o ( Ep.c , Int.cInt.c ) = ) = Compilateur_Int.cCompilateur_Int.c
Ep.o ( Int.c , Prog1.c ) = Compile_Prog1.cEp.o ( Int.c , Prog1.c ) = Compile_Prog1.c
Ep.o ( Ep.c , Ep.o ( Ep.c , Ep.cEp.c ) = ) = Gen_Compil.cGen_Compil.c
21 septembre 2007 Cours de compilation 2 - Intranet 121
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 122
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 123
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( = Int.o ( Gen_Compil.cGen_Compil.c , Ep.c ) , Ep.c )
= Int.o ( = Int.o ( Ep.o ( Ep.c , Ep.c )Ep.o ( Ep.c , Ep.c ) , Ep.c ) , Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 124
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 125
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )
= Ep.o ( Ep.c , Ep.c )= Ep.o ( Ep.c , Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 126
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )
= Ep.o ( Ep.c , Ep.c )= Ep.o ( Ep.c , Ep.c )
21 septembre 2007 Cours de compilation 2 - Intranet 127
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.o ( Ep.c )Gen_Compil.o ( Ep.c )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )
= Ep.o ( Ep.c , Ep.c )= Ep.o ( Ep.c , Ep.c )
= Gen_Compil.c= Gen_Compil.c
21 septembre 2007 Cours de compilation 2 - Intranet 128
• Remarquable :Remarquable :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
Gen_Compil.oGen_Compil.o ( ( Ep.cEp.c ) )
= Int.o ( Gen_Compil.c , Ep.c )= Int.o ( Gen_Compil.c , Ep.c )
= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )= Int.o ( Ep.o ( Ep.c , Ep.c ) , Ep.c )
= Ep.o ( Ep.c , Ep.c )= Ep.o ( Ep.c , Ep.c )
= = Gen_Compil.cGen_Compil.c
21 septembre 2007 Cours de compilation 2 - Intranet 129
• Quelques commentaires :Quelques commentaires :
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
21 septembre 2007 Cours de compilation 2 - Intranet 130
• Quelques commentaires :Quelques commentaires :
– Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure).Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure).
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
21 septembre 2007 Cours de compilation 2 - Intranet 131
• Quelques commentaires :Quelques commentaires :
– Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure).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.De 1986 à 1995, construction de générateurs de compilateurs pour des langages fonctionnels.
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
21 septembre 2007 Cours de compilation 2 - Intranet 132
• Quelques commentaires :Quelques commentaires :
– Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure).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.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 .Depuis, on fait de l’évaluation partielle de sous-ensembles de C .
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
21 septembre 2007 Cours de compilation 2 - Intranet 133
• Quelques commentaires :Quelques commentaires :
– Cela fonctionne, mais n’est pas très efficace (cf. l’optimisation conditionnelle de tout à l’heure).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.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 .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).Parfois, on obtient des accélérations d’un facteur 100 et plus (synthèse d’images).
SynthèseSynthèse----------------------------------------------------------------------------------------------------------------------------
----
21 septembre 2007 Cours de compilation 2 - Intranet 134
RésuméRésumé----------------------------------------------------------------------------------------------------------------------------
----
•Evaluation partielle et compilationEvaluation partielle et compilation