• Aucun résultat trouvé

Conclusion

Dans le document Programmation Web Typée (Page 70-73)

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, cee 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 aeint. 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 permeant d'utiliser l'environnement du navigateur et les bibliothèques tierces existantes. Au chapitre suivant, nous continuerons sur cee 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 avacript.

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 avacript 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 cee section, nous pré-sentons une interface de haut niveau entre les objet de avacript 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 avacript utilisent un modèle ob-jet à classes à la ava implanté au dessus du modèle de avacript. ous avons donc naturellement voulu essayer d'appliquer les résultats de ces travaux pour utiliser ces bibliothèques Caml. Plus particuliè-rement, cee expérience a commencé lorsque nous avons essayé d'écrire un binding de la bibliothèque avacript 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 permeant d'exploiter le typage canard de avacript 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 avacript. 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 avacript 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 avacript, 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 avacript 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 avacript est issu, dans  51], le modèle à prototypes de avacript est su samment expressif pour simuler les mécanismes du modèle à classes. En pratique, beaucoup de bibliothèques avacript (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. Cee simulation se fait en dé nissant sous forme de fonctions avacript 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 avacript 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 avacript 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.

Dans le document Programmation Web Typée (Page 70-73)

Documents relatifs