Dart, alternative à Java pour applications de smartphones

Dart permet de créer des applications multi-platformes avec la syntaxe d'un langage très classique.

Ce langage de Google est disponible sur le site dart.dev. On peut l'utiliser sur Android à la place de Java ou sur iOS.
Il comporte de vraies classes et implémente la concurrence sous forme d'acteurs communiquants disposant de leur propre environnement.

Dart futur
Le futur n'est jamais ce qu'il était

Confronté à des problèmes de design fondamentaux dans JavaScript qu'il estime insolvables par des améliorations progressives, Google avait 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 où on va ajouter des variables typées et des classes.

Dart était 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.

Google a renoncé à implémenter la machine virtuelle Dart dans le navigateur Chrome en 2015. Mais Dart peut toujours être compilé en JavaScript comme TypeScript. Google utilise Angular 2 Dart pour certains de ces projets internes même si Angular par défaut fonctionne sous TypeScript.

Dart permet de réaliser des applications mobiles pour Android et iOS avec Flutter comme interface, et est aussi le langage de programmation d'Andromeda (ou Fuchsia), un futur OS de Google conçu pour la sécurité, avec Flutter également. Nous suivrons les développements de ce projet.

Une version moderne de C avec classes

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). On peut la définir comme une version simplifiée de C++.

Un programme Dart peut être exécuté par une machine virtuelle pour une application locale ou de smartphone (Dart Native), ou compilé en JavaScript et ainsi produire un code utilisable par tous les navigateurs (Dart Web).

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 existait une version de Chrome nommée Dartium qui intégrait la machine virtuelle Dart, mais Microsoft et Apple n'ont pas voulu intégrer ce langage à leur navigateur.
Apple est loin de vouloir favoriser les applications Web et la communauté qui développe Webkit a refusé son implémentation pour le motif qu'il ne fait pas partie des standards 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, d'ailleurs Microsoft à choisi une option différente avec TypeScript.
Finalement même Google a renoncé en mars 2015 à l'implémenter sur Chrome.

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 similaire, 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 surtout pour réaliser des applications sur Android et iOS avec le framework Flutter. Cela offre l'avantage d'un même langage sur toutes les plateformes. Par rapport à React Native et Node sur les mobiles, son avantage, outre la vitesse, est dans les outils de développement qui l'accompagnent.

Exemple de script en Dart

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 - Prolog - Ruby - Scala - Scriptol - Swift - TypeScript - HTML - Wasm - XML - XAML - SQL