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.
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 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. - 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. - Asynchrone. On peut lancer des opérations asynchrones avec await ou les promises, appelées ici Future.
- 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 langage 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 bibliothèque), 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 JavaScript. 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, async, await, break, case, catch, class, continue, do, exception, extends, factory, false, finally, for, Future, 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).
Permettent dans une fonction de traiter séquentiellement une succession de commande dont le résultat est en attente de traitement. D'attendre le résultat avant de continuer. - Future: .then est une sorte de callback. Cela définit une fonction invoquée quand un traitement est accompli.
- Enum. (1.9).
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).
Dart
void main() {
print("Salut le Monde!");
}
TypeScript
function main() {
console.log("Salut le Monde!");
}
Dart
String str = "Hello en Dart";
TypeScript
var str : string = "Hello en TypeScript";
Dart
var str = "Hello en Dart";
TypeScript
var str = "Hello en TypeScript";
Dart
String x = "$a$b"
TypeScript
var x = a + b;
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");
}
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");
}
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]);
}
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)
...
}
Dart
int x;
while(true) {
x++;
}
do {
x++;
} while(true);
TypeScript
var x: number
while(true) {
x++;
}
do {
x++;
} while(true);
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);
}
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.
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.
- Flutter. Un framework de scripting en Dart pour réaliser des applications Android ou et iOS rapides.
Documents et ressources
- Dart.dev. Description et spécification du langage et téléchargements pour Windows. Un éditeur spécial est aussi disponible.
- ECMA 408. Specification standard.
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?