21 septembre 2007Cours de compilation 2 - Intranet1 Cours de compilation Evaluation partielle etcompilation
21 septembre 2007Cours de compilation 2 - Intranet2 Les grandes lignes du cours Définitions de base Définitions de base Composition de compilateurs Composition de compilateurs Lenvironnement dun compilateur Lenvironnement dun compilateur Evaluation partielle et compilation Evaluation partielle et compilation Analyses lexicales et syntaxiques Analyses lexicales et syntaxiques Techniques danalyse descendantes Techniques danalyse descendantes Techniques danalyse ascendantes Techniques danalyse ascendantes YACC YACC Analyse sémantique Analyse sémantique Environnement dexécution Environnement dexécution Génération de code Génération de code Optimisation de code Optimisation de code
21 septembre 2007Cours de compilation 2 - Intranet3 I N T R O D U C T I O N
21 septembre 2007Cours de compilation 2 - Intranet4 Définitions de base Classiquement, on distingue entreClassiquement, on distingue entre –un 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 compilateur Il ne possède aucune donnée !Il ne possède aucune donnée ! Il nexécute rien du tout !Il nexécute rien du tout !
21 septembre 2007Cours de compilation 2 - Intranet5 Définitions de base Classiquement, on distingue entreClassiquement, on distingue entre –un 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) 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 lesquelles il a toutes les données et laisse tel quel le reste !Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! –un compilateur Il ne possède aucune donnée !Il ne possède aucune donnée ! Il nexécute rien du tout !Il nexécute rien du tout !
21 septembre 2007Cours de compilation 2 - Intranet6 Définitions de base Classiquement, on distingue entreClassiquement, on distingue entre –un 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) partiel Il possède toutes les données !Il possède toutes les données ! Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste !Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! –un compilateur Il ne possède aucune donnée !Il ne possède aucune donnée ! Il nexécute rien du tout !Il nexécute rien du tout !
21 septembre 2007Cours de compilation 2 - Intranet7 Définitions de base Classiquement, on distingue entreClassiquement, on distingue entre –un 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) partiel Il ne possède aucune donnée !Il ne possède aucune donnée ! Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste !Il exécute les parties du programme pour lesquelles il a toutes les données et laisse tel quel le reste ! –un compilateur Il ne possède aucune donnée !Il ne possède aucune donnée ! Il nexécute rien du tout !Il nexécute rien du tout !
21 septembre 2007Cours de compilation 2 - Intranet8 Définitions de base Un évaluateur partiel est donc unUn évaluateur partiel est donc un –outil hybride entre interprète et compilateur, –qui englobe les deux notions –et permet de construire automatiquement un compilateur en partant de son interprète ! La théorie en a été faite par Futamura en 1971: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 2007Cours de compilation 2 - Intranet9 Q U E L Q U E S N O T A T I O N S E T D E F I N I T I O N S
21 septembre 2007Cours de compilation 2 - Intranet10 Notations et définitions Pour un programme, nous distinguons entrePour un programme, nous distinguons entre –son code source, indiqué par le suffixe.c –son exécutable, indiqué par le suffixe.o prog.c prog.o prog.c prog.o Nous distinguons aussi entreNous distinguons aussi entre –les programmes unaires, indiqués par le 1 –les programmes binaires, indiqués par le 2 prog1.c prog2.o prog1.c prog2.o
21 septembre 2007Cours de compilation 2 - Intranet11 Notations et définitions Un interprète Int est un programme binaire dont les arguments sont :Un interprète Int est un programme binaire dont les arguments sont : –le texte source dun programme unaire Prog1.c –lunique donnée D de ce programme. Nous avons les propriétés suivantes :Nous avons les propriétés suivantes : Int.o ( Prog1.c, D ) = Résultat Int.o ( Prog1.c, D ) = Résultat Prog1.o ( D ) = Résultat Prog1.o ( D ) = Résultat
21 septembre 2007Cours de compilation 2 - Intranet12 Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont :Un évaluateur partiel Ep est un programme binaire dont les arguments sont : –le source dun programme binaire Prog2.c –la première donnée D1 de ce programme. Nous avons les propriétés suivantes :Nous avons les propriétés suivantes : Ep.o ( Prog2.c, D1 ) = Prog1.c Ep.o ( Prog2.c, D1 ) = Prog1.c On dit encore que le programme Prog2.c est « spécialisé » par rapport à la donnée D1 !On dit encore que le programme Prog2.c est « spécialisé » par rapport à la donnée D1 !
21 septembre 2007Cours de compilation 2 - Intranet13 Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont :Un évaluateur partiel Ep est un programme binaire dont les arguments sont : –le source dun programme binaire Prog2.c –la première donnée D1 de ce programme. Nous avons les propriétés suivantes :Nous avons les propriétés suivantes : Ep.o ( Prog2.c, D1 ) = Prog1.c Ep.o ( Prog2.c, D1 ) = Prog1.c Prog1.o ( D2 ) = Résultat Prog1.o ( D2 ) = Résultat Int.o ( Prog1.c, D2 ) = Résultat Int.o ( Prog1.c, D2 ) = Résultat Pour tout D2 :
21 septembre 2007Cours de compilation 2 - Intranet14 Notations et définitions Un évaluateur partiel Ep est un programme binaire dont les arguments sont :Un évaluateur partiel Ep est un programme binaire dont les arguments sont : –le source dun programme binaire Prog2.c –la première donnée D1 de ce programme. Nous avons les propriétés suivantes :Nous avons les propriétés suivantes : Ep.o ( Prog2.c, D1 ) = Prog1.c Ep.o ( Prog2.c, D1 ) = Prog1.c Prog1.o ( D2 ) = Résultat Prog1.o ( D2 ) = Résultat Prog2.o ( D1, D2 ) = Résultat Prog2.o ( D1, D2 ) = Résultat Pour tout D2 :
21 septembre 2007Cours de compilation 2 - Intranet15 E X E M P L E S
21 septembre 2007Cours de compilation 2 - Intranet16 Exemples Lévaluateur EpLévaluateur Ep –évalue les sous-expressions connues –et laisse les autres telles quelles. Lidée est la suivante :Lidée est la suivante : ( x + 3 ) * ( y – 4 ) ( x + 3 ) * ( y – 4 )plus le fait que x vaille 5 le fait que x vaille 5donne 8 * ( y – 4 ) 8 * ( y – 4 ) 5 8
21 septembre 2007Cours de compilation 2 - Intranet17 Exemples Ep.o ( Prog2.c, D1 ) = Prog1.c ( d1, d2 ) ( d1, d2 ) if ( d1 == 1 ) if ( d1 == 1 ) return( d1 + d2 ) return( d1 + d2 ) else else return( ( d1 * d1 ) + d2 ) return( ( d1 * d1 ) + d2 ) Peuvent être calculées : Faux 9 Il nous reste : ( d2 ) ( d2 ) return( 9 + d2 ) return( 9 + d2 )
21 septembre 2007Cours de compilation 2 - Intranet18 Exemples Ep.o ( Prog2.c, D1 ) = Prog1.c ( d1, d2 ) ( d1, d2 ) if ( d1 == d2 ) if ( d1 == d2 ) return( d1 * d2 ) return( d1 * d2 ) else else return( ( d1 * d1 ) ) return( ( d1 * d1 ) ) Peuvent être calculées : 9 Il nous reste : ( d2 ) ( d2 ) if ( 3 == d2 ) if ( 3 == d2 ) return( 3 * d2 ) return( 3 * d2 ) else else return( 9 ) return( 9 )
21 septembre 2007Cours de compilation 2 - Intranet19 Exemples Ep.o ( Prog2.c, D1 ) = Prog1.c ( d1, d2 ) ( d1, d2 ) if ( d1 == d2 ) if ( d1 == d2 ) return( d1 * d2 ) return( d1 * d2 ) else else return( ( d1 * d1 ) ) return( ( d1 * d1 ) ) Peuvent être calculées : 9 Il nous reste : Un humain aurait fait mieux avec un raisonnement conditionnel ! d2 vaut 3 ici !!! Le résultat vaut donc toujours 9 !!! ( d2 ) ( d2 ) return( 9 ) return( 9 )
21 septembre 2007Cours de compilation 2 - Intranet20 L A B A S E D E S P R O J E C T I O N S D E F U T A M U R A
21 septembre 2007Cours de compilation 2 - Intranet21 Léquivalence fondamentale Int.o ( Ep.o ( Prog2.c, D1 ), D2 ) = Res Léquivalence fondamentale est la suivante :Léquivalence fondamentale est la suivante : Prog2.o ( D1, D2 ) = Res Int.o ( Prog1.c, D2 ) = Res Prog1.o ( D2 ) = Res
21 septembre 2007Cours de compilation 2 - Intranet22 Lé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 Prog2.c, D1 et D2 !Les projections de Futamura sont des instances particulières de cette équivalence, avec des choix tout à fait particuliers pour Prog2.c, D1 et D2 ! Int.o ( Ep.o ( Prog2.c, D1 ), D2 ) = Res Prog2.o ( D1, D2 ) = Res Prog1.c Prog1.o ( D2 ) = Res
21 septembre 2007Cours de compilation 2 - Intranet23 P R E M I E R E P R O J E C T I O N D E F U T A M U R A
21 septembre 2007Cours de compilation 2 - Intranet24 Première projection de Futamura Léquivalence fondamentale est instanciée par :Léquivalence fondamentale est instanciée par : Int.o ( Ep.o ( Int.c, Prog1.c ), D ) = « Val » Int.o ( Prog1.c, D ) = « Val » Prog2.c = Int.c D1 = Prog1.c D2 = D Compile_Prog1.c Compile_Prog1.o ( D ) = « Val »
21 septembre 2007Cours de compilation 2 - Intranet25 Première projection de Futamura Pourquoi ?Pourquoi ? Int.c : ( P, D ) ( P, D ) case case 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 ! ! ! Lanalyse du programme est donc déjà réalisée ! ! ! Ce qui nest pas connu ! ! ! Lexécution du programme nest pas encore réalisée ! ! !
21 septembre 2007Cours de compilation 2 - Intranet26 Première projection de Futamura La première projection de Futamura donne doncLa première projection de Futamura donne donc –le texte source du code que linterprète aurait exécuté que linterprète aurait exécuté sil avait eu les données ! sil avait eu les données ! Nous obtenons un « compilateur interprétatif », cest-à-dire réalisé par inspection de linterprète :Nous obtenons un « compilateur interprétatif », cest-à-dire réalisé par inspection de linterprète : Comp_int.c = ( P ) Ep.o ( Int.c, P ) Comp_int.o ( Prog1.c ) = Compile_Prog1.c
21 septembre 2007Cours de compilation 2 - Intranet27 D E U X I E M E P R O J E C T I O N D E F U T A M U R A
21 septembre 2007Cours de compilation 2 - Intranet28 Deuxiè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 ( Ep.c, Int.c ), Prog1.c ) = Res Ep.o ( Int.c, Prog1.c ) = Res Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Prog2.c = Int.c D1 = Prog1.c D2 = D
21 septembre 2007Cours de compilation 2 - Intranet29 Deuxième projection de Futamura Léquivalence fondamentale est instanciée par :Léquivalence fondamentale est instanciée par : Int.o ( Ep.o ( Ep.c, Int.c ), Prog1.c ) = Compile_Prog1.c Ep.o ( Int.c, Prog1.c ) = Compile_Prog1.c Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c Compilateur_Int.c Compilateur_Int.o ( Prog1.c ) = Compile_Prog1.c
21 septembre 2007Cours de compilation 2 - Intranet30 T R O I S I E M E P R O J E C T I O N D E F U T A M U R A
21 septembre 2007Cours de compilation 2 - Intranet31 Troisiè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 ( Ep.c, Ep.c ), Int.c ) = Res Ep.o ( Ep.c, Int.c ) = Res Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Prog2.c = Ep.c D1 = Int.c D2 = Prog1.c
21 septembre 2007Cours de compilation 2 - Intranet32 Troisième projection de Futamura Léquivalence fondamentale est instanciée par :Léquivalence fondamentale est instanciée par : Int.o ( Ep.o ( Ep.c, Ep.c ), Int.c ) = Compilateur_Int.c Ep.o ( Ep.c, Int.c ) = Compilateur_Int.c Prog2.c = Ep.c D1 = Ep.c D2 = Int.c Gen_Compil.c Gen_Compil.o ( Int.c ) = Compilateur_Int.c
21 septembre 2007Cours de compilation 2 - Intranet33 S Y N T H E S E
21 septembre 2007Cours de compilation 2 - Intranet34 Synthèse Les trois projections de Futamura :Les trois projections de Futamura : Ep.o ( Ep.c, Int.c ) = Compilateur_Int.c Ep.o ( Int.c, Prog1.c ) = Compile_Prog1.c Ep.o ( Ep.c, Ep.c ) = Gen_Compil.c
21 septembre 2007Cours de compilation 2 - Intranet35 Remarquable :Remarquable : Synthèse 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 2007Cours de compilation 2 - Intranet36 Quelques commentaires :Quelques commentaires : –Cela fonctionne, mais nest pas très efficace (cf. loptimisation conditionnelle de tout à lheure). –De 1986 à 1995, construction de générateurs de compilateurs pour des langages fonctionnels. –Depuis, on fait de lévaluation partielle de sous- ensembles de C. –Parfois, on obtient des accélérations dun facteur 100 et plus (synthèse dimages). Synthèse