Dart est un langage de programmation développé par Google, tout comme le langage Go, également piloté par Google.
Il a été publié par Google en 2011 et conçu par Lars Bak et Kasper Lund, ingénieurs principaux du moteur V8.
À l’origine, il était destiné à remplacer JavaScript pour le développement web ; il est ensuite devenu le seul langage du framework Flutter, spécialisé dans le développement multi-plateformes client (mobile, web, bureau).
Il est massivement utilisé au sein de Google pour de nombreux services essentiels (YouTube, GCP, infrastructures), dispose d’un vaste écosystème communautaire et fonctionne indépendamment de l’écosystème client.
L’atout majeur : un seul ensemble de code permet de générer des applications pour de multiples plateformes, à savoir Android, iOS, macOS, Linux, Windows et bien d’autres.
Positionnement global
Dart est un langage multi-plateformes optimisé pour les clients. Son objectif est d’offrir une expérience de développement multi-terminaux performante, associée à un environnement d’exécution flexible prenant en charge les frameworks d’application. Il constitue la base sous-jacente de Flutter et intègre nativement des outils de développement tels que le formatage du code, l’analyse statique et les tests unitaires. Il peut être compilé et déployé sur de nombreuses plateformes : web, mobile, ordinateur de bureau, etc.
Caractéristiques techniques
Le développement prend en charge le rechargement à chaud (hot reload).
En phase de production, il permet de produire des applications de haute qualité pour toutes les plateformes.
Sécurité de typage
- Typage statique fort (sound typing) : impose la correspondance des types, mais l’inférence de types permet d’omettre les annotations de type ;
- Prend en charge le type dynamique
dynamic, associé à une vérification à l’exécution pour répondre aux besoins de codage dynamique flexible.
Sécurité null complète (sound null safety)
Par défaut, les variables ne peuvent pas valoir null ; seul une déclaration explicite autorise le stockage d’une valeur nulle. L’analyse statique élimine les exceptions de pointeur nul à l’exécution, et les variables non nulles restent systématiquement non nulles tout au long de l’exécution.
Fonctionnalités syntaxiques natives : bibliothèques intégrées, appels asynchrones, types nullables / non nullables, fonctions fléchées, générateurs, flux, accesseurs getter, etc.
Bibliothèques standard Dart riches
- dart:core : indispensable à tous les programmes Dart, fournit les types natifs de base, les collections et les fonctionnalités génériques essentielles
- dart:collection : extensions de collections incluant des conteneurs avancés comme les files d’attente, listes chaînées, tables de hachage, arbres binaires
- dart:convert : outils d’encodage et de décodage de données, gère la conversion entre formats JSON, UTF-8 et autres
- dart:math : constantes mathématiques, fonctions de calcul et outils de génération de nombres aléatoires
- dart:async : fondement de la programmation asynchrone, propose les classes asynchrones centrales Future et Stream
- dart:typed_data : tableaux binaires à longueur fixe performants (ex : entier non signé 8 bits), types numériques SIMD
- dart:io : réservé aux environnements hors web, propose des opérations d’entrée/sortie sur fichiers, sockets, requêtes HTTP
- dart:ffi : interface de fonctions externes de style C, permet l’interopérabilité avec du code C
- dart:isolate : threads isolés pour le parallélisme, similaires aux threads mais sans partage de mémoire, communiquant uniquement par messages
- dart:js_interop / package:web : dédié au web, permet de manipuler les éléments HTML, le DOM navigateur et d’interagir avec JavaScript
Outre les bibliothèques centrales natives, Google maintient de nombreux paquets complémentaires officiels : characters, intl, http, crypto, markdown. Les développeurs tiers de la communauté publient également des milliers de paquets d’extension prenant en charge XML, l’intégration au système Windows, SQLite, la compression de données et d’autres fonctionnalités.
Plateformes d’exécution Dart
Dart utilise plusieurs techniques de compilation pour fonctionner sur tous les terminaux :
1. Plateformes natives (mobile / bureau)
Deux systèmes de compilation intégrés : machine virtuelle Dart avec compilation à la volée (JIT) et compilateur préalable (AOT), capables de générer du code machine.
2. Plateforme web
Deux schémas de compilation sont proposés pour le développement et la production, permettant de compiler Dart en JavaScript ou en WebAssembly.
Flutter est une boîte à outils UI multi-plateformes majeure basée sur Dart. Il est fourni avec un ensemble complet d’outils de développement et de bibliothèques d’interface, et permet de concevoir des applications pour iOS, Android, macOS, Windows, Linux et le web.
Compilation native Dart (JIT + AOT)
- Phase de développement (JIT) : la compilation incrémentielle de la machine virtuelle prend en charge le hot reload, propose une surveillance des performances en temps réel et des outils de débogage complets, pour une efficacité de développement itératif très élevée ;
- Mise en production (AOT) : compilation en code machine natif ARM / x64, assurant un lancement stable et rapide des applications ;
- Gestion mémoire complète intégrée à l’environnement d’exécution : ramassage des ordures par générations, allocation rapide des objets, tout en appliquant strictement les règles de sécurité de typage complète de Dart.
Compilation web Dart (JS / WasmGC)
Le code Dart peut être transformé en JS pour s’exécuter dans un navigateur (moteur Chrome V8 par exemple), ou compilé en WebAssembly :
- Mode compilation développement : compilateur JS incrémentiel, compatible hot reload pour des tests et itérations rapides ;
- Compilation JS production : optimisation et compression, suppression du code mort, produit un JS léger et performant ;
- Compilation production WasmGC : compilation en code WebAssembly GC haute performance, amélioration très notable de la vitesse d’exécution.