21 septembre 2007cours de compilation 2 - intranet1 cours de compilation evaluation partielle...

135
21 septembre 2007 Cours de compilation 2 - Intranet 1 Cours de compilation Cours de compilation Evaluation partielle Evaluation partielle et et compilation compilation

Upload: renaud-tardy

Post on 03-Apr-2015

124 views

Category:

Documents


6 download

TRANSCRIPT

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 36

E X E M P L E SE X E M P L E S

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 118

S Y N T H E S ES Y N T H E S E

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

21 septembre 2007 Cours de compilation 2 - Intranet 135

C ’ e S t L a F i N ! C ’ e S t L a F i N ! ! !! !

b O n N eb O n N eJ o U r N é E ! ! !J o U r N é E ! ! !