lundi 8 octobre 2012

Microsoft dévoile le TypeScript, évolution de JavaScript

 

Microsoft dévoile le TypeScript, évolution de JavaScript

Image utilisateur
Microsoft a annoncé un nouveau langage de programmation, le TypeScript. Ce langage, qui est transformé en JavaScript par son compilateur, a pour but de simplifier la création de "grandes" applications Web telles que des suites bureautiques comme Google Docs ou Office Web Apps.

Un peu d'histoire

Image utilisateur

Quand Brendan Eich, programmeur habitué à la création de langages de programmation, est engagé chez Netscape en 1995, on lui demande de créer un langage de script simple en 10 jours. Le but est de concurrencer Microsoft et son Visual Basic pour offrir un langage facile à prendre en main pour les débutants. Eich s'exécute et produit LiveScript, un langage simple qui ne ressemble volontairement pas à Java. En effet, Java et sa programmation orientée objet est considéré comme un langage avancé fait pour les programmeurs confirmés. Mais Brendan Eich n'apprécie pas les contraintes qui lui ont été imposées. Il décide d'ajouter des fonctionnalités qui permettront aux programmeurs avancés de faire plus que de simples scripts.

À sa sortie, le langage est renommé JavaScript afin de le positionner comme étant la version simple de Java, avec l'accord de Sun Microsystems. En réponse, Microsoft adopte le langage dans la version 3 de son célèbre navigateur Internet Explorer mais est contraint de le renommer JScript car JavaScript est une marque déposée. Comme le langage n'est pas réellement un standard, les deux titans du monde des navigateurs y ajoutent leurs extensions propriétaires, comme par exemple des nouvelles méthodes de gestion de l'année ajoutées par Microsoft pour éviter le bug de l'an 2000.


En 1996, Netscape propose le langage à l'Ecma International, comité privé de standardisation. Le résultat est l'ECMAScript, nom "officiel" du JavaScript encore en usage aujourd'hui. C'est le début d'une longue évolution de la bibliothèque standard du langage, qui gagnera en fonctionnalités avec des nouvelles librairies comme l'AJAX ("Asynchronous Javascript And XML" ou "Javascript et XML asynchrones" en français) qui permet de dialoguer avec un serveur depuis JavaScript et donc de ne pas avoir à recharger la page pour changer son contenu.

L'ECMAScript inspirera d'autres langages comme l'ActionScript utilisé par Adobe dans Flash.

De nos jours, il existe des myriades de librairies JavaScript comme
jQuery ou Prototype et même des moyens de faire tourner du JavaScript en dehors d'un navigateur, comme node.js qui permet de programmer des serveurs en JavaScript. Mais le langage en lui-même n'a que peu évolué ; sa syntaxe est toujours la même, celle d'un langage de script basique avec des fonctionnalités avancées. JavaScript n'est pas du tout prévu pour l'utilisation qui en est faite aujourd'hui, celle d'un langage industriel avec lequel on programme des suites bureautiques et même des jeux vidéos. Les outils de développement s'améliorent, mais il reste difficile d'analyser du code faiblement typé pour éviter les erreurs.

Google a déjà essayé sans grand succès de remplacer JavaScript par Dart, un langage ressemblant au JavaScript mais non compatible. CoffeeScript, un langage communautaire variant beaucoup du JavaScript, a également essayé mais reste inconnu de la plupart des développeurs.


Entre Microsoft avec TypeScript...


Qu'est-ce que TypeScript ?

Image utilisateur

Ce langage a été créé par une équipe menée par Anders Hejlsberg. Si vous avez fait du .NET, son nom devrait vous dire quelque chose : c'est l'architecte du C#. Il a aussi créé le Turbo Pascal et le Delphi. C'est donc un habitué des langages de programmation.

TypeScript est un sur-ensemble strict du JavaScript ; tout code JavaScript valide est aussi un code TypeScript valide. Cela facilite la transition puisqu'il n'y a pas besoin de tout réécrire. Mais cela ne veut pas dire que les modifications sont mineures, bien au contraire.


Les ajouts les plus importants sont la programmation orientée objet et le typage statique. Ce sont deux fonctionnalités courantes dans les langages de programmation, mais inconnues en JavaScript.


En JavaScript, il est courant de voir ce genre de code :

Code : JavaScript - Sélectionner
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
var Point = (function () {
    function Point(x, y) {
        this.x = x;
        this.y = y;
    }
    Point.prototype.distanceFromOrigin = function () {
        return Math.sqrt(this.x * this.x + this.y * this.y);
    };
    return Point;
})();

Ce code déclare une "classe" Point en profitant de la programmation orientée prototype. Mais ce n'est pas très clair ; la classe est en fait une fonction qui possède des attributs... voici l'équivalent en TypeScript :
Code : JavaScript - Sélectionner
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
// TypeScript
class Point {
 x : number;
 y : number;
 
 constructor(x, y) {
  this.x = x;
  this.y = y;
 }
 
 distanceFromOrigin() {
  return Math.sqrt(this.x*this.x + this.y*this.y);
 }
}

C'est déjà bien mieux. On voit clairement que c'est une classe avec deux membres X et Y de type Number, un constructeur et une méthode. Sachez que ce code TypeScript, une fois compilé, devient du JavaScript comme l'exemple précédent. (en fait, l'exemple précédent a été généré à partir de ce code TypeScript)

Ce n'est pas tout ! TypeScript apporte aussi une fonctionnalité que les amateurs de langages fonctionnels connaissent bien, l'inférence de type. Le compilateur peut "deviner" le type d'une expression selon son contexte. Ainsi, les trois variables suivantes :

Code : JavaScript - Sélectionner
1
2
3
4
// TypeScript
var n = 5;
var s = "Hello";
var b = true;

sont respectivement un Number, un String et un Boolean. Cet exemple est simple, mais on peut faire beaucoup plus compliqué :
Code : JavaScript - Sélectionner
1
2
3
4
5
6
// TypeScript
var button = document.createElement("button");
button.innerText = "Exemple";
button.onclick = e => {
 alert(e.clientX.toString());
}

Dans la dernière instruction, on associe à button.onclick une fonction lambda qui affiche un pop-up avec la position horizontale de la souris. En fait, la variable e n'est pas juste un objet, c'est un MouseEvent car la signature de onclick le veut. Si par erreur le développeur écrit e.cliientX, le compilateur TypeScript provoquera une erreur de compilation car cette propriété n'existe pas. De même, l'appel à toString() est obligatoire car la signature de la méthode alert demande un String, or clientX est un Number.

En TypeScript, les types sont indiqués par des annotations de type qui font partie intégrante du langage et qui sont respectées par le compilateur. Certaines librairies comme Closure de Google annotent les types dans les commentaires, mais ce n'est pas très pratique ni pour le développeur ni pour le compilateur (qui doit regarder les commentaires...).

Si le compilateur ne peut rien déduire, le type Any est utilisé. Ce type est équivalent aux objets JavaScript ; on ne sait rien de l'objet et tout peut être utilisé (propriétés, méthodes, ...) sans vérification de la part du compilateur.

Il existe beaucoup d'autres fonctionnalités dans TypeScript comme les interfaces, l'héritage de classes, les propriétés (avec méthodes get et set et du sucre syntaxique pour les masquer), les modules (qui supportent le système existant de modules de node.js), la visibilité des propriétés (public/private), les paramètres optionnels, ...

Un des buts de TypeScript est de s'aligner à terme sur ECMAScript 6, qui ajoutera notamment les lambdas et les propriétés, tout en restant un sur-ensemble avec des annotations de types par exemple. L'avantage de cette démarche est qu'elle rendra la compilation plus facile.
Certaines fonctionnalités sont prévues mais pas encore implémentées, comme les enums et les types génériques.

Mais comment l'exemple plus haut avec le typage de
button.onclick peut-il fonctionner ? Ce n'est pas une classe déclarée en TypeScript, donc le compilateur ne peut pas savoir le type de la méthode. Mais il est possible de déclarer des variables "externes" et d'indiquer leur définition, avec la signature des méthodes et les types des propriétés. En d'autres termes, on annote le code existant sans le modifier, dans un fichier à part.
Ainsi, des librairies comme la librairie "standard" JavaScript (que l'on trouve dans les navigateurs) ou node.js sont utilisables en TypeScript avec des annotations de types partout grâce à de grands fichiers de définitions de types.

Contrairement à des langages comme Dart, TypeScript n'ajoute rien au code généré. La seule exception est une très courte méthode utilitaire pour l'héritage de classes, qui n'est ajoutée que si on utilise l'héritage. Ainsi, le code est léger, par opposition à Dart : un Hello World en Dart à l'aide d'une classe est compilé en plus de 10000 lignes de code JavaScript car il inclut une énorme librairie Dart.


On remarquera au passage une jolie prouesse : le compilateur TypeScript est écrit en TypeScript. Cela permet de convertir ce compilateur en JavaScript en se compilant lui-même, et donc de coder en TypeScript dans un navigateur sans interaction avec un serveur.


Il faut toutefois retenir une chose : ce langage est compilé en JavaScript. Cela signifie que toutes les fonctionnalités doivent être traduites en JavaScript. Une fois la compilation effectuée, toutes les annotations de types sont enlevées le sucre syntaxique aussi. Du JavaScript peut donc utiliser du TypeScript compilé et lui donner des arguments de mauvais type puisqu'il n'y a pas de vérification à l'exécution. De même, les membres marqués comme
private en TypeScript peuvent être utilisés en dehors de la classe depuis le JavaScript.
Pour éviter les bugs liés aux types, il faut donc éviter d'appeler du code généré par TypeScript avec JavaScript.

Quel futur pour TypeScript ?

Image utilisateur

Comme tous les nouveaux langages, la plus grande difficulté que TypeScript devra surmonter est le scepticisme des développeurs. Pourquoi un nouveau langage à apprendre ? S'exécute-t-il plus lentement que du JavaScript écrit à la main ? Sera-t-il encore présent dans 10 ans ? Autant de questions auxquelles Microsoft devra répondre efficacement pour faire décoller l'utilisation du langage.

Comme TypeScript est un sur-ensemble strict de JavaScript, il est possible de porter un projet JavaScript en TypeScript sans y toucher, puis d'ajouter petit à petit des annotations de type et réécrire les pseudos-classes en vraies classes. Cela devrait attirer les développeurs qui n'aiment pas JavaScript mais sont obligés de travailler avec pour créer des pages Web. De plus, cela facilite l'apprentissage puisqu'il ne faut pas apprendre un nouveau langage mais seulement un peu de nouvelle syntaxe.


TypeScript sera utilisable pour programmer des applications WinRT (Windows Runtime), les nouvelles applications plein écran de Windows 8. Cela devrait grandement aider à sa popularisation. Un développeur voulant créer une application WinRT verra ainsi l'option "TypeScript", ce qui devrait piquer sa curiosité.


Pour son nouveau langage, Microsoft a choisi l'open source ; le compilateur et la spécification sont disponibles et il est possible de télécharger le compilateur comme un package node.js. N'importe qui peut proposer ses propres changements ou corrections de bugs au compilateur, comme pour n'importe quel projet open source. Le compilateur est sous licence Apache 2.0 et la spécification sous licence Open Web Foundation.

C'est un choix stratégique qui devrait porter ses fruits, car la communauté open source est très vocale malgré sa taille. Contre Google Dart, lui aussi open source, Microsoft ne pouvait pas se permettre de sortir un langage et un compilateur propriétaires tout en voulant un Web ouvert.

Microsoft prévoit de continuer à développer TypeScript en y ajoutant les fonctionnalités qui seront dans ECMAScript 6 ainsi que de nouvelles fonctionnalités qui rendent le développement plus facile. Contrairement à JavaScript, TypeScript devrait évoluer rapidement, en tout cas jusqu'à sa version 1.0. (la version actuelle est la 0.8)


La présence d'Anders Hejlsberg comme architecte est importante. Sans lui, ce langage serait probablement "encore un langage qui veut réinventer JavaScript". L'homme est connu pour la qualité des langages qu'il a développés et "un nouveau langage d'Hejlsberg" devrait être une description suffisante pour intéresser les développeurs professionnels.


Il reste un point noir pour l'instant : seul Visual Studio permet de développer en TypeScript avec l'IntelliSense et la coloration syntaxique, via un plug-in. Il est évidemment possible de développer en TypeScript avec n'importe quel éditeur de texte, mais les programmeurs basés sous OSX et Linux devront attendre avant de pouvoir développer confortablement...ou participer au développement communautaire d'un éditeur, puisque le langage est open source. Pour l'instant, Microsoft a publié des fichiers qui ajoutent la coloration syntaxique à Sublime Text, Vim et Emacs, disponibles
ici.

Conclusion


TypeScript est un nouveau langage Microsoft ayant pour but d'améliorer JavaScript à l'aide d'ajouts uniquement, sans rien enlever. Il est ensuite compilé en JavaScript pour être interprété par n'importe quel navigateur. TypeScript apporte la POO, le typage statique, l'inférence de types et d'autres améliorations. Il est ainsi possible de développer des applications Web de grande envergure beaucoup plus facilement. Le langage et son compilateur sont open source.

Dans le futur, TypeScript va évoluer pour s'aligner avec les nouveautés ECMAScript et s'améliorer encore. TypeScript peut être utilisé là où JavaScript peut être utilisé : navigateurs, serveurs (avec node.js), applications Windows (avec WinRT)... Malgré la concurrence de Dart et de CoffeeScript, le langage a beaucoup d'atouts pour plaire.


Pour essayer TypeScript, rendez-vous sur son site officiel qui dispose d'un
éditeur en ligne. À gauche vous pouvez écrire du TypeScript et à droite voir le JavaScript résultant. Essayez les exemples inclus en utilisant la combobox à droite du carré "TypeScript" et faites tourner votre code en cliquant sur "Run" à gauche du carré "JavaScript".


Pour en savoir plus


Bibliographie

Aucun commentaire:

Enregistrer un commentaire