# Dart (langage)

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++. 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.

## 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. Dart 1.0 est sorti le 14 novembre 2013.
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.
En août 2018, Dart 2.0 est sorti, avec des changements du langage incluant un système de typage plus sain.
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)$^,$.

### Standardisation

Ecma International a formé le comité technique TC52 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, et sa deuxième édition en décembre 2014. 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.

### 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.

### 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.

### 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.

## 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.

## 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. 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.
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, 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.

## É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. 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.
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, qui est maintenant l'IDE 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. Depuis 2020, le plugin Dart est disponible sur Android Studio.

### É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.Le projet a ensuite été rebaptisé Chrome Dev Editor (éditeur de développement Chrome). Il a été construit en Dart, et contient Spark qui est alimenté par Polymer.
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. Depuis avril 2019, Chrome Dev Editor n'est plus en développement actif.

### 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.

## SIMD

En 2013, John McCutchan a annoncé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 :
Une fonction pour calculer le nième nombre de Fibonacci :
Une classe simple:

## Influences d'autres langages

Dart est un descendant de la famille des langages ALGOL, 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. 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 de Gilad Bracha (qui est membre de l'équipe Dart) et David Ungar et a été implémentée à l'origine dans Self.