[Nitération 13] Nouvelles de décembre

16 views
Skip to first unread message

Jean Privat

unread,
Jan 5, 2015, 10:11:35 AM1/5/15
to nit...@googlegroups.com

Nous avons le plaisir de vous présenter le treizième numéro de « Nitération », la lettre d’information du projet Nit.

Les statistiques combinées pour le mois de décembre 2014 donnent:

$ git diff --shortstat v0.6.11..v0.7
488 files changed, 26959 insertions(+), 7788 deletions(-)
$ git log --first-parent v0.6.11..v0.7 | grep 'Pull-Request: #' | wc -l
92

Ont contribué (ou ont eu des patchs intégrés): Jean Privat, Alexandre Terrasa, Alexis Laferrière, Jean-Christophe Beaupré, Lucas Bajolet, Julien Pagès et Amine Ben Romdhane

Malgré la période des fêtes, ce mois de décembre 2014 fut le plus productif de l'histoire du projet Nit avec 92 Pull-Requests et 556 commits (soit une moyenne approximative de 3 PR et 18 commits par jour). Impressionnant.

Version 0.7

Il n'y a pas d'erreur dans les statistiques, cette Nitération marque bien la version 0.7 de Nit.

La série des versions 0.6 date de fin juillet 2013 et a marqué l'intégration du nouveau méta-modèle. Déjà un an et demi...

Dans ce laps de temps, les changements apportés au langage, aux outils, aux bibliothèques et aux projets de contrib ont été nombreux:

  • langage: annotations, projets, constructeurs, FFI.
  • bibliothèques Nit: template, pipeline, text/string/buffer, app.nit, neo4j, nitcorn, ai, markdown, saxophonit.
  • bibliothèques externes: curl, sqlite, mpi, regexp, threads.
  • plateformes: rasperry-pi, android, macosx, pnacl, emscripten.
  • outils: nitunit, nitlight, nitdoc, nitmetrics, nitls, nitvm, nitpretty, nitpick, nituml.
  • options cools: --mixin, --semi-global, --warning, --define.
  • contrib: nitcc, pep8analysis, shoot, dino, jwrapper, friendz, nitester, opportunity, nitiwiki.

L'incrément du numéro de version mineur sert à marquer une certaine stabilité dans le projet. Actuellement, les modifications sont de plus en plus nombreuses dans les répertoires lib/ et contrib/ par rapport à src/

La version 0.7 marque aussi la Pull Request numéro 1000 dédiée au renommage du compilateur nitg en nitc, terminant ainsi le cycle initié par la version 6.0. 056743f

0.7 marque enfin le début d'un nouveau cycle qui vise a rendre le langage et les outils réellement utilisables pour les programmeurs, peut-être vers une version 1.0...

Vers de meilleures entrées-sorties

La hiérarchie des flots est l'une des parties les plus anciennes du projet. En effet pour développer un compilateur, le besoin de base est de pouvoir lire des fichiers sources et produire des fichiers compilés.

Les API furent ainsi développées rapidement sans prendre grand soin de l'utilisabilité ou de la robustesse. De plus, leur age se faisait sentir car elles ont du passer à travers de nombreuses modifications du langage sans vraiment profiter au passage des améliorations.

Des travaux indépendants de Lucas, Alexis et Jean ont proposé un premier jet d'améliorations aux API.

Les manipulation des flots (Stream et sous-classes) est maintenant bien plus robuste. La gestion des erreurs se fait en encapsulant un état d'erreur potentiel dans l'objet flot et en passant dans un mode dégradé, au comportement défini, lorsque des erreurs d'entrée-sortie surviennent. Cela permet au programmeur de gérer simplement les entrées-sorties sans recourir à de la micro-gestion de codes de retour ou d'exceptions levées. 5589fb8

Un nouvelle classe Path réifie les chemins des fichiers. Utiliser des String pour représenter les chemins est une approche standard mais pose des problèmes de modélisation et de séparation des préoccupations. La classe Path permet d'encapsuler les services sur les chemins comme la récupération des méta-données (stat) ou l'ouverture en flots. 896de6a

Enfin la lecture ligne par ligne, une par une ou tout d'un coup, avec une gestion saine et portable des fins de lignes et fins de fichiers. Ainsi, les flots en entrée (IStream) gagent (ou améliorent) leur méthodes read_line (pour une ligne), read_lines (pour toutes les lignes) et each_line (pour un itérateur paresseux sur chaque ligne). Aussi, la classe Path encapsule les services de lecture sans devoir passer explicitement par la gestion des flots (ouverture et écriture). 453c292e9dcd52 et 8f4c9c1

Au final, l'exemple suivant illustre et combine les propositions de chacun, et permet à l'utilisateur de programmer facilement et robustement.

for line in "/etc/passwd".to_path.each_line do
   var fields = line.split(":")
   if fields.length > 2 then
      print "name={fields[0]} uid={fields[2]}"
   end
end

Vers une documentation parfaite

nitdoc, bien que développé anarchiquement propose déjà des fonctionnalités utiles qui cherchent à rendre les programmes et API les plus intelligibles possible.

Alexandre attaquera le travail sérieux en 2015, c'est pourquoi le terrain a commencé à être préparé et plusieurs petits bogues et irritants ont été corrigés. 01b16b796374045c90be9a21d5403a37c69cc3b51d8bd95518032cd7d42c480c2c775c65030b0 et 8f4fe4f

Hors ces mini améliorations, la nouveauté notable de ce mois est l'utilisation du vrai parseur markdown (lib/markdown) pour l'analyse et le rendu des commentaires de documentation. 605d9e3

L'outil neodoxygen de Jean-Christophe continue de s'améliorer et est capable de générer des modèles Nit à partir de programmes Java et Python de plus en plus compliqués. d47f98d158304535cdc3951bb80df94f7d87c31cc29ce3606 et 9b32fb7

Vu que l'auto-documentation doit documenter des choses, un effort a été donné pour améliorer la documentation des bibliothèques et des programmes. 085c79de6dd04fbec985925e22789177059e793d2d082dbd6 et aaeb306

D'ailleurs, le plugin syntastic pour vim traite maintenant les warnings de documentation comme des erreurs de style. b97b3ad

Vers un langage expressif

Les tableaux définis en compréhension sont un sucre syntaxique qui permettent de construire des tableaux littéraux grâce à des boucles et des sélections. f35b15f

Cela permet, dans plusieurs cas simples, d'éviter d'avoir une séquence de code avec un new (donc une déclaration de type). Cela permet aussi de répondre à la majorité des cas d'utilisation du map.

Ainsi, au lieu de

var my_coll
# ...
var a = new Array[String]
for i in my_coll do
   if i != null then a.add i.to_s
end
print a.join(", ")

On peut écrire

var my_coll
# ...
var a = [for i in my_coll do if i != null then i.to_s]
print a.join(", ")

Vers une machine virtuelle efficace

La VM de Nit, commencée il a 6 mois par Julien, a franchi l'étape de passer tous les tests de régression et devient donc un moteur d'exécution utilisable. f6e6633b862aec7b83aa7 et fca9ee0

La nouvelle option --vm de la commande nit permet d'activer la VM. En pratique, il n'y a pour l'instant aucun gain par rapport à l'interpréteur, mais les fondations se mettent en place, comme nettoyage de l'interpréteur (sur lequel se base la VM). 3fb37dd et 3c09117

Vers une meilleure portabilité

La FFI vers Objective-C nous ouvre les portes du monde des API OS X et iOS. 1d52804

D'ailleurs un job Jenkins s'exécutant sur une plateforme OS X est enfin installé ce qui nous permettra de prévenir les éventuelles régressions. Actuellement, un soixantaine de tests (sur plus de 1700) ne passent pas encore. e05b578

Vers un framework de développement de jeux vraiment multi-plateforme

Nouvelle bibliothèque pour SDL2.0. 7546ee5

Amélioration des bibliothèques graphiques (X11, SDL, OpenGLES2). 800e1a474ef062

Détection, lors de la compilation, des erreurs dans les shaders embarqués dans du code Nit. 8b1c481

Autres améliorations dans les bibliothèques

  • re: capture dans les expressions régulières (sous-expressions) 4afd7f8

  • csv: lecture, échappement et formatage des fichiers CSV. 00d4793

  • github: réification des concepts exposés par l'API github comme les branches et les commits. 455b21551f8da4 et d7e5988

  • json: système de stockage simple à base de json (JsonStore) et suppression de code inutilisé. a2089792632eff et 2323b17

  • ropes: correction de bogues. 05af881 et 5044836

  • poset: amélioration de to_dot53a0708

  • time: introduction de ISODate. 7759900

  • nitcorn: URI paramétrés et correction de bogues. f185670 et 8984be0

  • socket: grosse mise à jour avec correction de bogues. edc8f7f

  • array: optimisation de Array::add_all65f039e

  • gtk: ajout de classes et de méthodes. 206c9d2

Vers du code plus propre

C'est en activant la surveillance des warnings par Jenkins que l'on s'est rendu compte du nombre impressionnant qu'en contenait le code. La grande majorité concerne l'absence de documentation des entités publiques (voir plus haut), en second venaient les constructeurs old-style, les variables inutilisés et les types statiques superflus.

Un travail a été fait pour nettoyer le code et supprimer quelques centaines de warnings. 085c79ddcf885ee6dd04fbec9859969e147,25e22789177059e793d2d et 082dbd6

Un problème important restait que certains modules particuliers produisent trop de warnings : les modules générés (par sablecc ou nitcc par exemple) et les modules de tests unitaires. La solution proposée est l'introduction d'une annotation de module no_warning qui permet de désactiver certains warnings globalement dans un module. L'idée de cette annotation est d'être principalement utilisée par les générateurs de code Nit et non pas comme annotation de micro-gestion à la @supresswarningno_warning a permit de diminuer de plus de 2000 le total des warnings. f05d33e et 128c716

Au final, le nombre de warnings en décembre est passé d'environ 6000 à environ 3000. Les gros des warnings restant concerne la documentation manquante, surtout dans contrib et dans les modules d'interfaçage natif dans les bibliothèques.

Compilateur et autres outils

L'analyse des modules ne se fait plus nécessairement en silo. Cela permet aux outils qui le désirent de continuer à travailler même après avoir chargé un module qui contient des erreurs. Les outils nitlight et nitls en profite pour être plus robuste. cdb5912

Le chargeur de fichiers (loader) a été extrait de modelbuilder et expose publiquement les services utilisés par nitls. D'ailleursnitls a été amélioré pour être plus utilisable avec un meilleur comportement par défaut, affiche plus d'informations et utilise une sortie console en couleur. 8eeda5c

Plusieurs outils on été optimisés, en particulier certains services du modèle (qui profitent à tous), le compilateur séparé et nitunit. Ce dernier agglutine, quand c'est possible, les différents tests d'un module dans un seul exécutable. 2f67ac7628b204 et a83887f

Les services full_name et c_name on été généralisés dans MEntity. Cela rationalise et simplifie les clients du modèle qui en ont besoin. 6945411

nitpretty a été transformé en bibliothèque, ce qui permet aux outils qui le souhaitent de pouvoir générer du code Nit à partir d'AST.75b2d6f

Avec l'utilisation des nouvelles fonctionnalités du langage et l'étude sur la covariance, ce mois-ci apporte quelques corrections de bugs et ajout de détection d'erreurs. 93eb95ffd35e829efa21c9e5c78f527559f9801102 et d0b9ea2

nitester, le testeur de régression pour cluster s'améliore et devient encore plus rapide. Peut-être sera-t-il bientôt utilisé en production... 78d3bc2 et fb88cfd

Divers

Ajout de tâches dans Rosetta Code. 73c40f1 et 7cce1a8

Nouveau projet contrib/rss_downloader qui permet de télécharger automatiquement des fichiers en fonction de métadonnées indiquées dans des flux RSS, 160a9a0

Nouveau script changelog.sh pour aider à la rédaction des lettres d'information (itérations). ab43ef0

tests.sh: tait les grep dans les if31cdccd

Reply all
Reply to author
Forward
0 new messages