Vincent Ferries bio photo

Vincent Ferries

Apprenti artisan logiciel polyglotte

CV Email Twitter Github

Enfin un semblant de post technique. Avec même un peu de code inside.

Du nouveau pour Dart

On m’a posé une question mardi dernier lors d’un BBL que je donnais sur les WebComponents : pourquoi avais-je enlevé Dart de mes présentations dernièrement ? En effet, j’avais donné des ateliers sur les WebComponents basés sur Dart et Polymer un an auparavant, et cette fois j’avais fait le choix de le baser directement sur les spécifications “pures” en JavaScript.

Le fait est que je me suis beaucoup intéressé à JavaScript entre temps, apprenant à presque apprécier ses aspects tordus, et bluffé par la vitesse à laquelle le langage et tout ce qui est autour évoluent. J’avais de plus senti un petit désintéressement de la communauté autour de Dart.

AngularDart

Je tiens quand même à préciser que Dart reste soutenu par des personnes très respectables, notamment Eric Meijster 1, connu pour Haskell et les Reactive Extensions2. Il a servi dans sa prime jeunesse à tester de nouveaux concepts sur Angular-Dart qui ne pouvaient pas être implémentés dans l’équivalent JavaScript, et qui permettent par exemple d’éviter les boucles de vérification pour les bindings bidirectionnels avec ce qu’on appelle les observables notamment. Dart était à ce moment une sorte d’ES6 un peu plus évoluée.

Je m’attendais donc à ce que Dart soit la nouvelle base ou du moins le nouveau terrain de jeu pour Angular 2, c’était sans compter sur le partenariat passé entre les équipes d’Angular 2 et de TypeScript (Google + Microsoft, qui l’eût cru ?)3. La décision semble assez logique, ils ont juste eu la flemme d’implémenter complètement ce qu’ils avaient imaginé dans leur papier sur AtScript et ont préféré merger leur projet dans celui de Microsoft. Un langage de moins à apprendre donc.

Ou pas tant que ça en fait

Mais revenons un peu à nos moutons, Dart a donc été mis de côté bien avant, mais on a eu droit à une autre news encore plus fraîche dernièrement. Les équipes de développement qui bossent actuellement sur le langage abandonnent l’idée que la VM Dart (oui, Dart est suppposé être un langage qui tourne dans une VM) soit intégrée dans Chrome. Cela a deux implications majeures : Dart ne supplantera pas JavaScript dans nos navigateurs, on en était loin ceci dit mais en terme de performances c’était sympa, et les équipes vont pouvoir se concentrer pour faire en sorte que le code Dart compilé vers JavaScript soit bien plus performant.

Pour les simples développeurs comme moi, cela signifie surtout qu’il n’y a plus qu’un seul build à gérer, c’est moins chiant, mais cela signifie aussi qu’il rejoint la liste longue comme le bras des langages qui compilent vers JavaScript. Deuxième point important, TypeScript compilera vers JavaScript ET Dart 4.

Tout ceci étant posé, je prends quand même globalement tout ça comme une assez mauvaise nouvelle pour Dart, mais pas vraiment pire que ce qu’on savait déjà.

Il y a quand même encore des trucs cools

Cette annonce est sortie en même temps que la note de mise à jour de la version 1.9 du langage5. Celle-ci apporte le support des opérations async/await applicables aux générateurs. Pour certains cela doit ressembler à de l’hébreux. On parle là de fonctionnalités qui seront en fait implémentées dans Ecma Script 7. Jake Archibald, que j’adore pour sa capacité de vulgarisation, l’explique beaucoup mieux que moi dans ce post qui pour info date déjà de l’année dernière !

Vu que je suis un grand malade et que j’ai très envie de tester les capacités de coloration syntaxiques de mon blog, je vous mets ici mes premiers blocs de code. Comme vous allez vous en rendre compte tout de suite, ça marche super bien avec du code Dart sans même forcer ! Merci Pygments ! Voici en tout cas un petit exemple facile de code Dart avant et après l’utilisation des async/await.

Donc avant, on avait du code qui pouvait ressemble à ça :

Future<int> getCommitCount([String branchName = 'HEAD']) {
	return runCommand(['rev-list', '--count', branchName])
	    .then((ProcessResult pr) {
			return int.parse(pr.stdout);
    	});
}

Et maintenant, cela ressemblera plutôt à ça :

Future<int> getCommitCount([String branchName = 'HEAD']) async {
	var pr = await runCommand(['rev-list', '--count', branchName]);
	return int.parse(pr.stdout);
}

On se débarasse donc des vilains “then” chaînés avec les Futures, Promises et concepts du genre. En ce qui concerne la gestion des exceptions, on se retrouve avec nos blocs try/catch comme avant, mais on a pas à en mettre 15 comme avec les Futures, un seul suffit. La syntaxe est beaucoup plus déclarative et donc à mon sens beaucoup plus simple à relire et comprendre.

Pour ceux qui veulent aller plus loin, ça se passe ici.

PS :

Les inscriptions pour le cours d’Eric Meijster sur la programmation fonctionnelle ont repris et je vous le conseille plus que vivement (j’étais inscrit à l’édition précédente et c’est une tuerie), c’est sur edX que ça se passe cette fois !