Dart 2.2 angekündigt: Effizienterer Maschinencode, Unterstützung für Set-Literale

Quelle [Ankündigung von Dart 2.2: Schnellerer nativer Code, Unterstützung für Set-Literale]

Heute (26. Februar 2019) geben wir die Veröffentlichung des Dart 2.2 SDK bekannt - eines Updates für Dart 2, das eine verbesserte AOT- Code-Leistung (Pre-of-Time) und Unterstützung für Set-Literale bietet.

Bild

Verbesserung der Dartleistung für die Flatterentwicklung


Wir setzen unsere Arbeit fort, um AOT-kompilierten Code wie Flutter-Anwendungen noch schneller zu machen. In Dart 2.1 haben wir die Kosten für die Typprüfung gesenkt , indem wir die Kosten für die Typprüfung sowohl für von AOT kompilierten Code als auch für Code, der auf einer virtuellen Maschine mit JIT-Kompilierung (Just-in-Time) ausgeführt wird, erheblich gesenkt haben.

In Dart 2.2 haben wir uns auf die Leistung von AOT-kompiliertem Code konzentriert und die Leistung von Mikrobenchmarks um 11-16% verbessert (indem wir die Größe des Codes um ~ 1% erhöht haben). Diese Verbesserung ist das Ergebnis von Arbeiten über mehrere Quartale, um die Kosten für statische Anrufe zu senken. Unser optimierter AOT-Code kann das angeforderte Objekt jetzt direkt über einen PC-Aufruf (d. H. Über den Programmzähler ) aufrufen. Zuvor mussten wir mehrmals im Objektpool suchen, um die gewünschte Adresse zu ermitteln. Diese Optimierungen sind besonders nützlich, wenn der Code viele Konstruktoren und statische Methodenaufrufe enthält, z. B. Flutter-Benutzeroberflächencode, der viele Widgets enthält.

Unterstützung für Set-Literale in Dart 2.2


Die Hauptbibliothek von Dart (dart: core) enthält mehrere Sammlungsklassen: Maps , Lists und Sets . Karten sind Sätze von Schlüssel-Wert-Paaren. Listen sind geordnete Folgen von Werten, auf die jeweils über den Index zugegriffen werden kann und die mehrmals auftreten können. Mengen sind ungeordnete Auflistungen von Werten, in denen jeder Wert nur einmal vorkommen kann und in denen effektiv überprüft werden kann, ob die Auflistung einen Wert enthält.

Dart-Sammlungen werden normalerweise mit Konstanten zur Kompilierungszeit initialisiert, und Dart bietet eine praktische Syntax zum Schreiben dieser Initialisierung. In der Dart-Liste können Sie wie folgt initialisieren:

const List<String> releases = ['Dart 2.0', 'Dart 2.1', 'Dart 2.2']; 

Bisher unterstützte Dart nur die Literal-Syntax für List und Map, sodass die Initialisierung von Set umständlich war, da wir über die Liste initialisieren mussten:

 Set<String> currencies = Set.of(['EUR', 'USD', 'JPY']); 

Dieser Code ist nicht nur unpraktisch und ineffizient. Das Fehlen einer wörtlichen Unterstützung verhindert die Erstellung eines unveränderlichen Satzes zur Kompilierungszeit. Initialisieren Sie das Set mit der zusätzlichen Literal-Unterstützung von Set in Dart 2.2 und machen Sie es mit einer praktischen neuen Syntax unveränderlich:

 const Set<String> currencies = {'EUR', 'USD', 'JPY'}; 

Echte Beispiele für die Verwendung von Set-Literalen mit dem Befehl Flutter finden Sie hier . Für einen tieferen Einblick in das Problem empfehlen wir Ihnen, sich mit der aktualisierten Dart 2.2-Sprachtour vertraut zu machen.

Innovation mit dem Dart 2 Common Front-End (CFE)


Dart bietet verschiedene eigene Implementierungen an: die von Flutter verwendete Dart-VM, den dart2js-Compiler und den Dart-Dev-Compiler (dartdevc), die alle den Common Front-End-Compiler verwenden. Das Dart Common Front End (CFE) analysiert den Dart-Code, führt eine Typinferenz durch und übersetzt den Dart in eine untergeordnete Zwischensprache, die die Back-End-Compiler als Eingabe akzeptieren.

Set-Literale sind ein Beispiel für ein Sprachkonstrukt, das wir dank CFE schnell implementieren konnten. Der Code zum Parsen von Set-Literalen und zum Durchführen von Typinferenzen wurde einmal mit CFE für alle Implementierungen implementiert. Darüber hinaus haben wir eine Übergangsimplementierung erstellt, die von Back-End-Compilern in der Anfangsphase verwendet werden kann. In einer Zwischenimplementierung wurde eine veränderbare Version des angegebenen Satzes von Literalen während der Kompilierung in die entsprechende Form übersetzt:

 Set<String> currencies = Set<String>()..add('EUR')..add('USD')..add('JPY'); 

Eine Zwischenimplementierung konstanter Set-Literale unterscheidet sich darin, dass sie nicht schrittweise in Teilen zusammengesetzt werden können. Stattdessen haben wir dies in Form einer privaten unveränderlichen Set-Klasse implementiert, die eine unveränderliche Map umschließt, wobei Set-Elemente Map-Schlüssel sind:

 const Set<String> currencies = _UnmodifiableSet<String>({'EUR': null, 'USD': null, 'JPY': null}); 

Die unveränderliche Set-Klasse implementiert Methoden in der Set-Schnittstelle und delegiert sie an die interne Map.

Im Allgemeinen konnten wir Set-Literale zunächst ausschließlich als Funktion von CFE implementieren. Das Back-End könnte sofort die CFE-Implementierung verwenden und später seine eigene Unterstützung implementieren. Dies ermöglichte es den Back-End-Compilern, ihre Unterstützung zu verschieben, bis die Leistungsaspekte dieser Funktion besser verstanden wurden.

Dart 2.2 Spezifikation


Dart 2 war ein so bedeutendes Update für Dart, dass wir eine Weile gebraucht haben, um die offizielle Sprachspezifikation zu aktualisieren und alle von uns vorgenommenen Änderungen zu erfüllen. Wir haben diese Arbeit endlich abgeschlossen und die Spezifikation wurde auf Version Dart 2.2 aktualisiert. Wir haben auch die Sprachspezifikation in das neue Repository verschoben und eine kontinuierliche Integration hinzugefügt, um sicherzustellen, dass die Spezifikation im PDF-Format ständig aktualisiert wird, wenn sich zukünftige Versionen der Dart-Sprache weiterentwickeln. Sowohl 2.2 als auch zukünftige Dart 2.x-Spezifikationen sind auf der Seite mit den Dart-Spezifikationen verfügbar.

So installieren Sie Dart 2.2


Das Dart SDK 2.2 ist ab heute auf der Dart-Homepage verfügbar. Wenn Sie ein Flutter-Entwickler sind, ist Dart 2.2 bereits enthalten. (Hinweis: Auf dem Befehl der Flutter Doctor-Konsole melden die aktuellen Flutter Master- und Dev-Kanäle Dart 2.2. Die heutige stabile Version von Flutter 1.2 gibt Dart 2.1.2 aus. Diese Version verfügt über dieselben Funktionen wie Dart 2.2.)

Das ist alles für jetzt. Wir wünschen Ihnen viel Spaß mit Dart 2.2!



Vielen Dank für Ihre Hilfe bei der Übersetzung von PsyHaSTe

Source: https://habr.com/ru/post/de442014/


All Articles