Dart 2.1の概要と所感
Dart 2.1がリリースされた。
https://medium.com/dartlang/announcing-dart-2-1-improved-performance-usability-9f55fca6f31a
Flutterからのユーザーフィードバックからの改善が中心という印象。 Dart 2.0において、数年に渡り開発チームがかかりきりになっていた、型安全性を強めた型システムの安定版がリリースされたため、これからはよりマイナーな改善に注力していくと思われる。
Dart 2ではクライアントサイドのユースケースに注力していくとアナウンスされたとおり、WebアプリとNativeアプリ両方の生産性を高めていくことが強調されている。 Flutterは無事離陸できた感があるので、WebアプリとしてAngularDartのパフォーマンスと生産性の魅力がもう少し知られたら良いし、そしてもし取り組まれるならば年単位の大仕事になるだろうが、Web用Flutterの動きに期待したい。
数値リテラルの改善
FlutterユーザーからのFBベースの改善とのこと。
TextStyle(fontSize: 18.0)
のdouble型リテラルとして18.0
と書かなければstatic errorになっていたが、TextStyle(fontSize: 18)
と、18
と書いてもdouble型と認識してくれるようになった。
Mixinサポートの改善
Mixinの専用構文として、class
の代わりに使用するmixin
キーワードが導入された。以前は、class
キーワードを用いていくつかの制約のもと、mixin applyできるclassを作成していたが、mixin用に構文が分離された。
mixin SingleTickerProviderStateMixin<T extends StatefulWidget> on State<T> implements TickerProvider {}
extends
句の代わりに、on
句を使用する。上記の例では、FlutterのState
classのみがこのmixinを適用する事ができる制約となる。(mixin bodyでは、super
でsuper classのmethodを起動できる。super.dispose();
など。)
Future
とStream
がdart:core
から利用可能に
Future
とStream
を解決するために、大多数のファイルにいちいちimport 'dart:async';
と書かなくてもよくなった。
ただし、dart:async
がすべてexportされたわけではないので、StreamController
やCompleter
を使いたい場合は、いままでどおりdart:async
のimportが必要。
パフォーマンス向上
In a few edge cases, though, the comprehensive checks added by the new type system caused an undesirable overhead of 20–40%. In Dart 2.1 we’ve greatly reduced the cost of the type checks, both for AOT-compiled code and for code run in the VM with JIT (just-in-time) compilation.
たぶん、Reified Genericsを導入した際のパフォーマンス劣化なのだろうなと想像するが、いくつかのエッジケースでパフォーマンス劣化をかなり緩和したとのこと。 また、dart2jsでもコードサイズを17%、コンパイル時間を15%削減できたとのこと。すでにかなりコンパクトなコードサイズだったので満足していたが、そこからさらにコードサイズを17%削減はすごい改善。
Protocol Buffers
Dartサポートが紹介されている。
https://developers.google.com/protocol-buffers/docs/darttutorial https://github.com/knative/docs/tree/master/serving/samples/helloworld-dart
GoやPythonなみの第一級言語としてのサポートと普及が期待できる。 はやくGCP全体でDartサポートが進んでほしい。
その他バグフィックスなどの改善
- Flutterにおいて、コンパイル時にエラーとなるべきコードがそうならなかった不具合の修正や、いくつかのうまく動いていなかったLinterがちゃんと動くようになったなど、バグフィックスがされている。
- dart:htmlの新し目のWebAPI、たとえばServiceWorker APIにかなりのfixが入った。あとで試してみたい。
検討中
https://github.com/dart-lang/language にて言語の改善の議論が公開されている。
- Setリテラルや、constを作る際の制約の緩和など。2.0には結局間に合わなかった、NNBDというNon Null Typeをデフォルトにする大型の破壊的変更にも着手している。
- リスト内包表記のような提案もある。 https://github.com/dart-lang/language/issues/78 FlutterのWidgetをcomposeする際には便利になりそう。
- JavaScriptのようなSpread Operatorも導入が検討されている。https://github.com/dart-lang/language/issues/47
普通の型安全な型システムがデフォルトになってしまったし、仕様が膨らんでいって、良くも悪くも普通の言語になっていく印象。
Optional Semicolon
KotlinのようなOptional Semicolonを検討中とのこと。 https://github.com/dart-lang/sdk/issues/30347
かなり議論が紛糾した経緯がある。 https://github.com/dart-lang/sdk/issues/30347
個人的にはStatement separatorに曖昧なルールを導入してしまうのは反対なのだが...非採用になってほしい。
そんな危険なものよりも、finalとvarをoptionalにして、そのかわりにassignemntに、finalには=
を、varには:=
を使う記法を採用してほしい。