Dart (langage)

Un article de Wikipédia, l'encyclopédie libre.

Dart
Logo.

Date de première version
Auteur Lars Bak et Kasper Lund
Développeur Google
Dernière version 2.9.3 ()
Version en développement 2.10.0-7.3.beta ()
Influencé par CC (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, basé sur la classe, récupérateur de mémoire avec une syntaxe de type C[1]. Dart peut se compiler en code natif ou en JavaScript. Il prend en charge les interfaces, les mixins,les classes abstraites, les génériques réifiés et l' inférence de type[2].

Histoire[modifier | modifier le code]

Dart a été dévoilée 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[3]. Dart 1.0 est sorti le 14 novembre 2013[4].

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[5].

En août 2018, Dart 2.0 est sorti, avec des changements de langue incluant un système de type de son[6].

Dart 2.6 a introduit une nouvelle extension : dart2native. Cette fonction étend la compilation native aux plates-formes de bureau Linux, macOS et 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 composer un programme Dart en exécutables autonomes. Ainsi, selon les représentants de la société, il n'est plus obligatoire d'avoir installé le SDK Dart, les exécutables autonomes peuvent maintenant commencer à fonctionner en quelques secondes. La nouvelle extension est également intégrée à la boîte à outils Flutter, ce qui permet d'utiliser le compilateur sur de petits services (support backend par exemple) [7],[8].

Standardisation

Ecma International a formé le comité technique TC52[9] 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 linguistique Dart en juillet 2014, lors de sa 107e assemblée générale[10], et une deuxième édition en décembre 2014[11]. La dernière spécification est disponible à l'adresse suivante spécification du langage Dart.

Utilisation[modifier | modifier le code]

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 tous les principaux navigateurs sans qu'il soit nécessaire que les navigateurs adoptent Dart. En optimisant la sortie JavaScript compilée pour éviter des vérifications et des opérations coûteuses, le code écrit dans Dart peut, dans certains cas, s'exécuter plus rapidement que le code équivalent écrit à la main à l'aide d'idiomes JavaScript[12].
Autonome
Le kit de développement logiciel (SDK) Dart est livré avec une 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 autonome 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[13].
Compilation anticipée
Le code Dart peut être compilé par 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é par AOT[14].
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[15].

Isolates[modifier | modifier le code]

Pour parvenir à la concordance, Dart utilise des isolats, qui sont des travailleurs indépendants qui ne partagent pas leur mémoire, mais utilisent plutôt la transmission de messages. Cette méthode est similaire aux processus Erlang (voir aussi le modèle Actor). 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[16].

Snapshots[modifier | modifier le code]

Les snapshots sont une partie essentielle de la VM Dart. Les snapshots 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 tout le code du programme et les dépendances préparés et 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
Le dart est un langage très asynchrone. Avec cela, il utilise des isolats pour la simultanéité. Comme ce sont des travailleurs 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 donné, et qui est ensuite transféré à un autre isolat pour la désérialisation.

Applications mobiles natives[modifier | modifier le code]

Google a introduit Flutter pour le développement d'applications mobiles natives sur Android et iOS[17]. 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[modifier | modifier le code]

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[18].

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[19], 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[20].

Editeurs[modifier | modifier le code]

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[21]. 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[22].

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[23], qui est maintenant l'IDE[24] 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[25].

Editeur Chrome Dev[modifier | modifier le code]

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[26].Le projet a ensuite été rebaptisé Chrome Dev Editor (éditeur de développement Chrome)[27]. Il a été construit en Dart, et contient Spark qui est alimenté par Polymer[28].

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[29]. Depuis avril 2019, Chrome Dev Editor n'est plus en développement actif[30].

DartPad[modifier | modifier le code]

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 l 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[31].

SIMD[modifier | modifier le code]

En 2013, John McCutchan a annoncé[32]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[modifier | modifier le code]

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 in Dart 2+, new est un mot optionnel
}

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

Influences d'autres langues[modifier | modifier le code]

Dart est un descendant de la famille des langages ALGOL[33], 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[34]. 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[35] 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[modifier | modifier le code]

  1. « A Tour of the Dart Language », dart.dev (consulté le 9 août 2018)
  2. « The Dart type system », dart.dev
  3. Ladd, « What is Dart », What is Dart?, O'Reilly (consulté le 16 août 2014)
  4. « Dart 1.0: A stable SDK for structured web apps », news.dartlang.org (consulté le 8 août 2018)
  5. Seth Ladd, « Dart News & Updates », dartlang.org
  6. Moore, « Announcing Dart 2 Stable and the Dart Web Platform », Dart, (consulté le 8 août 2018)
  7. « Dart 2.5 brings native compilation to the desktop », Infoworld (consulté le 28 novembre 2019)
  8. « Dart 2.6 released with dart2native », SDtimes (consulté le 28 novembre 2019)
  9. « TC52 - Dart » [archive du ] (consulté le 16 décembre 2013)
  10. Anders Thorhauge Sandholm, « Dart News & Updates », dartlang.org
  11. Anders Thorhauge Sandholm, « Dart News & Updates », dartlang.org
  12. « JavaScript as a compilation target: Making it fast » [archive du ], Dartlang.org (consulté le 18 août 2013)
  13. « An Introduction to the dart:io Library », Dartlang.org (consulté le 21 juillet 2013)
  14. « Flutter FAQ », flutter.io (consulté le 2 octobre 2016)
  15. « Announcing Dart 2.6 with dart2native: Compile Dart to self-contained, native executables » (consulté le 6 décembre 2019)
  16. Moore, « Dart2 Breaking Change: Removing web support for dart:mirrors and dart:isolate », Google Groups,
  17. « Flutter - Beautiful native apps in record time », flutter.dev
  18. « Deployment », angulardart.dev
  19. Ladd, « Dart News & Updates: Why dart2js produces faster JavaScript code from Dart », News.dartlang.org., (consulté le 21 juillet 2013)
  20. « Dart Performance » [archive du ], Dartlang.org. (consulté le 21 juillet 2013)
  21. « Google Releases Dart Editor for Windows, Mac OS X, and Linux » [archive du ] (consulté le 29 novembre 2011)
  22. « Dart plugin for Eclipse is Ready for Preview »
  23. Ladd, « The present and future of editors and IDEs for Dart », Dart News & Updates, (consulté le 18 mai 2015)
  24. « JetBrains Plugin Repository : Dart », Plugins.intellij.net (consulté le 21 juillet 2013)
  25. « Dart Tools », dart.dev (consulté le 15 novembre 2016)
  26. Beaufort, « The chromium team is currently actively working »
  27. « A Chrome app based development environment »
  28. « Spark, A Chrome App from Google is an IDE for Your Chromebook »,
  29. Saroop, « Chrome Dev Editor: Announcements »
  30. « 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 »,
  31. Ladd, « Announcing DartPad: A friction-free way to explore Dart code », Dart News & Updates, (consulté le 18 mai 2015)
  32. « Bringing SIMD to the web via Dart » [archive du ]
  33. « Algol Family », c2.com
  34. « The Essence of Google Dart: Building Applications, Snapshots, Isolates », InfoQ
  35. 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 15 février 2014)

Voir aussi[modifier | modifier le code]

Articles connexes[modifier | modifier le code]

Liens externes[modifier | modifier le code]