Orchestration d’activités Web avec HipHop Gérard Berry Chaire Algorithmes, machines et langages Collège de France Cours 7, 28 mai 2013
G. Berry, Collège de France 21/05/2013
G. Berry, Collège de France 21/05/2013
Que veut dire orchestrer? Avoir une vision logique unifiée des événements à traiter événements d’IHM chez le client événements provenant de services événements provenant d’objets sur le Web événements temporels événements engendrés par Hop Définir comment réagir au cours du temps à ces événements, en fonction de la mémoire des événements passés Eviter tous les problèmes de synchronisation de threads / event-listeners grâce à l’hypothèse synchrone Exactement l’objectif d’Esterel, mais en plus ambitieux : intégration dans Hop, récursivité, dynamicité, client / serveur, etc. G. Berry, Collège de France 21/05/2013
Méthode classique, Javascript / HOP (add-event-listener! ev (lambda (e) ...)) seulement si idle ev risque d’interférence: listener dans listener si listener compliqué ev (lambda (e) ...)) ... G. Berry, Collège de France 21/05/2013
L’approche synchrone machine réactive ev1 ev1 (lambda (x) ...)) 1515 réaction décidée ! code réactif séquence, parallélisme, communication, préemption synchrone, en temps conceptuellement nul G. Berry, Collège de France 21/05/2013
Précurseurs* Esterel, Lustre, Signal intégration dans l’environnement non précisée Machines d’exécution Esterel (C. André, D. Gaffé) ReactiveC, F. Boussinot : intégration dans C successeurs : Junior (Java), SugarCubes, FunLoft, etc. Reactive ML, L. Mandel : intégration dans CAML signaux comme valeurs de première classe récursivité, dynamicité, etc. Timed CCP, V. Saraswat : Intégration dans la programmation par contraintes parallèles contrôle beaucoup plus implicite *plus exactement : plagiats par anticipation G. Berry, Collège de France 21/05/2013
Evénements HipHop (class HipHopEvent ...) ;; similaire aux événements Esterel v7 Status de présence / absence, unique à chaque instant (now& s) ;; expression Hop (pre& s) valeur de type quelconque, unique à chaque instant (val& s) ;; expression Hop (preval& s) fonction de combinaison des valeurs émises simultanément (class CountEvent::HipHopEvent (status (default #f)) (init (default 0)) (op (default +))) G. Berry, Collège de France 21/05/2013
HipHop Noyau : constructeurs d’AST stmt : (nothing&) 0 (emit& event hop*) ! s(v) (atom& hop) (pause&) 1 (if& hop stmt stmt) s ? p, q (seq& stmt+) p ; q (loop& stmt+) p* (par& stmt+) p | q (suspend& event stmt+) s p (trap& trap-ident stmt+) { p } (exit& trap-ident) k, k 0 (local& (local-sig+) stmt+) s \ p G. Berry, Collège de France 21/05/2013
HipHop dérivé – définitions fonctionnelles (halt&) (sustain& event hop) (await& [ :immediate bool ] delay stmt*) (abort& [ :immediate bool ] delay stmt+) (until& [ :immediate bool ] delay stmt+) ;; weak abort (loop-each& delay stmt+) (every& [ :immediate bool ] delay stmt+) (define (sustain& event . hop-list) (loop& (emit& (cons event hop-list) (pause&))) construit en HOP l’AST de sustain& G. Berry, Collège de France 21/05/2013
Vraie fonction, pas macro ! (define (repeat& N::int stmt) ;; declare a fresh private Hop counter (let ((count::int N)) ;; install a mark to exit after N steps (trap& end ;; reset the local counter (atom& (set! count 0)) ;; loop forever (loop& ;; execute the user stmt stmt ;; decrement the Hop counter (atom& (set! count (+fx count 1))) (if& (= count 0) ;; the end, escape from the loop (exit& end)))))) Vraie fonction, pas macro ! G. Berry, Collège de France 21/05/2013
ABRO paramétrique en HipHop Emettre O dès que A et B sont arrivés Réinitialiser le comportement à chaque R // Esterel module module ABRO : input A, B, R; output O; loop { await A || await B }; emit O; each R end module ;; Hop function (define (ABRO& A B R O) (loop-each& (now& R) (par& (await& (now& A)) (await& (now& B))) (emit& O))) G. Berry, Collège de France 21/05/2013
Variante de ABRO A partir du premier R, émettre O dès que A et B sont arrivés arrêter tout si A et B en même temps (define (ABRObis& A B R O) (trap& Done (every& (now& R) (par& (await& (now& A)) (await& (now& B))) (emit& O) (if& (and (now& A) (now& B)) (exit& Done))))) G. Berry, Collège de France 21/05/2013
Modularité héritée de Hop (let ((s (instantiate::HipHopEvent))) (par& (emitter& s) (receiver& s))) (define (emitter& s) ... (emit& s) ...) (define (receiver& s) ... (await& s) ...) s G. Berry, Collège de France 21/05/2013
Instructions calculées (define (await-last-of-list& . sig-list) (par& (map await& sig-list))) (await-last-of-list& A B C) (par& (await& A) (await& B) (await& C)) Définition dynamique de comportements genpar&, dyngenpar& : calculer l’instruction dynamiquement au moment même de la réaction G. Berry, Collège de France 21/05/2013
Macro-définition de dyngenpar& (define-macro (dyngenpar& bindings :when condition . body) (let ((genpar-id (gensym))) `(let ((genpar (lambda () (genpar& ,bindings ,@body)))) (par& :id ,genpar-id (every& ,condition (hiphop-append-child! (current-machine) ,genpar-id (genpar)) (pause&)))))) G. Berry, Collège de France 21/05/2013
Machines d’exécution But : gère les événements d’entrée et de sortie But : déclenche la réaction sur appel externe A B :: int M P& : code HipHop B val& B X Y :: int Y val& Y (define M (instantiate::HipHopMachine (program P&))) G. Berry, Collège de France 21/05/2013
Machines d’exécution – entrées Appel de fonction hiphop-input! dans le code principal ou dans un event-handler A B :: int X Y :: int M P& : code HipHop B val& B Y val& Y (hiphop-input! M A) ... (hiphop-input! M B 1515) (hiphop-react!) (hiphop-input-and-react! M A) (hiphop-input-and-react! M B 1515) G. Berry, Collège de France 21/05/2013
Machines d’exécution - entrées Stratégies de gestion des entrées entre deux réactions A B :: int X Y :: int M P& : code HipHop B val& B Y val& Y A ARRÊT DEMANDÉ : un seul appui suffit à tourner le bit ... B Toc : on compte les Toc Toc Toc Toc (hiphop-input! M Toc 3) G. Berry, Collège de France 21/05/2013
Machines d’exécution Définition d’un event-listener pour chaque sortie appelé par M si le signal est émis A B :: int X Y :: int M P& : code HipHop B val& B Y val& Y (hiphop-add-event-listener! M X (lambda () (action) )) (hiphop-add-event-listener! M Y (lambda (V) (action V) )) G. Berry, Collège de France 21/05/2013
Retour à Manuel Serrano G. Berry, Collège de France 21/05/2013