samedi 23 janvier 2016
Dart, successeur de C++ pour applications modernes
Dart, successeur de C++ pour applications modernes
Dart fonctionne dans le navigateur et sur le serveur et procure les fonctions d'un langage d'application très classique.
Ce nouveau langage de Google est disponible sur le site dartlang.org, il est compilé en JavaScript dans le navigateur et une machine virtuelle en fait une alternative à Node sur le serveur. On peut aussi l'utiliser sur Android à la place de Java.
Il comporte de vraies classes et implémente la concurrence sous forme d'acteurs communiquants disposant de leur propre environnement.
Dart futur
Langage du futur imaginé en 1972
Confronté à des problèmes de design fondamentaux dans JavaScript qu'il estime insolvables par des améliorations progressives, Google a opté pour une solution radicale: remplacer totalement le langage par un autre, avec une syntaxe qui supprime les defauts de JS. Mais JavaScript est en fait un langage intéressant dans sa conception d'ensemble, ce sont les détails qui laissent à désirer et Dart malheureusement abandonne aussi cette conception innovante pour revenir aux classiques.
Une meilleure autre solution existe sur le navigateur: permettre d'utiliser n'importe quel langage de programmation en frontend à un bytecode, un rôle que remplit maintenant WebAssembly.
Google promet que la programmation en Dart deviendra interactive grâce aux outils fournis, on pourra éditer et exécuter un programme directement, et modifier le code selon les résultats. Pour une application Web, ce serait un avantage énorme.
Les programmes peuvent être évolutifs. Cela peut commencer par un script avec des variables dynamiques, qui peut se transformer en application auquel on va ajouter des variables typées et des classes.
Dart est en concurrence avec SoundScript (aussi de Google), un mode JavaScript qui support les variables typées et autres fonctionnalités pour accroître les performances, tout en supprimant les inconvénients de JS.
Le 25 mars 2015, Google a annoncé qu'elle renonçait à implémenter la machine virtuelle Dart dans le navigateur Chrome. Mais Dart peut toujours être compilé en JavaScript coté client comme TypeScript.
Une version moderne de C avec classes pour remplacer JavaScript
La syntaxe du langage Dart, créé en 2011, est plus que classique, elle est très proche de celle de C (1972) et de JavaScript (1995).
Un programme Dart peut être exécuté par une machine virtuelle ou compilé en JavaScript et ainsi produire un code utilisable par tous les navigateurs.
La fonction main exécute le code après le chargement, et non pas au fur et à mesure que la page est parsée comme en JavaScript.
Classes et interfaces.
Contrairement à JavaScript (avant ECMAScript 6), Dart permet de déclarer des classes et dispose d'un héritage simple. Il ne permet pas de surcharger les méthodes.
Fonctions.
Une fonction se déclare comme en C (et non avec le mot-clé function comme en JavaScript), sauf que le type de retour est optionnel. S'il n'est pas indiqué, il est dynamique.
Comme en JavaScript, on peut imbriquer des fonctions dans d'autres fonctions.
Il peut utiliser des librairies, donc du code déjà compilé.
Types optionnels.
Le programmeur peut utiliser des variables dynamiques pour un script ou des variables typées pour la sécurité sur un projet plus important ou pour une plus grande vitesse d'exécution. Noter que l'inférence de type par les compilateurs JavaScript modernes annule cet avantage.
Concurrent.
Des entités nommées Isolates peuvent fonctionner en concurrence. Elles communiquent par message mais ont leur espace mémoire propre.
Donc le language n'est pas multi-thread, mais dispose de processus parallèles, des sortes d'acteurs.
Le symbole + sert à l'addition ou la concaténation. Il peut aussi être surchargé par des méthodes de classes.
Auto-documentation facilitée.
Comme en Scriptol, un nom ne doit pas être déclaré localement dans un bloc alors qu'il existe déjà dans un bloc conteneur (ici on reçoit un avertissement, en Scriptol c'est une erreur de syntaxe).
Un objet est public (utilisable hors de la libraire), ou privé, dans ce cas il est préfixé par un code de soulignement.
Les classes peuvent comporter des getters et setters. La syntaxe est :
type nom => expression.
Une méthode peut être statique. Elle est alors déclarée avec le préfixe static. De même pour un attribut.
Les opérateurs sont ceux de PHP. Cela inclut === et !== pour les comparaisons strictes.
Comme en PHP on peut intégrer des variables dans les chaînes de caractères, avec le préfixe $.
Mots réservés:
abstract, assett, break, case, catch, class, continue, do, exception, extends, factory, false, finally, for, get, if, implements, import, interface, in, include, is, library, negate, operator, Proxy, set, source, static, switch, throw, try, true, typedef, until, while.
Liste des types et objets prédéfinis:
bool, Date, double, Duration, int, list, map, num, Isolate, Object, Match, Math, Pattern, Queue, RegExp, String, var, void.
Mixin
Une classe qui peut être incluse dans une autre pour former un objet composite. A la différence de l'héritage qui est simple ici et non multiple, on peut incorporer plusieurs mixins (voir dictionnaire) dans une classe.
Snapshot.
Un snapshot est une forme de persistence de l'état d'un programme. Ses données sont enregistrées sur disque dur pour être utilisées lors de la prochaine session. Cela permet de redémarrer un programme instantanément comme s'il était en veille. (La documentation actuelle n'en parle pas mais le code de snapshot fait partie de celui de la machine virtuelle).
Streams.
La programmation réactive fonctionnelle est ajoutée avec les streams, qui mettent à jour automatiquement une variable déclarée comme dépendant de la valeur d'autres variables et évènements.
SIMD.
Instructions fonctionnant en parallèle.
async et await. (1.9).
Await est équivalent à promise de JavaScript 6.
Promise: .then est une sorte de callback. Cela définit une fonction invoquée quand un traitement est accompli.
Enum. (1.9).
Il n'y a vraiment rien d'innovateur dans la syntaxe, rien qu'une sorte de mise aux normes (celles d'antan) pour JavaScript, un langage créé dans les années 90 ou une version moderne de C, lui créé en 1972. Alors que le langage propose des fonctions très utiles, le design manque réellement d'imagination.
Dart est très intéressant comme successeur de C pour réaliser des scripts (non comme langage système), mais le principe qui est de conserver ce qui est familier aux programmeurs conduit à imiter un langage vieux de 40 ans.
Dart vs TypeScript
Comparaison de la syntaxe des deux candidats à être utilisés en frontend à JavaScript (il y en a d'autres).
Afficher "Salut le Monde!".
Dart
void main()
{
print("Salut le Monde!");
}
TypeScript
function main()
{
console.log("Salut le Monde!");
}
Déclarer une chaîne. La déclaration TypeScript ajoute le type en option.
Dart
String str = "Hello en Dart";
TypeScript
var str : string = "Hello en TypeScript";
Le type d'une variable peut être déterminé par inférence lors de la déclaration Dart. Dans le cas de TypeScript il s'agit d'une variable dynamique.
Dart
var str = "Hello en Dart";
TypeScript
var str = "Hello en TypeScript";
Concaténer deux variables a et b... Dart reprend le principe de PHP qui est dans certains cas plus pratique.
Dart
String x = "$a$b"
TypeScript
var x = a + b;
Structure if. Similaire à JavaScript
Dart
if (x == 1)
{
print("1");
} else if(x == 2) {
print("2");
} else {
print("x");
}
TypeScript
if (x == 1)
{
console.log("1");
} else if(x == 2) {
console.log("2");
} else {
console.log("x");
}
La structure switch de Dart est similaire à celle de JS avec des options supplémentaires. En Dart, chaque clause doit se terminer par break, continue, throw ou return sauf si elle est vide. Dans ce cas elle est fusionnée avec la suivante. On peut avoir un effet similaire sur une clause non vide avec continue qui effectue un saut sur une clause si elle a un libellé.
Dart
var x = "x";
switch(x) {
case "a":
print("a");
break;
case "b":
case "c":
print("b ou c");
break;
default:
print("x");
}
TypeScript
var x = "x";
switch(x) {
case "a":
console.log("a");
break;
case "b":
case "c":
console.log("b ou c");
break;
default:
console.log("x");
}
La boucle for. Exemple pour afficher les caractères d'une chaîne.
Dart
var str = "demo";
for(var i = 0; i < str.length; i++) {
print(str[i]);
}
TypeScript
var str = "demo";
for(var i = 0; i < str.length; i++) {
console.log(str[i]);
}
For ... each. Fonctionne sur les collections comme JS.
Dart
var arr = [ 1,2,3 ];
for(var x in arr) {
print(x);
}
TypeScript
var arr = [ 1,2,3 ];
for(var x in arr) {
console.log(x)
...
}
Boucle while. Similaire à JS.
Dart
int x;
while(true) {
x++;
}
do {
x++;
} while(true);
TypeScript
var x: number
while(true) {
x++;
}
do {
x++;
} while(true);
Déclaration d'une fonction. Une fonction peut avoir des arguments dynamiques, ce qui est similaire au multiple dispatch, mais n'apporte pas la même rapidité.
Dart
String catstr(String str) {
String x = "Message : $str";
return x;
}
print(catstr("Hello"));
// On peut omettre le type.
add(a, b) {
return(a + b);
}
TypeScript
function catstr(str : string) : String {
var x : string = "Message : $str";
return x;
}
console.log(catstr("Hello"));
// On peut omettre le type.
function add(a, b) {
return(a + b);
}
Classe et héritage. Les deux langages sont plus simples que JavaScript, mais l'implémentation d'Harmony offrira les mêmes possibilités à ce dernier. Les deux langage implémentent les interface, tandis qu'Harmony propose les abstractions avec les proxies.
Dart
class Vehicule {
int carburant;
int passagers;
Vehicule(int this.vitesse, int this.passagers) {
}
int distance() {
return(this.carburant / this.passagers);
}
}
class Voiture extends Vehicule {
int puissance;
}
TypeScript
class Vehicule
{
carburant : number;
passagers : number;
constructor(vitesse : number, passagers : number) {
}
distance()
{
return(this.carburant / this.passagers);
}
}
class Voiture extends Vehicule
{
puissance : number;
}
Les deux langages sont similaires et diffèrent surtout par l'inversion du type et de l'identifieur pour TypeScript, une syntaxe qui remonte au langage Pascal! Cette syntaxe est utilisée par Google pour le langage Go qui est antérieur de 2 ans à Dart.
Dart dispose de possibilités supérieures à TypeScript, mais elle sont compatibles seulement avec la version compilée en binaire. Et Dart fonctionne seulement sur des navigateurs récent, pas sur IE9 par exemple.
Dart sera-t-il adopté sur tous les navigateurs?
Il était peu probable que Microsoft ou Apple adoptent ce langage avant longtemps, la machine virtuelle était donc confinée à Chromium. En fait Microsoft à choisi une option différente avec TypeScript. Et puisque même Google a renoncé à l'implémenter Chrome il n'y aucune chance que d'autres le fassent.
Il existait une version de Chrome nommée Dartium qui intègrait une machine virtuelle Dart. Cependant, la communauté qui développe Webkit a refusé son implémentation pour le motif qu'il ne fait pas partie des standard du Web. C'est la même chose du coté de Mozilla ou l'on estimait qu'une future version de JavaScript pourrait ajouter les mêmes améliorations que ce qu'apporte Dart, notamment le modèle de classes et les variables typées. On ne parle pas de Microsoft qui a émis un avis négatif sur le sujet, ni d'Apple qui est loin de vouloir favoriser les applications Web.
Pourquoi utiliser Dart?
Le principal défaut de Dart était d'ordre tactique et non technique. Se positionner comme alternative à JavaScript était son erreur. Mais après la décision (en mars 2015) de ne pas implémenter la machine virtuelle sur le navigateur et plutôt compiler seulement Dart en JavaScript, ce défaut est maintenant supprimé.
Ce langage convient particulièrement aux habitués de C et C++: la syntaxe est absolument identique, bien qu'un peu modernisée.
Il peut remplacer PHP ou Node.js sur le serveur et être compilé en JS pour le navigateur, mais TypeScript est sans doute préférable pour ce second usage. Il convient aussi pour le scripting et éventuellement pour réaliser des applications sur Android.
Son principal avantage par rapport à Phonegap et Node, outre la vitesse, est dans les outils de développement qui l'accompagnent, quoique Visual Studio Code récemment offert par Microsoft sur toutes plateformes, l'annule en partie.
Dart peut aussi être utilisé sur mobiles et remplacer Java sur Android.
Comment utiliser Dart pour un produire script
Pour commencer, téléchargez l'archive au format zip sur le site, et placer le contenu dans un répertoire, par exemple c:\dart (il ne fonctionne que sous Windows).
Vous pouvez lancer l'éditeur de Dart et créer un projet, mais vous vous trouvez alors face à une quantité de fichiers incluant un serveur, que vous ne pouvez utiliser sans avoir étudié sérieusement le manuel. Pour commencer plus simplement on passera plutôt par la ligne de commande. Dans un éditeur de code, tapez:
main() {
print("Hello World!");
}
Sauvez le script dans le fichier hello.dart, dans un répertoire quelconque, par exemple celui de dart. Le script est lancé avec la commande:
c:\dart\dart-sdk\bin\dart hello.dart
Cela affichera Hello World!
Il conviendra si vous voulez continuer avec le langage d'ajouter son chemin à la variable PATH de Windows, il suffira alors de taper dart pour lancer un programme.
Pour aller plus loin...
Outils
Essayez le langage en ligne. Entrez du code en ligne. Pour tester les exemples ci-dessus, il faut placer le code dans une fonction main, ou ajouter une fonction main. Ils ont tous été vérifiés.
JDart. Une version qui compile le code Dart en bytecode pour la machine virtuelle Java.
Sky. Un framework de scripting en Dart pour réaliser des applications Android rapides.
Documents et ressources
Dartlang.org. Description et spécification du langage et téléchargements pour Windows. Un éditeur spécial est aussi disponible.
ECMA 408. Specification standard.
Comparaison point par point de Dart et JavaScript. Fournie par Google.
Voir aussi...
JavaScript et Harmony. Comment évolue le langage. La version 6 d'ECMAScript apporte l'essentiel des fonctions de Dart.
Comment ne pas créer un nouveau langage de programmation. L'éternelle syntaxe de C est-elle la meilleure?
Inscription à :
Publier les commentaires (Atom)
Aucun commentaire:
Enregistrer un commentaire