Dartファーストインプレッション

一昨年にGo言語を公開して(比較的)爆発的に広がって気をよくしたのか、Googleさんが今度はJavaScriptの後釜を狙った「Dart」という言語を公開しました。少し前から話題だけは先行していてどんなものか気になってたので、ざーっと仕様を眺めてみた結論。まだドラフトなのでどうこう言うのもアレですが、現時点での個人的で正直な感想としては

がっかり

です。少なくとも言語仕様的には興味をひくところがほとんどなかった。敢えて目新しさにこだわらずに、大規模開発時に感じるJavaScriptへの不満を解消することに専念したと考えれば、もしかしたら本格的なウェブアプリケーションを開発したい企業で大流行するかもしれない。ただ、その分トリッキーなことは全然できなさそうなので、ゆるく楽しくプログラミングしたい向きには向かなそう。要は会社に言われていやいや使う系の言語かなと。言語仕様も相まってまさに「Java」Scriptって感じ。

ということでまずがっかりポイント。

  • 見た目がJavaextendsとかimplementsとかabstractとかインターフェースとかジェネリクスとか。コアライブラリもなんかJavaっぽいしJavaは別に嫌いじゃないけど、21世紀になって10年もたってから新しく公開される言語でそんなの見たくないっていうのが正直なところ
  • 型指定あり。指定したからってチェックされるわけではないんだけど、存在するだけで見た目がなんか重々しい
  • クラスベースオブジェクト指向JSと言えば広く使われてる唯一のプロトタイプベースオブジェクト指向言語だったわけで。結局みんなクラスベースっぽく使うためのライブラリ使ってるとは言え、プロトタイプベースじゃなくなるのはやっぱりがっかり
  • プロパティを後付けできない。クラスベースだけあって、JSみたいにプロパティを動的にどんどん追加したりできない。あれすごいよかったのに
  • オープンクラスじゃない。既存のクラスを後から拡張するのは不可。いまさら既存クラスに機能追加したくなったらいちいちサブクラス作るのかよ。リテラルの機能拡張とかどうすんの・・・
  • コアライブラリを見るかぎり、リフレクションはまだない?is演算子で所属クラスは確認できるけど、それだけじゃねぇ・・・
  • JSの地味に面白かったところは全部なし
    • セミコロン必須。JSはなにげに省略可能だったのに・・・
    • 変数宣言必須。JSはなくても適当に解釈してくれたのに。変数宣言の有効範囲はヘンテコだったけど・・・
    • デフォルトコンストラクタの()を省略できない。つまり「new Object」はだめで「new Object()」って書かないとダメ

とはいえ一応、それなりにおもしろいとこもあるにはあって

  • 型付はオプショナル。ていうか単なるアノテーションで、Production modeではあってもなくても関係なし。警告も出ないみたい。Checked modeのときだけ静的型チェックが走る模様
  • 無名関数はシンプルでいい感じ。「(args, ...) { body }」とか、関数定義と同じ形式で関数名なくすだけで済むのはなかなか素敵
  • Isolateクラスはちょっとおもしろそう。アクターっぽいのが簡単に作れる。例えばこんな感じ: https://gist.github.com/1274980
  • 標準ライブラリの「流れるようなインターフェース」っぷりは悪く無いと思う。例えばこんな: document.query('#next').on.click.add((e) { sliderMenu.selectNext(true); });
  • 名前付きコンストラクタ。MyClass.myConstructor みたいなコンストラクタを定義すると「new MyClass.myConstructor()」ってできる
  • DOMライブラリはJSより簡略化されてるっぽい。getElementById('foo') が query('#foo') で済んだり
  • varも残ってる。宣言時に型を指定するのが面倒ならJSと同じくvarを使っておけばおk

あと、JSで不満だったからこうしたんだろうなぁって感じの、個人的にはよくなったとも悪くなったとも思えない、まぁそういう判断もありかなってところ。

  • _で始まるIDはプライベート
  • void main()がエントリポイント。DOMの構築が終わってから呼び出される
  • scriptタグが違うスクリプトがお互い独立に実行される
  • HTMLの要素にプロパティとしてイベントリスナを設定できない

まとめとしては、JavaっぽくなったJavaScript・・・というかJavaScriptっぽさがとりこまれたJavaDartに対応していないブラウザのためにJavaScriptにコンバートできるんだけど、素直にGWT使えばいいんじゃないかと。リフレクション周りも弱すぎで、システムプログラミングを指向してるはずのGo言語の方がゆるくて動的に感じられるレベル。わざわざ新しい言語を開発する理由がわからない。正直これダメだろ、って思った。