La disponibilité de Dart 2.6 s'est accompagnée de dart2native, une extension de l'ensemble de compilateurs existants, avec la possibilité de compiler des programmes Dart en exécutables autonomes contenant du code machine compilé à l'avance. Avec dart2native, vous pouvez créer des outils pour la ligne de commande sous macOS, Windows ou Linux à l'aide de Dart.
Dart supporte la compilation AOT (ahead-of-time) en code machine natif depuis plusieurs années et Dart Native est donc une technologie relativement mature. Cependant, dans le passé, l'équipe a choisi de n’exposer cette fonctionnalité qu’aux appareils mobiles iOS et Android, via Flutter.
Avec dart2native, l'équipe étend donc la prise en charge de la compilation native pour prendre en charge les systèmes d’exploitation desktop traditionnels exécutant macOS, Windows et Linux. Les exécutables créés avec dart2native étant autonomes, ils peuvent être exécutés sur des machines sur lesquelles Dart SDK n’est pas installé. Et comme ils sont compilés avec le compilateur AOT de Dart, les exécutables se lancent en quelques millisecondes. Comme avec d'autres compilateurs et runtimes Dart, le même ensemble de bibliothèques principales riches et cohérentes est disponible dans Dart lors de la compilation en code natif.
Création d'applications de ligne de commande avec dart2native
Le compilateur dart2native est donc un moyen de créer et déployer des applications basées sur Dart pour la ligne de commande. Ces applications utilisent souvent des bibliothèques telles que dart:io (E/S de base), package:http (mise en réseau) et package:args (analyse des arguments). Passons en revue les bases de la compilation d’une application «hello, world» en un exécutable:
Le code source hello.dart:
Code Dart : | Sélectionner tout |
1 2 3 | main() { print(Hello Dart developers); } |
Compilez hello.dart en un hello exécutable:
Code : | Sélectionner tout |
1 2 | $ dart2native src/hello.dart -o hello Generated: /Users/mit/hello |
Code : | Sélectionner tout |
1 2 3 4 | $ time ./hello Hello Dart developersreal 0m0.049s user 0m0.018s sys 0m0.020s |
Les applications natives doivent souvent accéder aux fonctionnalités natives du système d'exploitation environnant. Ces API système sont généralement exposées dans des bibliothèques natives basées sur C et Dart prend en charge l’interopérabilité avec ces bibliothèques via dart:ffi, le nouveau mécanisme d’interopérabilité C qui a été lancé en préversion dans Dart 2.5. Le compilateur dart2native est compatible avec dart:ffi, vous pouvez donc créer et compiler nativement des applications Dart qui l’utilisent.
Un membre de l’équipe a récemment utilisé dart:ffi pour créer une bibliothèque dart_console destinée au développement d’applications pour console, qui permet notamment de connaître les dimensions de la fenêtre, de lire et de définir l’emplacement du curseur, de gérer les couleurs et de lire les clés et les séquences de contrôle. La possibilité d'utiliser dart:ffi fait de Dart un langage très puissant pour les applications en console.
kilo: un éditeur de code de 7 Mo écrit en moins de 500 lignes de code Dart
En utilisant les bibliothèques Dart Core, dart:ffi et la bibliothèque dart_console, l'équipe assure qu'il est possible de créer des applications de console très intéressantes. Le paquet dart_console comprend une démo complète de kilo, un éditeur de texte de console écrit en seulement 500 lignes de code Dart. Le nom kilo vient de son origine, kilo.c, qui était une implémentation en C dans environ 1000 lignes de code.
Selon l'équipe, avec le nouveau compilateur dart2native, nous pouvons facilement le conditionner, et nous nous retrouvons avec un éditeur de code autonome de 7 Mo.
Développer des services avec dart2native
Une autre utilisation potentielle du compilateur dart2native concerne les petits services, par exemple, un backend supportant une application frontend écrite en utilisant Flutter. Ces dernières années, l'utilisation de services fonctionnant sur des ordinateurs sans serveur est une tendance croissante. Il s’agit de services entièrement gérés qui s’échelonnent automatiquement, offrant ainsi la possibilité de réduire considérablement les coûts, car ils ne sont facturés que lorsqu’ils sont réellement exécutés.
Pour les backend sans serveur, il est essentiel que le service démarre rapidement. Traditionnellement, les services basés sur Dart fonctionnaient avec le compilateur JIT, mais l’exécution basée sur JIT a une latence élevée au démarrage, car le code doit être compilé et mis en température avant de pouvoir être exécuté. En compilant le code de votre service ahead-of-time en code natif, vous pouvez éviter cette latence. De plus, avec du code natif, vous pouvez créer des services Dart dotés d’une empreinte de disque réduite et qui sont autonomes, ce qui réduit considérablement la taille du conteneur dans lequel le service Dart est exécuté. Le développeur de Dart, Paul Mundt, a récemment documenté ses expériences avec l’utilisation du compilateur dart2native; il était en mesure de réduire la taille de son image Docker de 220 Mo à 91 % en utilisant du code compilé par JIT, à seulement 20 Mo en utilisant du code natif!
Télécharger le SDK de Dart 2.6
Source : Google