Die Firma Google hat die Version 2.15 der Programmiersprache Dart veröffentlicht, die die Entwicklung des grundlegend überarbeiteten Zweigs Dart 2 fortsetzt, der sich durch die Anwendung einer starken statischen Typisierung von der ursprünglichen Version der Sprache Dart unterscheidet (Typen können automatisch abgeleitet werden, weshalb die Angabe von Typen nicht zwingend erforderlich ist, jedoch wird die dynamische Typisierung nicht mehr verwendet und der ursprünglich berechnete Typ wird einer Variablen zugewiesen und unterliegt fortan einer strengen Typprüfung).
Eigenschaften der Sprache Dart:
- Bekannte und leicht zu erlernende Syntax, die für Programmierer von JavaScript, C und Java natürlich ist.
- Schnellstart und hohe Leistung für alle modernen Webbrowser und verschiedene Umgebungen, von tragbaren Geräten bis hin zu leistungsstarken. Server.
- Die Möglichkeit, Klassen und Schnittstellen zu definieren, die Kapselung ermöglichen und die Wiederverwendung vorhandener Methoden und Daten fördern.
- Die Angabe von Typen vereinfacht das Debugging und die Fehlersuche, macht den Code klarer und lesbarer und erleichtert die Überarbeitung und Analyse durch Drittentwickler.
- Unterstützte Typen umfassen verschiedene Arten von Hashes, Arrays und Listen, Warteschlangen, numerische und Zeichenfolgenarten, Typen zur Definition von Datum und Uhrzeit sowie reguläre Ausdrücke (RegExp). Es besteht die Möglichkeit, eigene Typen zu erstellen.
- Zur Organisation der parallelen Ausführung wird empfohlen, Klassen mit dem Attribut isolate zu verwenden, deren Code vollständig in einem isolierten Raum in einem separaten Speicherbereich ausgeführt wird, wobei die Interaktion mit dem Hauptprozess über Nachrichten erfolgt.
- Unterstützung für die Verwendung von Bibliotheken, die die Wartung und das Debugging großer Webprojekte vereinfachen. Externe Implementierungen von Funktionen können als gemeinsame Bibliotheken eingebunden werden. Anwendungen können in Teile zerlegt werden, wobei die Entwicklung jedes Teils einem separaten Team von Programmierern übertragen wird.
- Ein Satz von bereitgestellten Werkzeugen zur Unterstützung der Entwicklung mit der Sprache Dart, einschließlich der Implementierung von Werkzeugen für die dynamische Entwicklung und das Debugging mit On-the-Fly-Codeänderungen ("edit-and-continue").
- Um die Entwicklung in der Programmiersprache Dart zu erleichtern, wird das SDK, der Paketmanager pub, der statische Code-Analyzer dart_analyzer, eine Sammlung von Bibliotheken, die integrierte Entwicklungsumgebung DartPad sowie Plugins mit Dart-Unterstützung für IntelliJ IDEA, WebStorm, Emacs, Sublime Text 2 und Vim bereitgestellt.
- Zusätzliche Pakete mit Bibliotheken und Tools werden über das Repository pub verbreitet, das rund 22.000 Pakete umfasst.
Die wichtigsten Änderungen in der Version Dart 2.15:
- Es wurden Mittel für die schnelle parallele Ausführung von Aufgaben mit isolierten Handlern bereitgestellt. In Mehrkernsystemen führt die Dart-Runtime standardmäßig den Anwendungs-Code auf einem CPU-Kern aus, während andere Kerne für die Ausführung systembezogener Aufgaben wie asynchronen Ein-/Ausgaben, Dateischreibungen oder Netzwerkaufrufe genutzt werden. Für Anwendungen, die ihre Handler parallel ausführen müssen, beispielsweise für die Animationserstellung in der Benutzeroberfläche, gibt es die Möglichkeit, separate Codeblöcke (isolate) zu starten, die voneinander isoliert sind und gleichzeitig mit dem Hauptanwendungsthread auf anderen CPU-Kernen ausgeführt werden. Um Fehler zu vermeiden, die bei gleichzeitiger Ausführung von Code auftreten können, der mit demselben Datensatz arbeitet, ist die gemeinsame Nutzung von veränderbaren Objekten in verschiedenen Isolate-Blöcken untersagt, und zur Interaktion zwischen den Handlern wird ein auf Nachrichtenübertragung basierendes Modell verwendet.
In Dart 2.15 wird ein neues Konzept vorgestellt – Gruppen von Isolaten (isolate groups), das den gemeinsamen Zugriff auf verschiedene interne Datenstrukturen in den Isolate-Blöcken innerhalb einer Gruppe ermöglicht, was die Overhead-Kosten bei der Interaktion von Handlern innerhalb der Gruppe erheblich senkt. Zum Beispiel wird das Starten eines zusätzlichen Isolate-Blocks in einer bestehenden Gruppe 100-mal schneller durchgeführt und benötigt 10 bis 100-mal weniger Speicher als das Starten eines separaten Isolate-Blocks, da die Notwendigkeit zur Initialisierung der Datenstrukturen der Anwendung entfällt.
Obwohl der Zugriff auf veränderbare Objekte in Isolaten weiterhin verboten ist, wird in Gruppen gemeinsam genutzter Heap-Speicher verwendet, was die Übertragung von Objekten von einem Block zum anderen erheblich beschleunigt, ohne ressourcenintensive Kopieroperationen durchführen zu müssen. In der neuen Version ist es auch erlaubt, das Ergebnis des Handlers beim Aufruf von Isolate.exit() zu übergeben, um Daten an den übergeordneten Isolatblock ohne Kopieroperationen zu übermitteln. Darüber hinaus wurde der Nachrichtenübertragungsmechanismus optimiert — kleine und mittlere Nachrichten werden nun etwa acht Mal schneller verarbeitet. Zu den Objekten, die zwischen Isolatblöcken mit dem Aufruf von SendPort.send() übergeben werden können, gehören einige Funktionstypen, Closures und Stack-Traces.
- In den Werkzeugen zur Erstellung von Zeigern auf einzelne Funktionen in anderen Objekten (Tear-offs) wurden die Einschränkungen für die Erstellung solcher Zeiger im Konstruktorcode aufgehoben, was beim Bau von Schnittstellen auf Basis der Flutter-Bibliothek nützlich sein kann. Zum Beispiel, um ein Widget Column zu erstellen, das mehrere Text-Widgets enthält, kann die Methode „.map()“ aufgerufen und die Zeiger an den Konstruktor Text.new des Text-Objekts übergeben werden: class FruitWidget extends StatelessWidget { @override Widget build(BuildContext context) { return Column( children: [‘Apple’, ‘Orange’].map(Text.new).toList()); } }
- Die Möglichkeiten im Zusammenhang mit der Verwendung von Funktionszeigern wurden erweitert. Es wurde die Möglichkeit hinzugefügt, generische (generic) Methoden und Funktionszeiger zu verwenden, um eine nicht-generische Methode und einen Zeiger zu erstellen: T id<T>(T value) => value; var intId = id<int>; // erlaubt in Version 2.15 anstelle von „int Function(int) intId = id;“ const fo = id; // Zeiger auf die Funktion id. const c1 = fo<int>;
- In der Bibliothek dart:core wurde die Unterstützung für Enumerationen (Enum) verbessert. Zum Beispiel kann jetzt der string-Wert von jedem Enum-Wert mit der Methode „.name“ ausgegeben werden, es ist möglich, Werte nach Namen auszuwählen oder Paarwertzuordnungen durchzuführen: enum MyEnum { one, two, three } void main() { print(MyEnum.one.name); // gibt „one“ aus. print(MyEnum.values.byName(‘two’) == MyEnum.two); // gibt „true“ aus. final map = MyEnum.values.asNameMap(); print(map[‘three’] == MyEnum.three); // „true“. }
- Es wurde eine Technik zur Komprimierung von Zeigern implementiert, die eine kompaktere Darstellung von Zeigern in 64-Bit-Umgebungen ermöglicht, wenn für die Adressierung ausreichend ein 32-Bit-Adressraum (nicht mehr als 4 GB RAM) ausreicht. Tests haben gezeigt, dass eine solche Optimierung die Größe des Heaps um etwa 10 % reduzieren kann. Im Flutter SDK ist der neue Modus standardmäßig bereits für Android aktiviert und wird in einer zukünftigen Version auch für iOS eingeplant.
- Das Dart SDK enthält nun Tools zur Fehlersuche und Leistungsanalyse (DevTools), die zuvor in einem separaten Paket bereitgestellt wurden.
- Das Kommando „dart pub“ und die Paketrepositorys pub.dev haben Mittel zur Verfolgung unbeabsichtigter Veröffentlichungen vertraulicher Informationen, wie das Hinterlassen von Zugangsdaten für Continuous-Integration-Systeme und Cloud-Umgebungen, hinzugefügt. Im Falle solcher Leaks wird die Ausführung des Befehls „dart pub publish“ mit einer Fehlermeldung abgebrochen. Bei falschen Auslösungen besteht die Möglichkeit, die Überprüfung über eine Whitelist zu umgehen.
- Im Repository pub.dev wurde die Möglichkeit hinzugefügt, bereits veröffentlichte Paketversionen zurückzuziehen, beispielsweise bei der Entdeckung gefährlicher Fehler oder Sicherheitsanfälligkeiten. Früher praktizierte man zur Behebung solcher Probleme die Veröffentlichung einer nachfolgenden Korrekturversion, aber in einigen Situationen ist es erforderlich, eine bereits veröffentlichte Version zurückzuziehen und ihre weitere Verbreitung sofort zu stoppen (z.B. wenn die Korrektur noch nicht bereit ist oder versehentlich eine stabile Version anstelle einer Testversion veröffentlicht wurde). Nach dem Rückruf wird das Paket in den Befehlen „pub get“ und „pub upgrade“ nicht mehr erkannt, und auf Systemen, die es bereits installiert haben, wird beim nächsten Ausführen von „pub get“ eine spezielle Warnung ausgegeben.
- Ein Schutz gegen die Schwachstelle (CVE-2021-22567) wurde hinzugefügt, die durch die Verwendung von Unicode-Zeichen im Code verursacht wird, die die Anzeigereihenfolge ändern.
- Eine Schwachstelle (CVE-2021-22568) wurde beseitigt, die es ermöglichte, sich als ein anderer Benutzer von pub.dev bei der Veröffentlichung von Paketen auf einen externen Server, der oauth2-Zugangstoken von pub.dev akzeptiert, auszugeben. Diese Schwachstelle könnte zum Angriff auf interne und Unternehmenspaketserver verwendet werden. Entwickler, die Pakete ausschließlich auf pub.dev hosten, sind von diesem Problem nicht betroffen.
Gleichzeitig wurde ein bedeutendes Update des Frameworks für die Benutzeroberflächenerstellung Flutter 2.8 veröffentlicht, das als Alternative zu React Native betrachtet wird und es ermöglicht, auf Basis eines einzigen Codes Anwendungen für die Plattformen iOS, Android, Windows, macOS und Linux zu erstellen sowie Browseranwendungen zu entwickeln. Auf Flutter basiert die Benutzeroberfläche des von Google entwickelten Mikrokernels Fuchsia. Es wird berichtet, dass sich die Anzahl der Anwendungen auf Flutter 2 im Google Play Store in den letzten sechs Monaten von 200.000 auf 375.000 fast verdoppelt hat.
Der Großteil des Flutter-Codes ist in der Programmiersprache Dart implementiert, während die Laufzeit-Engine für die Ausführung von Anwendungen in C++ geschrieben ist. Neben der primären Sprache Dart kann beim Entwickeln von Anwendungen auch das Dart Foreign Function Interface verwendet werden, um Code in C/C++ aufzurufen. Die hohe Ausführungsleistung wird durch die Kompilierung der Anwendungen in Maschinencode für die Zielplattformen erreicht. Das Programm muss dabei nach jeder Änderung nicht neu kompiliert werden – Dart bietet einen Hot Reload-Modus, der es ermöglicht, Änderungen am laufenden Programm vorzunehmen und sofort zu sehen, wie sich das Ergebnis auswirkt.
Zu den Veränderungen in der neuen Version von Flutter gehören die Optimierung der Startgeschwindigkeit und des Speicherverbrauchs auf mobilen Geräten. Die Anbindung von Anwendungen an Backend-Services wie Firebase und Google Cloud wurde vereinfacht. Die Werkzeuge zur Integration mit Google Ads wurden stabilisiert. Die Unterstützung für Kameras und Web-Plugins wurde erheblich verbessert. Neue Mittel zur Vereinfachung der Entwicklung wurden angeboten, darunter ein Widget für die Authentifizierung mit Firebase. Die Engine Flame, die für die Entwicklung von 2D-Spielen mit Flutter gedacht ist, wurde aktualisiert.
Quelle: opennet.ru
