I. Avant de débuter : première expérience de speaker à Devoxx France 2013▲
Avoir un sujet retenu à Devoxx France a été pour moi une véritable joie, d'autant plus étant un speaker débutant. Si l'on m'avait dit il y a six mois que je serais à Devoxx devant plus d'une soixantaine de personnes, je ne l'aurais pas cru. Après des années de développement en autarcie complète, durant lesquels j'ai appris beaucoup de choses, j'ai découvert le monde communautaire et naturellement l'envie de transmettre mes centres d'intérêt (Dart dans le cas présent). Mais faire une présentation à un grand événement est aussi un défi. Le stress ressenti durant l'heure avant la présentation atteint un tel niveau que rien ne peut le faire disparaître. Et même s'il s'estompe lorsque l'on commence à parler, il reste présent tout au long. Les trente minutes de la présentation se sont écoulées à une vitesse folle, et pour être honnête, n'étant plus complètement moi-même je ne me souviens plus de grand-chose. Néanmoins, ce fut une expérience fantastique, me donnant l'envie de continuer dans ce sens. Et j'espère avoir de nouveau une telle opportunité dans le futur.
II. Dart, la présentation▲
Dart, le nouveau langage orienté Web de Google, a été dévoilé au monde en octobre 2011. Il se veut un langage structuré, non pas révolutionnaire, mais facile d'apprentissage pour tout développeur, quel que soit son background (C#, Java ou JavaScript) puisque Dart est un agrégat de ces trois langages avec d'autres, tel que Smalltalk. Ce nouveau langage a pour objectif d'être tout ce qu'aurait pu être JavaScript s'il avait été inventé aujourd'hui. En d'autres termes, garder la nature dynamique du JavaScript, tout en offrant un langage et des outils facilitant le développement de grosses applications.
III. Dart, la révolution▲
Dart étant encore jeune - la version 1 sera disponible courant de l'été 2013 -, il est difficile de dire s'il participera à la nouvelle révolution du Web. Cependant, nous pouvons applaudir la démarche de Google nous offrant une solution aux différentes problématiques actuelles du développement Web, notamment pour ceux à qui JavaScript donne des boutons, mais pas uniquement.
Dart s'inscrit dans une mouvance de nouveaux paradigmes Web tels que TypeScript, CoffeeScript ou encore Node.js. qui ont tous pour objectif de simplifier les développements.
Il est important de noter qu'avec Dart, Google n'a pas l'intention de casser le Web puisque l'un des prérequis de Dart est d'être compilable en JavaScript (grâce à l'outil dart2js), pour être utilisé dans tout navigateur Moderne (IE 6, 7, 8 et 9 étant donc exclus) ayant une Machine Virtuelle JavaScript compatible HTML5, mais pas de Machine Virtuelle Dart.
Dart faisant partie du projet Chrome, nous pouvons espérer voir apparaître une Machine Virtuelle Dart dans Chrome une fois la version 1.0 sortie.
IV. Le langage▲
Dart en quelques mots :
- Dart est un langage orienté objet avec un héritage simple, des classes concrètes et abstraites, des interfaces et des mixins ;
- Dart est optionnellement typé que ce soit dans l'assignation d'une variable ou la définition d'une fonction ;
- Dart est gouverné par des fonctions de haut niveau, c'est-à -dire des fonctions non encapsulées dans une classe ou un objet. Des fonctions encapsulées dans une classe ou un objet sont aussi appelées méthodes ;
- en Dart, les fonctions sont des objets, ce qui nous permet de les passer en paramètre de constructeurs ou de fonctions, mais aussi d'avoir des fonctions retournées par une autre fonction ;
- toute application a au moins une fonction de haut niveau, la fonction main()Â ;
- Dart permet d'utiliser des Generics.
Dart est par défaut mono processus à l'instar de JavaScript. Néanmoins, il a un modèle de concurrence appelé isolates, permettant une exécution parallèle avec un système de passage de messages. Lorsque compilés en JavaScript, ces isolates deviennent des Web Workers.
Différences majeures avec JavaScript :
- Dart n'utilise pas de prototypes ;
- Dart ne permet pas de créer et d'exécuter du code à la volée. Il n'y a ni de fonction eval(), ni de possibilité de monkey patching. Seuls les isolates permettent d'exécuter du code dynamiquement dans ce que j'appellerai une architecture orientée plugins.
V. L'écosystème▲
Dart n'est pas seulement un langage, c'est une plateforme de développement qui comprend :
- un SDK avec une VM serveur ;
- un IDE (DartEditor), mais aussi des plugins pour Eclipse et IntelliJÂ ;
- une VM cliente (Dartium)Â ;
- un outil de gestion des dépendances (Pub Package Manager) ;
- un compilateur Dart vers JavaScript (dart2js)Â ;
- un générateur de documentation à partir du code (dartdoc) :
VI. Dart Editor▲
Dart Editor est basé sur Eclipse Rich Client Platform (RCP), un framework permettant de créer facilement des IDE. Par conséquent, son aspect est très similaire à Eclipse. En revanche, ne vous attendez pas aux mêmes fonctionnalités qui se limitent à une autocomplétion (sommaire), une analyse de code statique montrant erreurs et warnings, et une navigation facilitée entre les fichiers, classes, méthodes, etc.
Il est bien sûr possible d'exécuter le code avec ou sans debug, ou bien de le convertir en JavaScript.
À l'heure où j'écris ces lignes, et ceci depuis un certain temps, Dart Editor a d'énormes problèmes de performance. De plus, à mon plus grand regret les versions se suivent et se ressemblent, puisqu’outre les problèmes de performances qui tardent à être corrigés, les nouvelles fonctionnalités se font très discrètes.
Néanmoins, ceci n'est pas très important puisqu'il existe des plugins pour IntelliJ, Eclipse, Sublime Text 2 et Vim. Et bien sûr pour les personnes Old School, un simple éditeur de texte répond à la majorité des besoins et situations.
VII. Les Machines Virtuelles▲
Les Machines Virtuelles (VM) Dart sont le cœur du langage. Il en possède deux pour des usages différents. La première (VM Serveur) permet d'exécuter une application côté serveur en ligne de commande dans une console. La seconde (VM Client) est embarquée dans un navigateur tel que Dartium, comme nous le verrons dans le point suivant, au même titre que la Machine Virtuelle JavaScript. Ceci permet d'avoir la partie cliente et la partie serveur d'une application codée dans le même langage.
L'unique différence entre ces deux versions est leurs bibliothèques. La VM Serveur contient la bibliothèque dart:io, qui permet d'effectuer les opérations d'entrée/sortie habituelles (manipulation de fichiers, sockets, etc.). La VM Cliente contient la bibliothèque dart:html, permettant de manipuler le DOM (tags, events, etc.).
Cette distinction est nécessaire pour des raisons de sécurité évidentes concernant la bibliothèque dart:io. En revanche, bien que compréhensible, l'absence de la bibliothèque dart:html de la VM Serveur rend compliqué, - mais pas impossible -, l'exécution en ligne de commande de tests unitaires validant du code utilisant cette library.
Pour exécuter des tests unitaires de classes utilisant la bibliothèque dart:html, il faut utiliser Dartium, ce qui est déconcertant, voire un problème pour l'industrialisation.
VIII. Dartium▲
Dartium est une version modifiée de Chomium (la version open source de Chrome), avec une Machine Virtuelle Dart embarquée.
Il reconnaît la balise <script type=« application/dart » …> et exécute le code Dart dans le navigateur sans avoir à le convertir en JavaScript.
Le fait d'avoir une Machine Virtuelle cliente est le vrai point fort de Dart. Aujourd'hui, hormis le JavaScript tous les autres langages ont besoin d'être compilés avant d'être exécutés dans un navigateur. Et même si seulement un nombre infime de navigateurs auront une Machine Virtuelle Dart, c'est une avancée pour la phase développement, permettant une productivité accrue, en considérant qu'une fois implémentée dans tous les navigateurs, le HTML5 permettra un comportement standard.
IX. dart2js▲
dart2js permet de compiler du Dart en JavaScript (compatible HTML5 uniquement), depuis Dart Editor ou en ligne de commande.
dart2js compile toutes les sources de votre application, ainsi que les bibliothèques utilisées, en un seul fichier JavaScript.
Par défaut, le code n'est pas minifié. Pour ce faire, il suffit d'ajouter l'option --minify.
À noter qu'avant compilation, après construction de l'Abstract Syntax Tree du code, toutes les branches non utilisées (code mort ou fonctionnalités d'une bibliothèque non utilisées dans notre application) sont élaguées ce qui permet de réduire considérablement la taille du code généré. Ce mécanisme est connu sous le nom Tree Shaking.
X. pub▲
La gestion de dépendances (bibliothèques) est une fonctionnalité indispensable pour tout langage, de Java à Maven, .NET à NuGet et Node.js à npm. Dart a donc appelé le sien pub. Dans un fichier pubspec.yaml, sont indiquées différentes informations sur l'application, mais aussi les bibliothèques utilisées, ainsi que leur version (toutes les versions, seulement une ou un intervalle).
name: pacifista_rocks
description: The best application in the whole world
version: 0.0.1
dependencies:
great_lib: any
À l'aide de pub, il est aussi possible de publier son code sur GitHub, BitBucket ou pub.dartlang.org.
Nous regretterons que Pub soit basé sur une architecture monolithique ne permettant pas aux utilisateurs d'ajouter des plugins comme pour Maven, mais aussi que la refonte – interminable – de l'API de Dart soit un frein à son évolution.
Sous Windows XP pub ne fonctionne pas.
XI. dartdoc▲
dartdoc permet de générer une documentation au format HTML à partir des commentaires présents dans le code.
Un commentaire de type doc est identifié par un triple slash (///) ou slash étoile-étoile + étoile slash (/** */).
/// This is a Dart doc
/**
* And here another Dart doc
*/
void
main
(
) {
print
(
"Dart"
);
}
La documentation générée aura la même forme que celle de la documentation de l'API Dart.
XII. Conclusion▲
Dart est clairement une bonne idée. Le fait d'avoir un langage structuré et orienté objet, accompagné d'une Machine Virtuelle cliente est une avancée dans la recherche de productivité. En revanche, Google frôle la ligne rouge ! Si un effort sur la qualité de l'API et des outils n'est pas fait dans les prochains mois, donnant un signal de confiance aux early adopters, nous pouvons émettre des doutes quant à son futur. De plus, de nombreuses voix commencent à s'élever en raison de l'absence d'une bibliothèque de widgets à la sortie de la version 1.0, réduisant Dart à un simple langage avec une API extrêmement basique, et par conséquent inutilisable dans le monde de l'entreprise.
Si Dart ne prend pas une longueur d'avance, l'ECMAScript 6 pointant le bout de son nez, son intérêt sera plus que discutable. De plus, en partant du principe que tous les navigateurs implémenteront cette nouvelle version de JavaScript, à fonctionnalité équivalente, un langage ne nécessitant pas d'être compilé aura généralement la préférence des développeurs.
Nous pouvons aussi nous poser la question de la pertinence de continuer à utiliser un langage impératif pour faire du Web. Des langages basés sur le FRP (Functional Reactive Programming) tels que Elm, offrent une voie intéressante méritant toute notre attention.
XIII. Remerciements▲
Cet article a été publié avec l'aimable autorisation de la société SoatSoat.
Nous tenons à remercier zoom61 pour sa relecture orthographique attentive de cet article et Mickael Baron pour la mise au gabarit.