La société Google a publié la version 2.15 du langage de programmation Dart, poursuivant le développement d'une branche radicalement refaite de Dart 2, qui se distingue de la version initiale par l'utilisation d'une typage statique fort (les types peuvent être déduits automatiquement, donc la spécification des types n'est pas obligatoire, mais le typage dynamique n'est plus utilisé et le type initialement déduit est fixé à la variable et ensuite, une vérification stricte du type est appliquée).
Caractéristiques du langage Dart :
- Une syntaxe familière et facile à apprendre, naturelle pour les programmeurs en JavaScript, C et Java.
- Assurance d'un démarrage rapide et d'une haute performance pour tous les navigateurs web modernes et différents types d'environnements, allant des appareils portables aux puissants. serveurs.
- Possibilité de définir des classes et des interfaces, permettant l'encapsulation et la réutilisation des méthodes et données existantes.
- La spécification des types facilite le débogage et l'identification des erreurs, rend le code plus clair et lisible, simplifiant sa révision et son analyse par des développeurs tiers.
- Parmi les types pris en charge : différentes sortes de hachages, tableaux et listes, files d'attente, types numériques et de chaînes, types pour définir des dates et heures, expressions régulières (RegExp). Il est possible de créer ses propres types.
- Pour organiser l'exécution parallèle, il est conseillé d'utiliser des classes avec l'attribut isolate, dont le code s'exécute entièrement dans un espace isolé en mémoire séparée, interagissant avec le processus principal par l'envoi de messages.
- Prise en charge de l'utilisation de bibliothèques qui facilitent la maintenance et le débogage de grands projets web. Les implémentations tierces des fonctions peuvent être intégrées sous forme de bibliothèques partagées. Les applications peuvent être découpées en morceaux et le développement de chaque partie peut être confié à une équipe distincte de programmeurs.
- Un ensemble d'outils prêts à l'emploi pour soutenir le développement en langage Dart, incluant la mise en œuvre d'outils de développement dynamique et de débogage avec correction de code à la volée (« edit-and-continue »).
- Pour simplifier le développement en langage Dart, un SDK est fourni, avec un gestionnaire de paquets pub, un analyseur statique de code dart_analyzer, un ensemble de bibliothèques, un environnement de développement intégré DartPad et des plugins avec support Dart pour IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 et Vim.
- Des packages supplémentaires de bibliothèques et d'outils sont distribués via le dépôt pub, qui compte environ 22 000 paquets.
Principales modifications dans la version Dart 2.15 :
- Des outils ont été fournis pour exécuter rapidement des tâches en parallèle avec l'isolement des gestionnaires. Sur les systèmes multicœurs, le runtime Dart exécute par défaut le code de l'application sur un cœur CPU, tandis que d'autres cœurs sont utilisés pour exécuter des tâches système telles que l'entrée/sortie asynchrone, l'écriture de fichiers ou les appels réseau. Pour les applications qui doivent exécuter leurs gestionnaires en parallèle, par exemple pour le rendu d'animations dans l'interface, il est possible de lancer des blocs de code distincts (isolate), isolés les uns des autres et exécutés sur d'autres cœurs CPU en même temps que le thread principal de l'application. Pour éviter les erreurs dues à l'exécution simultanée de code traitant un même ensemble de données, le partage d'objets modifiables entre différents blocs isolate est interdit, et un modèle basé sur le passage de messages est utilisé pour l'interaction entre les gestionnaires.
Dart 2.15 propose un nouveau concept — les groupes de blocs isolés (isolate groups), permettant d'organiser un accès partagé à différentes structures de données internes dans les blocs isolate d'un même groupe, ce qui réduit considérablement les coûts d'interaction entre les gestionnaires du groupe. Par exemple, lancer un bloc isolate supplémentaire dans un groupe existant s'effectue 100 fois plus rapidement et nécessite 10 à 100 fois moins de mémoire que le lancement d'un bloc isolate autonome, grâce à l'élimination de la nécessité d'initialiser les structures de données du programme.
Bien que l'accès partagé à des objets modifiables reste interdit dans les blocs isolate, la mémoire heap partagée est utilisée dans les groupes, ce qui permet d'accélérer considérablement le transfert d'objets d'un bloc à un autre sans avoir besoin d'opérations de copie lourdes. Dans la nouvelle version, il est également permis de transmettre le résultat du gestionnaire lors de l'appel de Isolate.exit() pour transmettre des données au bloc isolate parent sans opérations de copie. De plus, le mécanisme de transmission des messages a été optimisé : les messages petits et moyens sont maintenant traités environ 8 fois plus rapidement. Les objets pouvant être transmis entre les blocs isolate via l'appel SendPort.send() incluent certains types de fonctions, des fermetures et des traces de pile.
- Les outils pour créer des pointeurs vers des fonctions individuelles dans d'autres objets (tear-off) n'ont plus de restrictions pour la création de tels pointeurs dans le code des constructeurs, ce qui peut être utile lors de la création d'interfaces basées sur la bibliothèque Flutter. Par exemple, pour créer un widget Column incluant plusieurs widgets Text, on peut appeler «.map()» et passer les pointeurs au constructeur Text.new de l'objet Text : class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Les fonctionnalités liées à l'utilisation de pointeurs vers des fonctions ont été étendues. Il est désormais possible d'appliquer des méthodes génériques et des pointeurs de fonction pour créer une méthode non-générique et un pointeur : T id(T value) => value; var intId = id; // autorisé dans la version 2.15 au lieu de «int Function(int) intId = id;» const fo = id; // pointeur vers la fonction id. const c1 = fo;
- La bibliothèque dart:core a amélioré le support des énumérations (enum), par exemple, on peut désormais obtenir la valeur de chaîne de chaque valeur d'énumération à l'aide de la méthode «.name», sélectionner des valeurs par nom ou effectuer des correspondances de paires de valeurs : enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // sera affiché «one». print(MyEnum.values.byName(‘two’) == MyEnum.two); // sera affiché «true». final map = MyEnum.values.asNameMap(); print(map[‘three’] == MyEnum.three); // «true». }
- Une technique de compression des pointeurs a été mise en œuvre, permettant d'utiliser une représentation plus compacte des pointeurs dans des environnements 64 bits, si un espace d'adressage 32 bits suffît (utilisant pas plus de 4 Go de mémoire). Les tests ont montré qu'une telle optimisation permet de réduire la taille du tas d'environ 10 %. Dans le SDK Flutter, ce nouveau mode est activé par défaut pour Android, et il est prévu d'être inclus dans la prochaine version pour iOS.
- Le SDK Dart inclut des outils de débogage et d'analyse de performance (DevTools), qui étaient auparavant fournis dans un package séparé.
- Des outils de suivi des publications accidentelles d'informations sensibles, comme le fait de laisser des identifiants pour des systèmes d'intégration continue et des environnements cloud, ont été ajoutés à la commande « dart pub » et aux dépôts de packages pub.dev. En cas de détection de telles fuites, l'exécution de la commande « dart pub publish » sera interrompue avec un message d'erreur. En cas de faux positif, il est possible de contourner la vérification via une liste blanche.
- La possibilité de retirer une version déjà publiée d'un package a été ajoutée au dépôt pub.dev, par exemple, en cas de découverte de bogues critiques ou de vulnérabilités. Auparavant, pour ce type de corrections, il était pratiqué de publier immédiatement une version corrective, mais dans certaines situations, il est nécessaire d'annuler une version précédemment publiée et de stopper son distribution d'urgence (par exemple, si les corrections ne sont pas encore prêtes ou si une version stable a été publiée à la place d'une version test). Une fois retiré, le package ne sera plus reconnu dans les commandes « pub get » et « pub upgrade », et sur les systèmes qui l'ont déjà installé, un avertissement spécial sera affiché lors de la prochaine exécution de « pub get ».
- Une protection contre la vulnérabilité (CVE-2021-22567), causée par l'utilisation de caractères unicode dans le code qui modifient l'ordre d'affichage, a été ajoutée.
- Une vulnérabilité (CVE-2021-22568) permettant de se faire passer pour un autre utilisateur sur pub.dev lors de la publication de packages sur un serveur tiers acceptant des tokens d'accès oauth2 de pub.dev a été corrigée. Cette vulnérabilité pourrait être utilisée pour attaquer des serveurs de packages internes et d'entreprise. Les développeurs publiant uniquement sur pub.dev ne sont pas concernés par ce problème.
Un lancement majeur du framework Flutter 2.8 pour le développement d'interfaces utilisateurs a été présenté, considéré comme une alternative à React Native, permettant de créer des applications pour iOS, Android, Windows, macOS et Linux à partir d'une seule base de code, ainsi que des applications pouvant fonctionner dans des navigateurs. Flutter est utilisé pour la couche interface de l'OS à micro-noyau Fuchsia en développement chez Google. Il est observé que, ces six derniers mois, le nombre d'applications utilisant Flutter 2 sur le Google Play Store a augmenté de 200 000 à 375 000, soit presque le double.
La majeure partie du code Flutter est écrite en Dart, tandis que le moteur d'exécution pour exécuter les applications est développé en C++. Lors du développement d'applications, en plus du langage Dart natif de Flutter, il est possible d'utiliser l'interface Dart Foreign Function pour appeler du code en C/C++. Une haute performance d'exécution est atteinte grâce à la compilation des applications en code machine pour les plateformes cibles. De plus, le programme n'a pas besoin d'être recompilé après chaque modification — Dart propose un mode de rechargement à chaud, permettant d'apporter des modifications à une application en cours d'exécution et d'évaluer immédiatement les résultats.
Parmi les changements de la nouvelle version de Flutter, on note l'optimisation de la vitesse de lancement et de la consommation de mémoire sur les appareils mobiles. La connexion des applications aux services backend, tels que Firebase et Google Cloud, a été simplifiée. Les outils d'intégration avec Google Ads ont été stabilisés. Le support des caméras et des plugins web a été considérablement amélioré. De nouveaux outils de simplification du développement ont été proposés, par exemple, un widget d'authentification utilisant Firebase a été ajouté. Le moteur Flame, destiné à la création de jeux 2D avec Flutter, a été mis à jour.
Source : opennet.ru
