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. Google utilise Angular 2 Dart pour certains de ces projets internes même si Angular par défaut fonctionne sous TypeScript.

Dart semble aussi avoir un rôle important dans Andromeda, un futur OS de Google pour remplacer ChromeOS et Android, avec Flutter comme interface graphique. Nous suivrons les développements de ce projet.

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 syntaxe est très classique, pour ne pas dire antique, proche de celle de JavaScript, créé dans les années 90 et de C, créé lui en 1972. Ce classicisme est délibéré. Cependant le langage propose offre des possibilités très modernes.

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 coté serveur. Et Dart compilé en JavaScript fonctionne seulement sur des navigateurs récent, pas sur IE9 par exemple.

Dart et les navigateurs, WebAssembly

Il était peu probable que Microsoft ou Apple adoptent ce langage avant longtemps, la machine virtuelle était donc confinée à Chromium. D'ailleurs Microsoft à choisi une option différente avec TypeScript. Et puisque même Google a renoncé en mars 2015 à l'implémenter sur Chrome il n'y aucune chance que d'autres le fassent.

Il existait pourtant une version de Chrome nommée Dartium qui intègrait la 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.

Selon les auteurs, Dart ne sera pas compilé en WebAssembly, qui est plutôt une cible pour les langages statiques comme C ou C++. Il faudrait que wasm devienne l'équivalent de la JVM ou la CLR pour que cela puisse être envisagé.

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 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 et iOS avec l'avantage d'un même langage sur toutes les plateformes.
Son principal avantage par rapport à React Native et Node, outre la vitesse, est dans les outils de développement qui l'accompagnent.

Utiliser Dart pour un réaliser un 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

Documents et ressources

Voir aussi...

Langages de programmation et de données Asm.js - Basic - C - C++ - C# - Dart - Eiffel - Go - Java - JavaScript - Julia - Pascal - PHP - Python - Ruby - Scala - Scriptol - TypeScript - HTML - Wasm - XML - XAML - SQL