訳者はじめに
FltuterとDartの3ヶ月ごとのバージョンアップに対してブログ記事がありますので、そちらの日本語訳をさせていたただいております。誤訳・改善点があればご連絡いただけると助かります。
こちらはMichael Thomsenさんの「Announcing Dart 3.4」の記事を訳しました。
はじめに
Dart 3.4が本日リリースされた!このリリースでは、Flutter 3.22 / Dart 3.4 / IO24の投稿でDartとFlutterの共同作業を紹介しているので、スクープの全容はそちらをご覧いただきたい。この投稿では、WebAssemblyのサポートを紹介し、今年のDart言語の主要なロードマップ項目の1つについて詳しく説明します: マクロ
WebAssembly アップデート
本日、最新のFlutter 3.22安定版リリースでFlutter Web appsがWebAssembly (Wasm)を完全にサポートすることを発表できることを嬉しく思います!
これはDartとFlutter全体で数年にわたる投資でした。もしあなたが開発についてきているのであれば、私たちの漸進的な開発を見てきたことでしょう:
- WasmGC提案の標準化、
- WasmGCコードを生成するための全く新しいDartコンパイラバックエンドを追加すること、そして
- WasmGCコードを生成するための全く新しいDartコンパイラバックエンドの追加、Revamping WebとJavaScriptの相互運用をWasmをサポートするために最適化しました。
私たちはWebAssemblyへの投資を続けます。次の取り組みでは、純粋なDartアプリでWasmを完全にサポートできるようにし、いくつか欠けている機能(遅延ロードなど)を完成させる予定です。Dart での Wasm コンパイルのためのエンドツーエンドのツールはまだ開発中ですが、いくつかの一時的なステップを踏むだけで、現在安定版で try the preview を試すことができます。将来的には、wasmtime や wasmer のような標準的な Wasm ランタイムのように、Dart で Wasm を JS-environments 以外でも サポートしたいと考えています。
Dartマクロ: 開発の抽象度を上げる
我々は、Dartマクロシステムの設計に長年を費やしてきました。Dartでの開発体験を向上させるために、マクロはコード生成のようなメタプログラミングのソリューションを提供します。このソリューションは、開発者に最大のパフォーマンス、効率性、生産性を提供するためにDart言語に組み込まれています。今、この体験のプレビューを提供する準備が整いました!
Dart開発者にとっての長年の悩みの種は、JSONデータのシリアライズとデシリアライズという、些細でありながら退屈なパターンでした。再利用可能で十分に強力なソリューションを作ることは、パフォーマンス上の理由から実行時のリフレクションをサポートしていないDartでは困難です。代替案として、私たちはJsonSerializableのようなコード生成ソリューションに依存してきました。これらは、コード自体の前に実行される外部ツールに依存しており、開発者の体験を複雑にしています。
本日、JSON のシリアライズとデシリアライズのための抜本的な新しいアプローチ、JsonCodable マクロのプレビューを発表します。
マクロとは、コンパイル時に 他のコードをイントロスペクトすることで、より多くのコードを生成するコードの一種です。例えば、新しいJsonCodableマクロを適用したDartクラスのVehicleを以下に示します:
@JsonCodable()
class Vehicle {
final String description;
final int wheels;
Vehicle(this.description, this.wheels);
}
void main() {
final jsonString = Vehicle('bicycle', 2).toJson();
print('Vehicle serialized: $jsonString');
}
では、どのように動作するのでしょうか?toJson()
メソッド(とそれに付随する fromJson()
コンストラクタ)はどこから来たのでしょうか?これは、開発者の経験を簡素化するために設計された、新しいマクロシステムの実験的な実装です。Dart コンパイラは @JsonCodable()
アノテーションを見つけると、即座に JsonCodable マクロの定義をリアルタイムに探し出し、実行を開始します。これにより、マクロは次のようになる:
-
新しい"拡張クラス "を作成します。既存のクラスに新しい宣言を追加できる新しい言語構成体です。
-
開発者が定義した
Vehicle
クラスを読み、それがdescription
とwheels
という2つのフィールドを持っていることを確認する。 -
拡張クラスに新しい
toJson
メソッドシグネチャを追加する。 -
description
とwheels
のシリアライズを処理するためにtoJson
メソッドの本体を埋める。
これらすべてが滞りなく行われる。統合されたエクスペリエンスは、このスクリーンキャストが示すように、ホットリロードのような既存の開発者のワークフローをサポートします:
マクロの使用感を示すスクリーンキャスト: 最初はtoJsonコード補完は存在しないが、クラスに@JsonCodableを追加すると、toJsonコード補完がすぐに表示される。
長期的なマクロの目標
最終的なゴールは、コミュニティが独自のマクロを作成できるようにすることである。これにより、Dartプログラミングの抽象化レベルが向上する。例えば、highest votedのDart言語機能であるデータクラスを例にとってみましょう。私たちは、Dartにデータクラスの組み込みサポートを追加することを検討しましたが、そのような構成体が標準を設定するために何をサポートすべきかについて、意見が大きく異なることを知りました。フィールドは immutable
であるべきなのか?equalsをサポートすべきか?hashCode
はどうだろう?もしかしたら toString
も?私たちは、マクロシステムをサポートするのがより良いアプローチだろうという結論に達した。コミュニティは独自の抽象化を作成することができ、よりスケーラブルな実験と多様性を可能にする。
このような強力なマクロシステムを設計し、実装するのは大変な仕事だ。私たちは、コードの補助や補完、コード分析、ホットリロードなど、Dart開発者の中核的なユースケースに有害なパフォーマンス上の影響を与えないような方法でそれを行うことを決意しています。これを念頭に置き、段階的なアプローチを取っています:
- 本日のリリースでは、ユーザーがマクロを使用する開発者エクスペリエンスに慣れることができるように、単一のマクロである
JsonCodable
のプレビューを公開しています。 - このマクロの展開がうまくいけば、後のリリースでJSONマクロを安定版として卒業させたいと考えています。
- 同時に、基礎となるマクロ システムの設計と実装の完成に取り組んでいます。パフォーマンスと安定性に自信が持てたら、最終的な目標は、Dart 開発者コミュニティが独自のマクロを定義できるようにすることです。
これらの段階を完了するには、まだ多くの作業が残っています。それまでの間、ドキュメントを読んで Dart マクロシステム の詳細を学んだり、JsonCodable マクロ のプレビューを試したりすることができます。
その他の改善点
このリリースには、可能な限り最高のバージョンの Dart を提供するための継続的な開発がすべて含まれています。今回のリリースでは、以下の改善を行いました:
- アナライザーのコード補完バグの50%以上を解決しました。(引き続き issues を提出してください!)
- 条件式、if-null式、switch式の型解析と言語仕様の整合性を改善しました(changelog)。
- Dart VMの技術的負債を返済するため、dart:cliライブラリから不完全で一貫性のないツールを削除しました。
- 新しい *
dart:js_interop
ライブラリを改善するために、いくつかの不備に対処しました。
全容は Changelog をチェックしてほしい!私たちの共同作業の全容については、このリリースに関する共同 Dart and Flutter blog post を読むことをお忘れなく!