Machines virtuelles fonctionnelles (suite)Compilation ML! JavaCours de A vancée (MI190)Benjamin CanouUniversité Pierre et Maire CurieAnnée 2010/2011 – Semaine 3. . . . . .Machines virtuellesfonctionnelles (suite). . . . . .La ZAM : machine fonctionnelle stricteSchéma dérivé de la machine de Krivine :I Le co rps d’une instruction commence pa r GRAB ,I comme les fonctions ont plusieurs a rguments, le co deressemble en fait à : [GRAB; n ;...;RETURN]argsI les a rguments sont passés sur la pile pa r les instructionsAPPLY{1,2,3} + compteur extra_argsI GRAB applique la fonction (évaluation stricte) si elle trouve lesa rguments nécessaires, sinon, elle crée une fermeture.. . . . . .La ZAM : application généraleComment s’exécute le p rogramme suivant ?# open Printf;;# let separe sep =let rec aux i str =if i < String.length str then (printf "%c%c" str.[i] sep ;aux (i + 1) str)inaux 0;;val separe : char -> string -> unit = # separe ',';;- : string -> unit = # separe ',' "toto";;t,o,t,o,- : unit = ()Grâce à CLOSURE , APPLY , GRAB et RETURN. . . . . .La ZAM : CLOSUREInstruct(CLOSURE): {int nvars = *pc++;int i;if (nvars > 0) *--sp = accu;Alloc_small(accu, 1 + nvars, Closure_tag);Code_val(accu) = pc + *pc;pc++;for (i = 0; i < nvars; i++) Field(accu, i + 1) = sp [i];sp += nvars;Next;}. . . . . .La ZAM : APPL YInstruct(APPLY2): {value arg1 = sp[0]; arg2 = sp[1];sp -= 3;sp[0] = arg1;sp[1] = arg2;sp[2] = (value)pc;sp[3] = ...
Schma driv de la machine de Krivine : Le corps d’une instruction commence parGRAB, comme les fonctions ont plusieurs arguments, le code ressemble en fait à :[GRAB;nargs;...;RETURN] les arguments sont passs sur la pile par les instructions APPLY{1,2,3}+ compteurextra args _ GRABfonction (valuation stricte) si elle trouve lesapplique la arguments ncessaires, sinon, elle cre une fermeture.
II
La
ZAM : application gnrale
Comment s’excute le programme suivant ?
# open Printf;;
# let separe sep = let rec aux i str = if i < String.length str then ( printf "%c%c" str.[i] sep ; aux (i + 1) str ) in aux 0;; val separe : char -> string -> unit = <fun>
# separe ',';; - : string -> unit = <fun>
# separe ',' "toto";; t,o,t,o, - : unit = ()
Grâce àCLOSURE,APPLY,GRABetRETURN
La
ZAM : CLOSURE
Instruct(CLOSURE): { int nvars = *pc++; int i; if (nvars > 0) *--sp = accu; Alloc_small(accu, 1 + nvars, Closure_tag); Code_val(accu) = pc + *pc; pc++; for (i = 0; i < nvars; i++) Field(accu, i + sp += nvars; Next; }
utilitaire dfinition des types de mini-ML analyseur lexical analyseur syntaxique le typeur environnement toplevel du typeur valuateur environnement de l’valuateur toplevel de l’valuateur environnement du traducteur un pseudo-lifting le traducteur vers un LI le traducteur LI vers java le compilateur complet l’analyseur de la ligne de commande