Langage de programmation Dart 2.15 et framework Flutter 2.8 disponibles

Google a publié la sortie du langage de programmation Dart 2.15, qui poursuit le développement d'une branche radicalement repensée de Dart 2, qui diffère de la version originale du langage Dart par l'utilisation d'un typage statique fort (les types peuvent être déduits automatiquement, donc la spécification des types n'est pas nécessaire, mais le typage dynamique n'est plus utilisé et le type initialement calculé est attribué à la variable et une vérification de type stricte est ensuite appliquée).

Caractéristiques du langage Dart :

  • Syntaxe familière et facile à apprendre, naturelle pour les programmeurs JavaScript, C et Java.
  • Garantir un lancement rapide et des performances élevées pour tous les navigateurs Web modernes et divers types d'environnements, des appareils portables aux serveurs puissants.
  • La possibilité de définir des classes et des interfaces qui permettent l'encapsulation et la réutilisation de méthodes et de données existantes.
  • La spécification de types facilite le débogage et l'identification des erreurs, rend le code plus clair et plus lisible et simplifie sa modification et son analyse par les développeurs tiers.
  • Les types pris en charge incluent : différents types de hachages, tableaux et listes, files d'attente, types numériques et chaînes, types permettant de déterminer la date et l'heure, expressions régulières (RegExp). Il est possible de créer vos propres types.
  • Pour organiser l'exécution parallèle, il est proposé d'utiliser des classes avec l'attribut isolate, dont le code est exécuté entièrement dans un espace isolé dans une zone mémoire distincte, interagissant avec le processus principal en envoyant des messages.
  • Prise en charge de l'utilisation de bibliothèques qui simplifient la prise en charge et le débogage de grands projets Web. Des implémentations tierces de fonctions peuvent être incluses sous la forme de bibliothèques partagées. Les applications peuvent être divisées en parties et confier le développement de chaque partie à une équipe distincte de programmeurs.
  • Un ensemble d'outils prêts à l'emploi pour prendre en charge le développement dans le langage Dart, y compris la mise en œuvre d'outils de développement et de débogage dynamiques avec correction de code à la volée (« modifier et continuer »).
  • Pour simplifier le développement dans le langage Dart, il est livré avec un SDK, un gestionnaire de packages pub, un analyseur de code statique dart_analyzer, un ensemble de bibliothèques, un environnement de développement intégré DartPad et des plugins compatibles Dart pour IntelliJ IDEA, WebStorm, Emacs, Sublime Text. 2 et Vim.
  • Des packages supplémentaires contenant des bibliothèques et des utilitaires sont distribués via le référentiel pub, qui contient environ 22 XNUMX packages.

Changements majeurs dans la version Dart 2.15 :

  • Fournit des outils pour une exécution parallèle rapide de tâches avec isolation des gestionnaires. Sur les systèmes multicœurs, le runtime Dart exécute par défaut le code d'application sur un cœur de processeur et utilise d'autres cœurs pour effectuer des tâches système telles que les E/S asynchrones, l'écriture dans des fichiers ou les appels réseau. Pour les applications qui doivent exécuter leurs gestionnaires en parallèle, par exemple pour restituer une animation dans l'interface, il est possible de lancer des blocs de code séparés (isoler), isolés les uns des autres et exécutés sur d'autres cœurs de processeur simultanément avec le thread principal de l'application. . Pour se protéger contre les erreurs qui surviennent lors de l'exécution simultanée de code travaillant avec le même ensemble de données, le partage d'objets mutables dans différents blocs isolés est interdit et un modèle de transmission de messages est utilisé pour l'interaction entre les gestionnaires.

    Dart 2.15 introduit un nouveau concept : les groupes de blocs isolés (groupes isolés), qui vous permettent d'organiser l'accès partagé à diverses structures de données internes dans des blocs isolés faisant partie du même groupe, ce qui peut réduire considérablement les frais généraux lors de l'interaction entre les gestionnaires d'un groupe. . Par exemple, le lancement d'un bloc d'isolation supplémentaire dans un groupe existant est 100 fois plus rapide et nécessite 10 à 100 fois moins de mémoire que le lancement d'un bloc d'isolation séparé, en raison de l'élimination du besoin d'initialiser les structures de données du programme.

    Malgré le fait que les blocs isolés d'un groupe interdisent toujours l'accès partagé aux objets mutables, les groupes utilisent une mémoire tas partagée, ce qui peut accélérer considérablement le transfert d'objets d'un bloc à un autre sans qu'il soit nécessaire d'effectuer des opérations de copie gourmandes en ressources. La nouvelle version vous permet également de transmettre le résultat du gestionnaire lors de l'appel d'Isolate.exit() pour transférer des données vers le 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 désormais traités environ 8 fois plus rapidement. Les objets qui peuvent être transmis entre les isolats à l'aide de l'appel SendPort.send() incluent certains types de fonctions, de fermetures et de traces de pile.

  • Dans les outils de création de pointeurs vers des fonctions individuelles dans d'autres objets (tear-off), les restrictions sur la création de pointeurs similaires dans le code constructeur ont été supprimées, 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 Colonne qui inclut plusieurs widgets Texte, vous pouvez appeler ".map()" et transmettre des pointeurs vers le constructeur Text.new de l'objet Texte : class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children : ['Apple', 'Orange'].map(Text.new).toList()); } }
  • Les possibilités liées à l'utilisation de pointeurs de fonction ont été élargies. Ajout de la possibilité d'utiliser des méthodes génériques et des pointeurs de fonction pour créer une méthode et un pointeur non génériques : T id (valeur T) => valeur ; var intId = identifiant ; // autorisé dans la version 2.15 au lieu de "int Function(int) intId = id;" const fo = identifiant ; // pointeur vers l'identifiant de la fonction. const c1 = fo ;
  • La bibliothèque dart:core a amélioré la prise en charge des énumérations, par exemple, vous pouvez désormais générer une valeur de chaîne à partir de chaque valeur d'énumération à l'aide de la méthode ".name", sélectionner des valeurs par nom ou faire correspondre des paires de valeurs : enum MyEnum { one , deux, trois } void main() { print(MyEnum.one.name); // "un" sera imprimé. print(MyEnum.values.byName('two') == MyEnum.two); // "true" sera imprimé. carte finale = MyEnum.values.asNameMap(); print(map['trois'] == MonEnum.trois); // "vrai". }
  • Une technique de compression de pointeur a été implémentée qui permet d'utiliser une représentation plus compacte des pointeurs dans des environnements 64 bits si un espace d'adressage de 32 bits est suffisant pour l'adressage (pas plus de 4 Go de mémoire sont utilisés). Des tests ont montré qu'une telle optimisation permet de réduire la taille du tas d'environ 10 %. Dans le SDK Flutter, le nouveau mode est déjà activé par défaut pour Android et devrait être activé pour iOS dans une prochaine version.
  • Le SDK Dart comprend des outils de débogage et d'analyse des performances (DevTools), qui étaient auparavant fournis dans un package séparé.
  • Des outils ont été ajoutés à la commande « dart pub » et aux référentiels de packages pub.dev pour suivre la publication accidentelle d'informations confidentielles, par exemple en laissant les informations d'identification pour les systèmes d'intégration continue et les environnements cloud à l'intérieur du package. Si de telles fuites sont détectées, l'exécution de la commande « Dart Pub Publish » sera interrompue par un message d'erreur. En cas de faux positif, il est possible de contourner le contrôle via une liste blanche.
  • La possibilité de révoquer une version déjà publiée d'un package a été ajoutée au référentiel pub.dev, par exemple si des erreurs ou des vulnérabilités dangereuses sont découvertes. Auparavant, pour de telles corrections, la pratique consistait à publier une version corrective, mais dans certaines situations, il est nécessaire d'annuler la version existante et d'arrêter de toute urgence sa distribution ultérieure (par exemple, si la correction n'est pas encore prête ou si une version complète a été publiée par erreur au lieu d'une version test). Après révocation, le package n'est plus identifié dans les commandes « pub get » et « pub update », et sur les systèmes qui l'ont déjà installé, un avertissement spécial est émis lors de la prochaine exécution de « pub get ».
  • Ajout d'une protection contre une vulnérabilité (CVE-2021-22567) causée par l'utilisation de caractères Unicode dans le code qui modifient l'ordre d'affichage.
  • Correction d'une vulnérabilité (CVE-2021-22568) qui vous permet d'usurper l'identité d'un autre utilisateur pub.dev lors de la publication de packages sur un serveur tiers qui accepte les jetons d'accès pub.dev oauth2. Par exemple, la vulnérabilité pourrait être utilisée pour attaquer les serveurs de packages internes et d'entreprise. Les développeurs qui hébergent uniquement des packages sur pub.dev ne sont pas concernés par ce problème.

Dans le même temps, une version importante du framework d'interface utilisateur Flutter 2.8 a été présentée, qui est considérée comme une alternative à React Native et permet, sur la base d'une base de code unique, de publier des applications pour iOS, Android, Windows, macOS et Plateformes Linux, ainsi que créer des applications à exécuter dans les navigateurs. Un shell personnalisé pour le système d'exploitation du micro-noyau Fuchsia développé par Google est construit sur la base de Flutter. Il est à noter qu'au cours des six derniers mois, le nombre d'applications Flutter 2 dans le Google Play Store est passé de 200 375 à XNUMX XNUMX, soit presque deux fois.

La partie principale du code Flutter est implémentée dans le langage Dart et le moteur d'exécution pour l'exécution des applications est écrit en C++. Lors du développement d'applications, en plus du langage Dart natif de Flutter, vous pouvez utiliser l'interface Dart Foreign Function pour appeler du code C/C++. Des performances d'exécution élevées sont obtenues en compilant les applications en code natif pour les plates-formes cibles. Dans ce cas, le programme n'a pas besoin d'être recompilé après chaque modification - Dart propose un mode de rechargement à chaud qui vous permet d'apporter des modifications à une application en cours d'exécution et d'évaluer immédiatement le résultat.

Parmi les changements apportés à 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. Il est plus facile de connecter des applications à des services backend tels que Firebase et Google Cloud. Les outils d'intégration avec Google Ads ont été stabilisés. La prise en charge des caméras et des plugins Web a été considérablement améliorée. De nouveaux outils ont été proposés pour simplifier le développement, par exemple, un widget a été ajouté pour l'authentification via Firebase. Le moteur Flame, conçu pour développer des jeux 2D avec Flutter, a été mis à jour.

Source: opennet.ru

Ajouter un commentaire