先日(2011/10/10)公開されたGoogleの新言語DartをMacOSX 10.7.1 Lionにインストールしてみたので備忘録。
ざっくりというとGoogle Dart言語はJavaScriptとJava/C++の中間的な言語。動的な型の変数だけでなく静的な型も使え、クラス/インターフェースなどを持ち文法的にはC/C++系です。JavaScriptの代替とサーバサイドでのスクリプティングの両方を目指しているようです。詳しくは上の本家ページを見てみればわかりますが、Hello Worldなんかは一見して普通にC系言語ですね。
dartの開発環境はdartソースをコンパイルし結果をJavaScriptで出力するコンパイラdartcとインタープリタ(VM)のdartとd8です。dartcでは出来たjsをブラウザ等のJavaScript実行環境で走らせることができます。いずれChrome等にvmが内蔵されるとコンパイルの必要なくブラウザ内でJavaScriptと同様に走らせることが出来るようになると思われます。
当方のコンパイルした環境
- MacOSX 10.7.1 Lion
- Xcode 4.1
- MacPorts
手順(gsutilのあたりはかなり適当...)
ビルドのための手順が上記Google Codeのwikiに書いてありますが、少しだけ手間がかかったので以下にメモ。
- 必要なツールのインストール
MacBuildInstructions - chromium - Build instructions for Chromium on Mac OS X - An open-source browser project to help move the web forward. - Google Project Hosting
ここにはXcode 3.2.3+を推奨で4はおすすめでないとありますが、今更面倒なので無視
sudo port -uvc install git-core +svn
sudo port -uvc install depot_tools
sudo port -uvc install gsutil
- ソースの入手
gclient config http://dart.googlecode.com/svn/trunk/deps/all.deps
gclient sync
- 最後にDumpRenderTreeがダウンロード出来ないとかgsutilがどうたらとWARNINGが出たら
./dart/third_party/gsutil/20110627/gsutil config
とするとなにやら長いURLが出てくるのでブラウザで開く。
googleのアカウントでログインしてgsutilを認証し、出てきたコードをgclientのauthorization codeにコピペ
project-idは空でリターン - 再度gclient sync
- cd dart
- Lionの場合SDKが10.6なので
GYP_DEFINES='mac_sdk=10.6' gclient runhooks - 後はビルド
./tools/build.py --arch=ia32 - テスト
./tools/test.py --arch=ia32,dartc,chromium - 詳細はつついていませんが一箇所テストに失敗しました。気持ち悪いですがなんとか使えているようです。エラーメッセージは以下のとおり
=== Debug_ia32 vm/Mutex ===
Path: vm/Mutex
Running test: Mutex
<DART>/dart/runtime/vm/thread_macos.cc:132: error: expected: result == 0
Command: <DART>/dart/xcodebuild/Debug_ia32/run_vm_tests Mutex --ignore-unrecognized-flags
--- CRASHED ---
- buildで--arch=x64とするとdartcは動作するがdartが動かないという結果
- コンパイル結果は./dart/xcodebuild/Debug_ia32以下に。
使ってみる
- パスを通す
export PATH=<DART>/dart/xcodebuild/Debug_ia32:$PATH - d8と叩くとjsのreplらしきものが起動しますのでちょこっと遊ぶ
- コンパイルしてみる。dartcはoptimizeをつけると劇的に小さなjsファイルを生成してくれますが最適化にメモリを大量に食うようなので適当にjava vmのメモリを増やす
export DART_JVMARGS="-Xms256m -Xmx512m"
dartc hoge.dart --out hoge.js --optimize - dartコマンドではスクリプトが直接実行できます
- Tutorial: Hello, World : Dart : Structured web programming
このサンプルをhelloworld.dartなどというファイルに保存してdart helloworld.dart - dartc --optimize helloworld.dart --out helloworld.js
- ちなみにhelloworld.jsは28kb強となります。コンパイルしたjsファイルはnodeでも実行出来ました。
- / - dart - Dart - Structured Web Programming - Google Project Hosting
上のリンクからhi.dartとhi.htmlをもらってきてhi.htmlをindex.htmlにしておく - 変換する
python <DART>/client/tools/htmlconverter.py index.html --optimize -o foo/
- 結果が1つのhtmlファイルに出力されるのでブラウザで開く
open foo/index-js.html
dom操作を含むhi.dart+hi.htmlの結果(index-js.html)は221kbとなりました。
最後に感想など
まだ公開されたての言語なのでこれからという感じですね。vmでの性能は特に調べていませんが速く出来る可能性は非常に高いと思います。が、特にJavaScriptでの出力は元と比べ相当大きくなります。ブラウザ内に取り込まれるまで実用的ではないかもしれません。
また言語仕様はスクリプト系の言語というよりjavaやC++のような言語に近いので、大きなプロジェクトにはいいかもしれませんが、 お手軽に使う感じではないかもという印象です。
#と思ったのですが、基本は動的型で型アノテーションのチェックはあまり厳しくはありません。ラフにも使える反面静的型付言語ほどの安全性はなさそうです。ある意味"Java"Scriptの再定義ともいえるかもしれません。
追記:単純ループでのベンチマーク
単に1000000000回forでループするだけの超簡単なプログラム(参考にもならないかもですが)で速度を測ってみると面白い結果に。
結果はtimeコマンドのUser時間。マシンはMac miniのi7 2Ghz。
- dart foo.dart --> 8.68s
- dartc + node --> 28.6s
- dartc -optimize + node -> 4.43s
- dartc + d8 --> 6.55s
- dart -optomize + d8 --> 1.21s
ループを10回増やしてoptimize+d8で再テストすると
- dart -optomize + d8 x10倍 --> 17.48s
ということでjsにコンパイルしてd8が最速という結果。ちなみにコンパイル後のjsファイルのサイズはopt=28507 bytes, no-opt=549613 bytesでした。
ほぼ同じコードをJavaScriptで書いてnodeとd8で走らせると
- node + js --> 4.36s
- d8 + js --> 1.21s
dartcとほぼ同じ結果となりました。
追記2:リリース直後から数日で
dartc -optimizeの出力結果が約10%小さくなっていました(笑)。しばらくは更新ラッシュで安定するには少し時間がかかるでしょうね。安定すれば外部jsやブラウザプラグイン等でランタイムを供給すればコンパイル結果は劇的に小さく出来るのではないかと思いつつ。