Dart (langage)

Dart
Logo.

Date de première version
Auteur Lars Bak et Kasper Lund
Développeur Google
Dernière version 3.6.0 ()[1]Voir et modifier les données sur Wikidata
Version en développement 3.1.0-262.2.beta. ()
Influencé par C (langage), C#, Erlang, Java, Javascript, Kotlin, Ruby, TypeScript
Implémentations Flutter, Dart VM, dart2native, dart2js
Système d'exploitation Cross-plateforme
Licence Licence BSD
Site web dart.dev
Extension de fichier .dart

Dart est un langage de programmation optimisé pour les applications sur plusieurs plateformes. Il est développé par Google et est utilisé pour créer des applications mobiles, de bureau, de serveur et web.

Dart est un langage orienté objet à ramasse-miettes avec une syntaxe de type C++[2]. Dart peut se compiler en code natif ou en JavaScript. Il prend en charge les interfaces, les mixins, les extensions de classes, les classes abstraites, les génériques réifiés et l'inférence de type[3].

Histoire

Dart a été dévoilé lors de la conférence GOTO à Aarhus, au Danemark, du 10 au 12 octobre 2011. Le projet a été fondé par Lars Bak et Kasper Lund[4]. Dart 1.0 est sorti le 14 novembre 2013[5].

Dart a initialement reçu un accueil mitigé et l'initiative Dart a été critiquée par certains pour avoir fragmenté le web, en raison des plans originaux d'inclure une VM Dart dans Chrome. Ces plans ont été abandonnés en 2015 avec la version 1.9 de Dart pour se concentrer plutôt sur la compilation de Dart en JavaScript[6].

En août 2018, Dart 2.0 est sorti, avec des changements du langage incluant un système de typage plus sain[7].

Dart 2.6 a introduit une nouvelle extension : dart2native. Cette fonction étend la compilation native aux plates-formes de bureau Linux, macOS et Microsoft Windows. Auparavant, les développeurs pouvaient créer de nouveaux outils en utilisant uniquement des appareils Android ou iOS. De plus, avec cette extension, il devient possible de compiler un programme Dart en exécutables autonomes. Ainsi, il n'est plus obligatoire d'avoir installé la machine virtuelle Dart, les exécutables ainsi générés peuvent s'exécuter immédiatement. La nouvelle extension est également intégrée à la boîte à outils Flutter, ce qui permet d'utiliser le compilateur pour de petits services (support backend par exemple) [8],[9].

Standardisation

Ecma International a formé le comité technique TC52[10] pour travailler à la normalisation de Dart, et dans la mesure où Dart peut être compilé en JavaScript standard, il fonctionne efficacement dans n'importe quel navigateur moderne. Ecma International a approuvé la première édition de la spécification du langage Dart en juillet 2014, lors de sa 107e assemblée générale[11], et sa deuxième édition en décembre 2014[12]. La dernière spécification est disponible à l'adresse suivante spécification du langage Dart.

Utilisation

Il y a quatre façons d'exécuter le code Dart :

Compilé en JavaScript
Pour fonctionner dans les navigateurs Web grand public, Dart s'appuie sur un compilateur source-source en JavaScript. Selon le site du projet, Dart a été "conçu pour être un outil de développement facile à écrire, bien adapté au développement d'applications modernes, et capable de faire des implémentations de hautes performances". Lorsque le code de Dart est exécuté dans un navigateur web, le code est précompilé en JavaScript à l'aide du compilateur dart2js. Compilé en JavaScript, le code Dart est compatible avec les principaux navigateurs sans qu'il soit nécessaire qu'ils supportent Dart directement. En optimisant le JavaScript compilé pour éviter des vérifications et des opérations coûteuses, un code écrit en Dart peut, dans certains cas, s'exécuter plus rapidement que le code Javascript équivalent écrit à la main[13].
Autonome
Le kit de développement logiciel (SDK) Dart est livré avec une machine virtuelle (VM) Dart autonome, permettant au code Dart de s'exécuter dans un environnement d'interface de ligne de commande. Comme les outils linguistiques inclus dans le SDK Dart sont principalement écrits en Dart, la VM Dart est une partie essentielle du SDK. Ces outils comprennent le compilateur dart2js et un gestionnaire de packages appelé pub. Dart est livré avec une bibliothèque standard complète permettant aux utilisateurs d'écrire des applications système entièrement fonctionnelles, telles que des serveurs web personnalisés[14].
Compilation anticipée
Le code Dart peut être compilé en AOT en code machine (jeux d'instructions natives). Les applications construites avec Flutter, un SDK d'application mobile construit avec Dart, sont déployées dans les magasins d'applications sous forme de code Dart compilé en AOT[15].
Native
Dart 2.6 avec le compilateur dart2native pour compiler en code exécutable autonome et natif. Avant Dart 2.6, cette fonctionnalité n'était disponible que sur les appareils mobiles iOS et Android via Flutter[16].

Isolats

Pour parvenir à la concordance, Dart utilise des "isolats", des entités indépendantes qui ne partagent pas leur mémoire, mais utilisent la transmission de messages. Cette méthode est similaire aux processus Erlang (voir aussi le modèle Acteur). Chaque programme Dart utilise au moins un isolat, qui est l'isolat principal. Depuis Dart 2, la plate-forme web Dart ne prend plus en charge les isolats et suggère aux développeurs d'utiliser les Web Workers à la place[17].

Instantanés

Les instantanés (snapshots) sont une partie essentielle de la VM Dart. Ce sont des fichiers qui stockent des objets et d'autres données d'exécution.

Script snapshots
Les programmes Dart peuvent être compilés en fichiers snapshot. Ces fichiers contiennent l'ensemble du code du programme et ses dépendances, prêts à être exécutés. Cela permet des démarrages rapides.
Full snapshots
Les bibliothèques de base de Dart peuvent être compilées dans un fichier snapshot qui permet un chargement rapide des bibliothèques. La plupart des distributions standard de la VM Dart principale ont un snapshot pré-construit pour les bibliothèques de base qui est chargé à l'exécution.
Object snapshots
Dart est un langage très asynchrone. Il utilise des isolats pour gérer le parallélisme. Comme ce sont des entités qui font passer des messages, il faut trouver un moyen de sérialiser un message. Cela se fait en utilisant un snapshot, qui est généré à partir d'un objet message sérialisé, et qui est ensuite transféré à un autre isolat pour y être désérialisé.

Applications mobiles natives

Google a introduit Flutter pour le développement d'applications mobiles natives sur Android et iOS[18]. Flutter est un SDK d'application mobile, complet avec un cadre de travail, des widgets et des outils, qui donne aux développeurs un moyen de construire et de déployer des applications mobiles, écrites en Dart. Flutter fonctionne avec Firebase et d'autres SDK d'applications mobiles, et est open source.

Compilation en JavaScript

Le Dart SDK contient deux compilateurs Dart-to-JavaScript. Pendant le développement, dartdevc supporte des cycles de rafraîchissement rapides. Pour la version finale d'une application, dart2js produit du JavaScript déployable[19].

Le premier compilateur à générer du JavaScript à partir de code Dart était dartc, mais il a été déprécié. Le deuxième compilateur Dart-to-JavaScript était Frog. Il a été écrit en Dart, mais n'a jamais implémenté toute la sémantique du langage. Le troisième compilateur Dart-to-JavaScript était dart2js. Une évolution des compilateurs précédents, dart2js est écrit en Dart et destiné à implémenter la spécification et la sémantique complète du langage Dart.

Le 28 mars 2013, l'équipe Dart a publié sur son blog une mise à jour concernant le code Dart compilé en JavaScript avec le compilateur dart2js[20], indiquant qu'il fonctionne désormais plus vite que le JavaScript écrit à la main sur le moteur JavaScript V8 de Chrome pour le benchmark DeltaBlue[21].

Éditeurs

Le 18 novembre 2011, Google a lancé Dart Editor, un programme open-source basé sur les composants Eclipse, pour les systèmes d'exploitation MacOS, Windows et Linux[22]. L'éditeur prend en charge la coloration syntaxique, la complétion de code, la compilation JavaScript, l'exécution d'applications Dart sur le web et sur les serveurs, et le débogage.

Le 13 août 2012, Google a annoncé la sortie d'un plugin Eclipse pour le développement de Dart[23].

Le 18 avril 2015, Google a annoncé que l'éditeur Dart serait retiré au profit de l'environnement de développement intégré (IDE) JetBrains[24], qui est maintenant l'IDE[25] recommandé pour le langage. Le plugin Dart est disponible pour IntelliJ IDEA, PyCharm, PhpStorm et WebStorm. Ce plugin supporte de nombreuses fonctionnalités telles que la coloration syntaxique, la complétion de code, l'analyse, le refactoring, le débogage, et plus encore. D'autres plugins sont disponibles pour les éditeurs comme Sublime Text, Atom, Emacs, Vim et Visual Studio Code[26]. Depuis 2020, le plugin Dart est disponible sur Android Studio[27].

Éditeur Chrome Dev

En 2013, l'équipe Chromium a commencé à travailler sur un environnement de développement open source basé sur l'application Chrome avec une bibliothèque réutilisable de widgets GUI, dont le nom de code est Spark[28].Le projet a ensuite été rebaptisé Chrome Dev Editor (éditeur de développement Chrome)[29]. Il a été construit en Dart, et contient Spark qui est alimenté par Polymer[30].

En juin 2015, Google a transféré le projet CDE à GitHub en tant que projet de logiciel libre et a cessé d'investir activement dans le CDE[31]. Depuis avril 2019, Chrome Dev Editor n'est plus en développement actif[32].

DartPad

L'équipe Dart a créé DartPad au début de l'année 2015, afin de faciliter l'utilisation de Dart. Il s'agit d'un éditeur entièrement en ligne à partir duquel les utilisateurs peuvent expérimenter les interfaces de programmation d'application (API) de Dart et exécuter le code de Dart. Il permet la mise en évidence de la syntaxe, l'analyse du code, la complétion du code, la documentation et l'édition HTML et CSS[33].

SIMD

En 2013, John McCutchan a annoncé[34]qu'il avait créé une interface performante pour les jeux d'instructions à instructions uniques et données multiples (SIMD) pour Dart.

L'interface se compose de deux types :

  • Float32 × 4, 4 × single precision floating point values
  • Uint32 × 4, 4 × 32-bit unsigned integer values

Ces types sont immuables et, dans un code optimisé, sont directement mis en correspondance avec les registres SIMD. Les opérations exprimées en Dart sont généralement compilées en une seule instruction, sans surcharge. Cette méthode est similaire à celle du C et du C++ intrinsèques. Les références pour la multiplication matricielle 4×4, la la transformation des sommets en 3D et la visualisation des ensembles de Mandelbrot montrent une accélération de près de 400 % par rapport au code scalaire écrit en Dart.

Exemple

Un exemple avec le fameux programme Hello World :

void main() {
 print('Hello World!');
}

Une fonction pour calculer le nième nombre de Fibonacci :

int fib(int n) => (n > 2) ? (fib(n - 1) + fib(n - 2)) : 1;
// Une mise en œuvre de la fonction Fibonacci avec un opérateur conditionnel dans Dart
// Ce code se lit comme suit :
// étant donné un nombre entier n,
// si n > 2, renvoyer fib(n - 1) + fib(n - 2) ; 
// sinon, renvoie l'entier 1 comme résultat

void main() {
  print('fib(20) = ${fib(20)}');
}

Une classe simple:

// Importer la bibliothèque mathématique (math) pour avoir accès à la fonction `sqrt`.
import 'dart:math' as math;

// Créer une classe pour un Point.
class Point {

  // Les variables finales ne peuvent pas être modifiées une fois qu'elles ont été attribuées.
  // Déclarer deux variables d'instance.
  final num x, y;

  // Un constructeur, avec du sucre syntaxique pour définir des variables d'instance.
  // Le constructeur a deux paramètres obligatoires.
  Point(this.x, this.y);

  // Un constructeur nommé avec une liste d'initialisation.
  Point.origin()
      : x = 0,
        y = 0;

  // Une méthode.
  num distanceTo(Point other) {
    var dx = x - other.x;
    var dy = y - other.y;
    return math.sqrt(dx * dx + dy * dy);
  }
  
  // Exemple d'un "getter".
  // Agit comme une variable finale, mais est calculé à chaque accès.
  num get magnitude => math.sqrt(x * x + y * y);

  // Exemple  de l'opérateur d'overloading
  Point operator +(Point other) => Point(x + other.x, y + other.y);
  // Lorsque vous instanciez une classe telle que Point en Dart 2+, new est un mot optionnel
}

// Tous les programmes Dart commencent par main().
void main() {
  // Instancie des objets Point.
  var p1 = Point(10, 10);
  print(p1.magnitude);
  var p2 = Point.origin();
  var distance = p1.distanceTo(p2);
  print(distance);
}

Influences d'autres langages

Dart est un descendant de la famille des langages ALGOL[35], aux côtés du C, Java, C#, JavaScript, et autres.

La syntaxe de la méthode en cascade, qui fournit un raccourci syntaxique pour invoquer plusieurs méthodes l'une après l'autre sur un même objet, est reprise de Smalltalk.

Les mixins de Dart ont été influencés par Strongtalk et Ruby.

Dart utilise des isolates comme unité de sécurité et de simultanéité lors de la structuration des applications[36]. Le concept d'isolate s'appuie sur le modèle Actor, dont la mise en œuvre la plus célèbre est celle d'Erlang.

L'API Mirror permettant d'effectuer une réflexion contrôlée et sécurisée a été proposée pour la première fois dans un article[37] de Gilad Bracha (qui est membre de l'équipe Dart) et David Ungar et a été implémentée à l'origine dans Self.

Références

  1. a et b « Release 3.6.0 »
  2. « A Tour of the Dart Language », dart.dev (consulté le )
  3. « The Dart type system », dart.dev
  4. Ladd, « What is Dart », What is Dart?, O'Reilly (consulté le )
  5. « Dart 1.0: A stable SDK for structured web apps », news.dartlang.org (consulté le )
  6. Seth Ladd, « Dart News & Updates », dartlang.org
  7. Moore, « Announcing Dart 2 Stable and the Dart Web Platform », Dart, (consulté le )
  8. « Dart 2.5 brings native compilation to the desktop », Infoworld (consulté le )
  9. « Dart 2.6 released with dart2native », SDtimes (consulté le )
  10. « TC52 - Dart » [archive du ] (consulté le )
  11. Anders Thorhauge Sandholm, « Dart News & Updates », dartlang.org
  12. Anders Thorhauge Sandholm, « Dart News & Updates », dartlang.org
  13. « JavaScript as a compilation target: Making it fast » [archive du ], Dartlang.org (consulté le )
  14. « An Introduction to the dart:io Library », Dartlang.org (consulté le )
  15. « Flutter FAQ », flutter.io (consulté le )
  16. « Announcing Dart 2.6 with dart2native: Compile Dart to self-contained, native executables » (consulté le )
  17. Moore, « Dart2 Breaking Change: Removing web support for dart:mirrors and dart:isolate », Google Groups,
  18. « Flutter - Beautiful native apps in record time », flutter.dev
  19. « Deployment », angulardart.dev
  20. Ladd, « Dart News & Updates: Why dart2js produces faster JavaScript code from Dart », News.dartlang.org., (consulté le )
  21. « Dart Performance » [archive du ], Dartlang.org. (consulté le )
  22. « Google Releases Dart Editor for Windows, Mac OS X, and Linux » [archive du ] (consulté le )
  23. « Dart plugin for Eclipse is Ready for Preview »
  24. Ladd, « The present and future of editors and IDEs for Dart », Dart News & Updates, (consulté le )
  25. « JetBrains Plugin Repository : Dart », Plugins.intellij.net (consulté le )
  26. « Dart Tools », dart.dev (consulté le )
  27. « Plugin Dart » (consulté le )
  28. Beaufort, « The chromium team is currently actively working »
  29. « A Chrome app based development environment »
  30. « Spark, A Chrome App from Google is an IDE for Your Chromebook »,
  31. Saroop, « Chrome Dev Editor: Announcements »
  32. « Chrome Dev Editor is a developer tool for building apps on the Chrome platform: Chrome Apps and Web Apps, in JavaScript or Dart. (NO LONGER IN ACTIVE DEVELOPMENT) - googlearchive/chromedeveditor », sur GitHub,
  33. Ladd, « Announcing DartPad: A friction-free way to explore Dart code », Dart News & Updates, (consulté le )
  34. « Bringing SIMD to the web via Dart » [archive du ]
  35. « Algol Family », c2.com
  36. « The Essence of Google Dart: Building Applications, Snapshots, Isolates », InfoQ
  37. Bracha et Ungar, « Mirrors: design principles for meta-level facilities of object-oriented programming languages », ACM SIGPLAN Notices, ACM, vol. 39, no 10,‎ , p. 331–344 (DOI 10.1145/1035292.1029004, lire en ligne, consulté le )

Voir aussi

Articles connexes

Liens externes