Dart 2.2の発表:より効率的なマシンコード、セットリテラルのサポート

ソース[Dart 2.2の発表:ネイティブコードの高速化、セットリテラルのサポート]



本日(2019年2月26日)、Dart 2.2 SDKのリリースを発表します。これは、Dart 2の更新であり、 事前(AOT)コードパフォーマンスの向上とSetリテラルのサポートを提供します。



画像



フラッター開発のためのDartパフォーマンスの改善



FlutterアプリケーションなどのAOTでコンパイルされたコードをさらに高速にするための作業を続けています。 Dart 2.1では、AOTによってコンパイルされたコードと、JIT(ジャストインタイム)コンパイルを使用して仮想マシンで実行されるコードの両方のタイプチェックのコストを大幅に削減することにより、タイプチェックのコストを削減しました



Dart 2.2では、AOTでコンパイルされたコードのパフォーマンスに焦点を当て、 マイクロベンチマークでのパフォーマンスを11〜16%改善しまし (コードのサイズを約1%増やしました)。 この改善は、静的呼び出しのコストを削減するための、数四半期にわたる作業の結果です。 最適化されたAOTコードは、PCコールを使用して(つまり、 Program counterを使用して)要求されたオブジェクトを直接呼び出すことができます。 これに先立って、必要なアドレスを決定するために、オブジェクトのプールで数回検索する必要がありました。 これらの最適化は、コードに多くのコンストラクターと静的メソッド呼び出しが含まれる場合(特に、多くのウィジェットを含むFlutterユーザーインターフェイスコードなど)に役立ちます。



Dart 2.2でのリテラル設定のサポート



メインのDartライブラリ(dart:core)には、 MapsLists 、およびSetsのいくつかのコレクションクラスが含まれています。 マップはキーと値のペアのセットです。 リストは値の順序付けられたシーケンスであり、それぞれはインデックスを使用してアクセスでき、複数回発生する可能性があります。 セットは順序付けられていない値のコレクションであり、各値は一度しか出現できず、コレクション内に値があるかどうかを効果的に確認できる場所です。



Dartコレクションは通常コンパイル時の定数で初期化され、Dartはこの初期化を記述するための便利な構文を提供します。 Dartリストでは、次のように初期化できます。



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





以前は、Dartはリストとマップのリテラル構文のみをサポートしていたため、リストを介して初期化する必要があるため、Setの初期化は面倒でした。



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





このコードは単に不便で非効率的ではありません。 リテラルサポートがないため、コンパイル時に不変のSetが作成されません。 Dart 2.2でのセットリテラルサポートの追加により、セットを初期化し、便利な新しい構文を使用して不変にします。



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





FlutterコマンドでSetリテラルを使用する実際の例は、 ここにあります 。 この問題をより深く理解するには、 更新されたDart 2.2言語ツアーに慣れることをお勧めします。



Dart 2共通フロントエンド(CFE)で革新する



Dartは、Flutterが使用するDart VM、dart2jsコンパイラ、およびDart devコンパイラ(dartdevc)の独自の実装をいくつか提供します。これらはすべて共通フロントエンドコンパイラを使用します。 Dart Common Front End(CFE)は、Dartコードを解析し、型推論を実行し、Dartを下位レベルの中間言語に変換します。これは、バックエンドコンパイラが入力として受け入れます。



セットリテラルは、CFEのおかげですぐに実装できた言語構造の例です。 Setリテラルの解析と型推論の実行のためのコードは、すべての実装でCFEを使用して一度実装されました。 さらに、初期段階でバックエンドコンパイラが使用できる移行実装を作成しました。 中間実装では、指定されたリテラルのセットの可変バージョンが、コンパイル中に同等の形式に変換されました。



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





定数Setリテラルの中間実装は、部分的に徐々に組み立てることができないという点で異なります。 代わりに、Set要素がMapキーである不変のMapをラップするプライベートな不変のSetクラスの観点からこれを実装しました。



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





不変のSetクラスは、Setインターフェイスでメソッドを実装し、それらを内部マップに委任します。



一般に、最初にCFE専用の関数としてSetリテラルを実装できました。 バックエンドはすぐにCFE実装を使用し、後で独自のサポートを実装できます。 これにより、バックエンドコンパイラは、この関数のパフォーマンスの側面がよりよく理解されるまで、サポートを延期できました。



Dart 2.2仕様



Dart 2はDartにとって非常に重要な更新であったため、行ったすべての変更に対応するために公式言語仕様を更新するのに時間がかかりました。 最終的にこの作業を完了し、仕様をバージョンDart 2.2に更新しました。 また、言語仕様を新しいリポジトリに移動し、継続的な統合を追加して、Dart言語の将来のバージョンが進化するにつれて仕様がPDF形式で常に更新されるようにしました。 2.2および将来のDart 2.x仕様は、Dart仕様ページで入手できます



Dart 2.2のインストール方法



Dart SDK 2.2は、今日からDartホームページで入手できます。 Flutter開発者の場合、Dart 2.2はすでに含まれています。 (注:flutter doctorコンソールコマンドで、現在のFlutterマスターおよび開発チャンネルはDart 2.2を報告します。Flutter1.2の今日の安定バージョンは Dart 2.1.2を出力します。このバージョンはDart 2.2と同じ機能を備えています)。



今のところすべてです。 Dart 2.2をお楽しみください!






PsyHaSTeの翻訳を手伝ってくれてありがとう



All Articles