Announcing Dart 3.2[日本語訳]

訳者 はじめに

さくしんです。Dart3.2のブログ記事を Michael Thomsenさんが書いていたので、(自分で’読むために)日本語訳しました。許可は後で取る。
非null型への昇格できるケースが増えたのは非常に嬉しい。

改善された言語機能と開発者体験、そしてWebアプリとWasmに関する最新情報

本日、私たちはDart 3.2を発表します。これには、プライベートファイナルフィールドの非null推進のための新しい言語機能、新しい相互運用性機能による開発者体験の向上、DevToolsでの拡張機能のサポート、そしてWasm(WebAssemblyとしても知られる)を含むWebロードマップの更新が特徴です。

プライベートファイナルフィールドの非null推進

Dart 2.12で導入されて以来、数年が経過しましたが、null安全性はDartの重要な部分となっています。null安全性を使用すると、null可能(値を含むかもしれない、またはnull)と非null可能(常に値を含む)の型を宣言できます。null安全性とフロー分析を組み合わせることで、null可能な変数をより安全な非null型に「昇格」させることができます。

int definitelyInt(int? aNullableInt) {
    if (aNullableInt == null) {
        return 0;
    }
      // フロー解析がこの時点に達した場合、 
   // aNullableInt は安全に非 null int に昇格できる。
    return aNullableInt;
}

Dart 2.12以降、型昇格はnull安全性の核心部分でしたが、ローカル変数に限定されていました。フィールドやトップレベル変数は昇格できませんでした。

class Container {
    final int? _fillLevel;
    Container(this._fillLevel);
    check() {
        if (_fillLevel != null) {
            int i = _fillLevel; // Dart 3.2以前ではエラーになります。
        }
    }
}

この制限は、フロー分析がフィールドがいつ、どのように変更されるかを安全に判断できない複数の複雑なケースによるものでした。Dart 3.2では、フロー分析エンジンを改善し、プライベートファイナルフィールドの型昇格が可能になりました。これにより、上記のコードスニペットはエラーなしで通過します。プライベートかつファイナルなフィールドについては、初期割り当て後に値が変更されないため、一度のチェックで安全と見なされます。プライベートファイナルフィールドの昇格は、Dart 3.2から利用可能で、Dart SDKの下限が3.2以上のプロジェクトに適用されます。

package:lints 3.0の新しいコード分析オプション

コード分析に関して、私たちは標準のコード分析ルールに多くの改善を加えました。このパッケージには、dart createまたはflutter createpackage:flutter_lintsを介して)によって作成された新しいプロジェクトに付属する、デフォルトおよび推奨される静的分析ルールのセットが含まれています。

新しいメジャーバージョンのlintセット、バージョン3.0が現在利用可能です。このリビジョンでは、コアセットに6つのlintと推奨セットに2つのlintが追加されました。これには、pubspec URLの検証、コレクションメソッドが正しい引数で呼び出されていることの検証などのlintが含まれます。変更の完全なリストについては、changelogを確認してください。バージョン3.0は、今後のリリースで新しいプロジェクトのデフォルトになります。既存のプロジェクトでは、今すぐアップグレードできます。

Dart相互運用性の更新

Dartのコア原則として、幅広いプラットフォームでのマルチプラットフォームサポートがあります。しかし、Dartのコード行がこれらのプラットフォームすべてで変更なしに実行されるとしても、大規模なアプリケーションでは、既存のコードとの相互運用が必要な場合がよくあります。これには、古いプロジェクトのコードや、他のライブラリやシステムAPIで利用可能なAPIなどが含まれます。この分野では、ネイティブC APIとの相互運用のためのFFIから始まり、Java、Kotlin、Objective C、Swiftとの相互運用をサポートするための拡張に取り組んでいます。JS相互運用に関するエキサイティングなアップデートについては、下のDart Webセクションをご覧ください。

Dart 3.2では、ネイティブ相互運用に多くの改善が行われました:

  • C FFI用にNativeCallable.isolateLocalコンストラクタを導入しました。これは、任意のDart関数からC関数ポインタを作成します。これは、トップレベル関数からのみ関数ポインタを作成できるPointer.fromFunctionによって提供される機能の拡張です。
  • Objective-Cバインディングジェネレータを更新し、Dart 3.1で追加されたNativeCallable.listenerを使用するようにしました。ジェネレータは、Core Motionのような非同期コールバックを含むAPIを自動的に処理できるようになりました。これらのAPIは以前は、一部のバインディングコードを手作業で書く必要がありました。
  • JavaおよびKotlin相互運用のためのpackage:jnigenを継続的に改善しています。これにより、AndroidのCronet HTTPクライアントをラップするpackage:cronet_httpを、手作業で書かれたバインディングコードから自動生成されたラッパーに移行することができました。
  • ネイティブアセット機能に関する重要な進展を遂げました。これは、ネイティブコードに依存するDartパッケージの配布に関連する多くの問題を解決することを目的としています。これは、FlutterおよびスタンドアロンDartアプリケーションの構築に関与するさまざまなビルドシステムとの統合のための均一なフックを提供することによって行われます。プレビューについては、ドキュメントをご覧ください。

Dartパッケージ用DevTools拡張機能

Dart DevToolsは、純粋なDartアプリとFlutterアプリの両方をサポートするデバッグおよびパフォーマンスツールのスイートです。Dart 3.2およびFlutter 3.16では、パッケージ作者が自分のパッケージ用のカスタムツールを構築し、DevToolsで直接表示できる新しい拡張フレームワーク発表しています。これにより、pub.devのパッケージに含まれるフレームワークが、それらのユースケースに特化したカスタムツールを提供できるようになります。例えば、Serverpodの作者たちは、自分たちのパッケージ用の開発者ツールを構築するために一生懸命作業しており、今後の1.2リリースでDevTools拡張機能を出荷することに興奮しています。

Dart WebとWasmのアップデート

Wasm(WebAssemblyとしても知られています)は、現代のブラウザで実行されるポータブルでプラットフォーム中立なバイナリコード形式を提供する、ウェブブラウザ用の新しい命令形式です。Dartのような高レベルの管理言語はガベージコレクションを使用しており、これがWasm標準に追加されています。Chrome 119では、Wasmのガベージコレクションサポート(Wasm-GCとして知られています)がデフォルトで有効になっています。Wasm-GCサポートはFirefox 120の次の安定リリースでも導入されます。では、Dart、Flutter、およびWasm-GCの状況はどうでしょうか?

DartからWasmへのコンパイラはほぼ機能完了です。チームはパフォーマンスと互換性に非常に満足しています。現在の焦点は、幅広いシナリオで出力が高速になるようにエッジケースを確認することです。

Flutter Webについては、新しい「Skwasm」レンダリングエンジンを完成させました。パフォーマンスを最大化するために、SwasmはコンパイルされたアプリケーションコードをカスタムCanvasKit Wasmモジュールに直接接続し、wasm-to-wasmバインディングを使用します。これはまた、Flutter Webのマルチスレッドレンダリングサポートの最初の反復であり、フレーム時間をさらに改善します。

Flutter WebのWasmが現在の実験的な状態から卒業する前に、まだいくつかのことが残っています:

  • デュアルコンパイル:WasmとJavaScriptの両方の出力を生成し、実行時に機能検出を有効にして、Wasm-GCサポートのあるブラウザとないブラウザの両方をサポートします。
  • モダンJavaScript相互運用性:拡張型に基づいた新しいJS相互運用メカニズムを使用して、JavaScriptおよびWasmをターゲットにした場合に、Dartコード、

ブラウザAPI、およびJSライブラリ間で簡潔で型安全な呼び出しが可能になります。

  • Wasmサポート付きのブラウザAPI:dart:html(および関連するライブラリ)に代わる新しいpackage:webをベースに、モダンなJS相互運用メカニズムを使用します。これにより、JSおよびWasmターゲットの両方でブラウザAPIに簡単にアクセスできるようになります。

私たちは、多くの内部プロジェクトをpackage:webおよび新しいJS相互運用メカニズムに移行し始めており、次の安定リリースでさらなるアップデートがあると予想しています。その間、最新の詳細については、WebAssemblyのサポートのページをご覧ください。

終わりに

今日はこれでおしまいです。Dart 3.2は、dart.devから、または今日のFlutter 3.16(日本語訳)リリースの一部として利用可能です。次回まで、Dartを楽しんでください!