ous avons présenté dans ce chapitre l'implantation d'Browser, en insistant sur les traits avancés liés au modèle de concurrence préemptive. Clairement, cee implantation n'est pas la plus optimisée (nous verrons des perspectives d'amélioration possibles au chapitre 6), mais le but de construire une plate-forme d'expérimentation de programmation eb client polyvalente est bien aeint. En e et, le point le plus important à retenir de ce chapitre, ainsi que des exemples du chapitre précédent, est qu'il est possible de s'abstraire du modèle classique de programmation du navigateur, au niveau du langage de base comme de la concurrence, et ce en permeant d'utiliser l'environnement du navigateur et les bibliothèques tierces existantes. Au chapitre suivant, nous continuerons sur cee voie, en montrant qu'il est possible d'interagir avec l'environnement du navigateur en utilisant un système de types statiques et un modèle objet di érent de celui de avacript.
4
Conception et implantation d'Browser
1function VM(url, argv) { 2 var program = load_program (url); 3 this.syms = /* ... */ 4 this.prims = /* ... */ 5 this.data = /* ... */ 6 this.status = VM_WAITING; 7 this.max_pid = 1; 8 this.ctx = { 9 cur_code : program.code, 10 pc : 0, 11 sp : 0, 12 trap_sp : -1, 13 accu : UNIT, 14 stack : [], 15 env : ATOM, 16 extra_args : 0, 17 status : RUN, 18 pid : this.max_pid++ 19 }; 20 this.ctx.n_ctx = this.ctx ; 21 this.ctx.p_ctx = this.ctx ; 22} 1VM.prototype.run = function () { 2 running_vm = this; 3 if (this.status != VM_RUNNING) { 4 this.status = VM_RUNNING; 5 var vm = this; 6 function sched_run () { 7 var t1 = (new Date ()).getTime (); 8 for (var i = 0;i < TIMEOUT_INTERVAL;i++) { 9 for (var j = 0;j < RESCHED_INTERVAL;j++) { 10 if (vm.ctx == null) break; 11 var c = vm.ctx; 12 if (c.status == GOT_RES) { 13 try { 14 c.accu = c.iocontinuation (); 15 c.status = RUN; 16 continue; 17 } catch (e) { 18 if (e == MAGIC_CAML_CONT) break; 19 if (e != MAGIC_CAML_EX) throw e; 20 break; 21 } 22 } else { 23 if (c.status != RUN) 24 /* SLEEP, WAIT & WAIT_RES */ 25 break; 26 } 27 if (! i_tbl [c.cur_code.get (c.pc++)] (vm, c)) { 28 break; 29 } 30 } 31 var t2 = (new Date ()).getTime (); 32 if (!vm.thread_yield ()) { 33 vm.status = VM_WAITING; 34 break; 35 } 36 if (t2 - t1 > TIMEOUT_STOP) { 37 t1 = t2; 38 break; 39 } 40 } 41 if (vm.status != VM_WAITING) 42 window.setTimeout (sched_run, 0); 43 } 44 sched_run (); 45 } 46 running_vm = null; 47}
4.2: Contexte d'exécution et boucles d'interprétation.
4Conception et implantation d'Browser
5
Inter-opérabilité des modèles objet
Au chapitre 2, nous avons présenté deux façons de faire interagir Caml et avacript dans Brow-ser au travers des deux . es deux approches ont en commun de se situer à un niveau très bas, celui de la représentation des données, et d'être e ectuées par le programmeur. Dans cee section, nous pré-sentons une interface de haut niveau entre les objet de avacript et Caml, automatisée et fondée sur les types.
Plusieurs travaux 8] 7] ont déjà été menés a n de faire cohabiter les modèles objets d'Caml et de langages à classes plus classiques. r, de nombreuses bibliothèques avacript utilisent un modèle ob-jet à classes à la ava implanté au dessus du modèle de avacript. ous avons donc naturellement voulu essayer d'appliquer les résultats de ces travaux pour utiliser ces bibliothèques Caml. Plus particuliè-rement, cee expérience a commencé lorsque nous avons essayé d'écrire un binding de la bibliothèque avacript oogle Closure ⚓72].
a technique qui en résulte, que nous présentons ici, permet e ectivement de binder une biblio-thèque utilisant un modèle à classes. ais elle va plus loin, en permeant d'exploiter le typage canard de avacript d'une part, et le typage des objets Caml d'autre part.
5.1 Rappels sur les modèles objets de JavaScript et OCaml
i une grande partie des travaux présentés ici peuvent s'appliquer au modèle à classes classique, certains points requièrent du lecteur une connaissance des spéci cités des modèles objet d'Caml et avacript. oici donc quelques rappels essentiels sur ces modèles pour le lecteur non spécialiste de l'un ou l'autre des langages.
Objets en JavaScript e modèle objet de avacript est un modèle à prototypes et est (d'après son créa-teur ⚓91]) repris du langage elf 32]. Concrètement, les objets sont des tables d'association extensibles entre des noms et des valeurs (les valeurs fonctionnelles jouant le rôle de méthodes). Chaque objet est de plus lié à un autre objet que l'on appelle son prototype. ors de la résolution d'un nom (appel d'une méthode ou accès à un champ), si l'objet lui-même ne dé nit pas le nom recherché, alors la recherche est e ectuée dans son prototype (et récursivement, les prototypes pouvant être chaînés).
En avacript, le programmeur peut dé nir de nouveaux types objets et modi er les prototypes associés à ces types. 'association entre un objet et son prototype est faite à sa création, et dépend de son type objet. es objets d'un même type partagent le même prototype, un peu comme les variables de classes des modèles objets à classes. ne présentation pratique avec un exemple des objets avacript est donnée dans l'annexe A.
Objets en OCaml e langage Caml n'est pas un langage à objets, mais un langage fonctionnel et impératif à la avec une extension objet. Ainsi, le modèle à objets d'Caml 49] cherche à donner les mêmes possibilités d'expression que les langages à objets (classes, héritage multiple, méthodes binaires, etc.) tout en restant dans l'esprit du polymorphisme paramétrique.
Contrairement aux langages à classes, le sous-typage n'est pas lié à l'héritage mais utilise la structure des types. Concrètement, les types objets ont la forme de types enregistrements extensibles : le type d'un objet est l'ensemble de ses méthodes (et les types associés). n objet est sous-type d'un autre si l'ensemble de méthodes du premier est inclus dans celui du second, et que les types associés aux méthodes du premier sont bien des sous-types de ceux des méthodes du second.
5
nter-opérabilité des modèles objet
Contrairement aux langages à classes, il est alors possible en Caml de dé nir deux classes dont les objets peuvent être interchangés sans problème, sans pour autant avoir à utiliser une relation d'héritage entre les deux. e lecteur pourra se référer à 59] pour une introduction aux objets en Caml. Modèle à classes simulé Comme le présentent les créateurs de elf, langage dont le modèle objet de avacript est issu, dans 51], le modèle à prototypes de avacript est su samment expressif pour simuler les mécanismes du modèle à classes. En pratique, beaucoup de bibliothèques avacript (ex. ⚓80], Prototype ⚓76]) simulent spéci quement le modèle de ava/.et, soit parce qu'il est mieux connu des programmeurs, soit pour homogénéiser avec du code serveur écrit dans ces langages. Cee simulation se fait en dé nissant sous forme de fonctions avacript des équivalents aux mots-clefs objet de ava (extends, instanceof, implements, super, etc.).
Typage canard (du typing) Comme l'exhibent les auteurs de yped-cheme 20], les program-meurs adeptes des langages dynamiques se restreignent en général à un sous-langage qui pourrait être accepté par un système de types statique. Dans ce cadre, le modèle objet à prototypes est très souple sur le système de types implicite utilisé par le programmeur. i, comme nous venons de le voir, les programmeurs avacript issus du monde à classes ont souvent tendance à penser dans ce dernier, le modèle le plus souvent utilisé par les programmeurs du monde dynamique est le typage canard.
elon le typage canard, un animal qui a des ailesfl un bec et qui fait "coin coin" est un canard. En d'autres termes : si, dans un contexte donné, un objet a toutes les caractéristiques qu'on lui demande, alors il est du bon type. En avacript cela se traduit par : si, pour un code donné, un objet dé nit tous les champs accédés et méthodes appelées par ce code, alors cet objet est du bon type. n peut étendre la dé nition en disant que le contenu des champs doit aussi correspondre à la structure demandée par le code (et récursivement). En fait, on peut dire que les types objets d'Caml sont une forme statique de typage canard.