Google の新言語 Dart

Google の新言語 Dart でいろいろ遊んでみた。

予約語のように思えた abstract、class、static 、 final 、 get なんかが予約語じゃなくてびっくりした。JavaScript からのポーティングを容易にするためなんだって!本気で JavaScript の置き換え目指しているんだな。

ちょっと勉強しただけだけど下記のような点が印象に残った。
 ・ 演算子オーバーロードがある
 ・ Generics を使える
 ・ 静的型言語と動的型言語の両方の書き方ができる。
  ・ Dynamic 型とかいいね。
 ・ シングルクオート3つとかダブルクオート3つの複数行文字列がある
 ・ 文字列中に ${任意の式} のように書く String Interpolation が可能
 ・ 数は int 型と double 型
  ・ int は int32_t でも int64_t でもなく任意の長整数を表現可能
 ・ 暗黙の型変換が boolean conversion 以外にない
  ・ JavaScript とは違う
 ・ 単に int i と書いた場合は、i は 0 ではなく null
 ・ ちゃんと closure は使える
 ・ static メソッドとか static 変数は override したり hide したりできない
  ・ 継承するクラスは、基底クラスの内部実装も気にせなあかんということなんかな
 ・ 常に単一スレッドで動く
  ・ スレッドの概念がない代わりに isolates という概念がある
  ・ isolates は Erlang のプロセスみたいなもの?

ライブラリの方も興味深い。
 ・ 普通に num 型にメソッドがある。Ruby みたいなかんじ
  ・ 100.toRadixString(16) が "64" になるみたいな書き方
 ・ 文字列連結のための StringBuffer 型、immutable な String 型がある
 ・ Queue は Double Ended Queue
  ・ 最初の要素を取り出すのは shift() ではなく removeFirst()
  ・ 最後の要素を取り出すのは pop() ではなく removeLast()
  ・ メソッドオーバーロードで << を再定義したくなるかんじ
 ・ RegExp クラスがある。使い方はめんどそう。

RegExp exp = const RegExp(@"(\w+)");
String str = "Parse my string";
Iterable matches = exp.allMatches(str, exp);

 ・そういや、String クラスが Pattern インタフェースを実装している
  ・ String クラスでも 上の allMatches() メソッドが使えるみたい。
 ・ Collection インタフェースに foreach() メソッドとかがある。
  ・ List クラス、Queue クラス、Set クラスとかで使える
 ・ Promise クラスがある。JSDeferred みたいなかんじ?
 ・ Dispatcher、Isolate 、ReceivePort 、SendPort が面白そう

けど、いろいろやってみたけど私だったら Dart を使わず、Coffee Script を使うかなぁ。
理由は、
 ・ JavaScript のオブジェクトと挙動が全然違う

main(){
  var obj = {};
  obj["attribute"] = 1;
  print(obj["attribute"]); // 正常実行される
  print(obj.attribute); // 失敗する
}

オープンクラスじゃないから既存のクラスにメソッド追加とかはできない
・ オブジェクトにメソッド追加とかもできない
・ "と'の違いじゃなくて、 @ で string interpolation の有無を区別する

main(){
  var world = "World!";
  print("Hello, ${world}"); // Hello, World!
  print(@"Hello, ${world}");  // Hello, ${world}
  print('Hello, ${world}'); // Hello, World!
  print(@'Hello, ${world}');  // Hello, ${world}
}

 ・メタプログラミング的なことができない
  ・ せめて、typeof くらいは欲しいんだけど・・・。
  ・ for(var i in obj) でオブジェクトの要素を取得することもできない
  ・ foreach はあるけど、Java 的なイテレータのための Syntax sugar
 ・DSL向けじゃない
  ・ CoffeeScript は、() をわりと省略できるのが気に入っていたり。
 ・; を忘れたらバッチリ怒られる。
  ・ めんどい

全体的に、一人で JavaScript を書く程度のレベルであれば発生しないようなコーディング規約とか、他人のソースコードを読めない的な問題を解決するために作られた言語という印象。

Java の人は豊富にいるけど、JavaScript の人はあんましいない開発陣でチーム開発する場合とかは向いているのかもしんない。
JavaScript 技術力が高い開発者だったら、JavaScript でできるのに Dart でできないことがいっぱいあることが気になっちゃいそう。