Aller au contenu

Utilisateur:SCorbeil/Brouillon

Une page de Wikipédia, l'encyclopédie libre.

Introduction à MetaML[modifier | modifier le code]

MetaML est un langage de programmation à plusieurs phases utilisé surtout pour des métadonnées. Il a été créé en grande partie par Walid Taha et Tim Sheard à l’Oregon Graduate Institute, aidés par plusieurs autres personnes.

L’idée de base du MetaML était de développer un langage de programmation qui permettait à son utilisateur de combiner, d’évaluer et de construire des programmes avec un niveau d’abstraction plus élevé que la grande majorité des autres langages. Le but était également de permettre aux programmeurs d’écrire ces programmes plus abstraits sans trop avoir à modifier leurs habitudes acquises au cours de leur carrière.[1]

Langage « multi-phases »[modifier | modifier le code]

MetaML est considéré comme étant un langage « multi-phases ». Cela signifie qu’au lieu d’avoir les phases de programmation informatique se dérouler l’une après l’autre, comme par exemple la génération, suivie de la compilation et de l’exécution comme c’est le cas pour bien des langages, tout cela est fait dans un seul processus.

Un tel langage permet de programmer des solutions plus générales à des problèmes abstraits qui ne rajoutent pas nécessairement du temps d’analyse, comme c’est le cas lors de la génération d’un code informatique usuel.

MetaML est un langage qui ressemble beaucoup au SML, avec certains ajouts et modifications pour se concentrer sur la programmation multi-phases qui sont expliquées un peu plus loin.

Différentes caractéristiques nécessaires pour un langage à plusieurs phases[modifier | modifier le code]

MetaML a été construit pour être utilisé avec des programmes multi-phases et possède donc des caractéristiques bien particulières. Ces caractéristiques sont surtout pour s’assurer qu’il y ait une bonne communication entre les différentes phases du programme, de même que dans un souci de clarté pour d’éventuels lecteurs et collaborateurs.

Annotations explicites[modifier | modifier le code]

MetaML utilise quatre annotations explicites de phases, soit les parenthèses, Escape (~), Run et Lift.

Parenthèses[modifier | modifier le code]

Les parenthèses en MetaML permettent de créer du code qui est une représentation de ce que celles-ci contiennent. Cela sert à représenter la phase de génération dans un langage traditionnel. Par exemple, une expression (X) va créer du code représentant X.

Escape[modifier | modifier le code]

L’annotation Escape, représentée par le symbole (~), permet de séparer le code obtenu en évaluant une certaine expression à l’intérieur d’une plus grande expression entourée de parenthèses. Par exemple, une expression ~X va évaluer la valeur de X avant de faire celle de l’expression plus large dans laquelle X se trouve.

L’opérateur Escape possède la plus grande priorité lors des opérations.

Run[modifier | modifier le code]

L’annotation Run, écrite run, consiste à évaluer une certaine expression pour obtenir un morceau de code, puis d’évaluer le code venant d’être produit. Cela est semblable aux phases de génération et d’exécution dans des langages classiques. Par exemple, la syntaxe run X va créer du code pour l’expression X, puis va évaluer ce code.

L’opérateur Run possède la priorité la moins élevée lors des opérations, au même titre que l’opérateur Lift.

Lift[modifier | modifier le code]

L’annotation Lift, écrite lift, permet d’évaluer une certaine expression en une autre, puis de générer un morceau de code pour cette dernière. Par exemple, écrire lift X va évaluer X envers une certaine valeur Y, puis un code sera généré pour la valeur Y. La principale différence entre l’instruction Lift et les parenthèses est que Lift va évaluer le code qui est fourni, alors que les parenthèses ne font que créer du code.

Bien qu’il puisse sembler inutile d’avoir une annotation Lift dans un contexte où la persistance entre les phases existe, le but est d’avoir du code plus facile à lire et à comprendre en créant des constantes qui sont explicites.

Persistance entre les phases[modifier | modifier le code]

La persistance entre les différentes phases est l’un des éléments clés de MetaML et, selon ses créateurs, une propriété qui devrait être naturelle dans un tel langage. Il s’agissait pourtant, à l’époque de la création du langage, de quelque chose qui était absent de tous les autres langages considérés comme multi-phases. En résumé, la persistance entre les phases donne à un programmeur beaucoup de flexibilité dans son travail, en permettant l’usage de variables déclarés dans des stages précédents. En fait, en utilisant un « % » dans le code, il est possible de modifier une variable en une nouvelle constante utilisable plus tard lors d’un autre stage du programme.[1]

Sécurité entre les phases[modifier | modifier le code]

MetaML possède un certain niveau de sécurité pour éviter que les programmes ne soient organisés de manière irresponsable et illogique. La raison pour laquelle ce genre de sécurité est important réside dans le fait que certaines expressions qui seraient valides dans certaines phases dans un programme plus linéaire ne le sont pas nécessairement lorsqu’il s’agit de programmation multi-phases.

De plus, la sécurité entre les phases sera aussi enfreinte si on tente d’utiliser une variable dans une phase précédent la déclaration. Donc, si l’on déclare une variable dans un niveau d’abstraction supérieur et qu’on tente de l’utiliser dans un niveau inférieur, le langage ne nous permettra pas de le faire.[1]

Relation avec l’évaluation partielle[modifier | modifier le code]

L’évaluation partielle est une manière d’optimiser un programme en utilisant des informations partielles à propos des entrées du programme. En effectuant cela, il est possible d’identifier et d’effectuer le plus grand nombre de calculs dans un certain laps de temps. L’évaluation se fait habituellement en deux parties, soit le binding-time analysis(BTA) et la spécialisation. Le BTA permet de déterminer quels calculs peuvent être faits avant l’exécution d’un programme, en se fiant aux entrées statiques, ou constantes. En résumé, le BTA effectue la mise en phase automatique pour les entrées du programme. Par la suite, des données précises sont utilisées lors de la phase de spécialisation afin d'avoir une représentation réelle de la performance.[1]

Ce qui différencie l’évaluation partielle et la programmation à plusieurs phases, c’est le fait que la mise en phase n’est pas effectuée automatiquement, mais bien par le programmeur à même le langage (dans le cas du MetaML).[2] Les avantages d’une telle pratique sont expliqués dans la prochaine section.

Avantages de la mise en phase manuelle plutôt qu’automatique[modifier | modifier le code]

Compréhension[modifier | modifier le code]

L’utilisation de systèmes d’évaluation partielle est habituellement difficile à comprendre pour ceux qui l’utilisent et les nouveaux venus, surtout en raison du fait que le niveau d’abstraction est élevé et qu’il est difficile de s’en faire une représentation schématique[3]. La bonne compréhension du déroulement d’un tel système, des annotations qui le régissent et du résultat d’un BTA est critique pour bien se servir de ce type de système.

Le problème avec l’utilisation d’un BTA est qu’étant donné que le tout se fait automatiquement, les programmeurs peuvent arriver à comprendre ce qui est va être produit, mais ne sont pas nécessairement au courant de comment ils arrivent à ce résultat.

Avec l’utilisation de MetaML et ses annotations explicites, il est plus facile de comprendre ce qui se produit réellement, permettant ainsi aux programmeurs d’entreprendre avec un peu plus de facilité et de compréhension l’apprentissage des systèmes d’évaluation partielle.

Contrôler l’ordre d’évaluation[modifier | modifier le code]

L’ordre d’évaluation d’un programme est souvent primordial lorsque la performance est un enjeu important lors de la conception.

L’utilisation d’un BTA fait en sorte que l’ordre d’évaluation est déterminé par l’ordre des entrées du programme. Cependant, une analyse automatique comme celle-ci est incomplète et peut résulter en des performances qui ne sont pas optimales. Avec l’utilisation des annotations manuelles, de telles erreurs peuvent être évitées et servir à combler les failles d’une analyse automatique.

Contrôler l’arrêt du programme[modifier | modifier le code]

L’utilisation des annotations explicites permet au programmeur d’avoir un contrôle total sur les procédures d’arrêt d’un programme, au lieu de risquer de voir le programme s’arrêter subitement en raison d’une erreur lors de la spécialisation d’une évaluation partielle ou d’un protocole propre au BTA. Bien que ce genre d’erreur soit relativement rare, il est quand même préférable de ne pas avoir à s’en préoccuper.

Améliorations à venir[modifier | modifier le code]

Bien que ce programme amène des caractéristiques utiles pour l’écriture de programme à plusieurs stages, certains problèmes et améliorations seront étudiés, par exemple le fait que le langage, en annotant différentes copies d’un même programme, admets la spécialisation de variantes multiples, qui est un processus assez compliqué et pour lequel les créateurs tentent encore de trouver une solution assez simple pour être bien comprise.[1]

D’autres améliorations sont à prévoir, principalement au niveau de la sémantique du langage et de l’implémentation de certaines formulations abstraites.

Ces améliorations devraient faire du MetaML un langage plus complet et accessible même aux débutants de la programmation impliquant les métadonnées, leur donnant ainsi la chance de bien comprendre le fonctionnement de tels programmes avant d’utiliser des outils plus automatiques.

  1. a b c d et e (en) Walid Taha and Tim Sheard, MetaML and Multi-Stage Programming with Explicit Annotation, Oregon Graduate Institute, , p. 1-33
  2. (en) Charles Consel and Olivier Danvy, « Tutorial Notes on partial evaluation », ACM Symposium on Principles of Programming Languages,‎ , p. 493-501
  3. (en) Neil D. Jones, « Mix ten years later », In partial Evaluation and Semantics-based Program Manipulation,‎ , p. 24-38