2014/09のDartに関して
最近のDartってどうなってるんだっけ、、ということで、だらだらと調べたことを書いてみます。
Ecma-408 Dart Spec
=====================================================================
2014年6月25日 ECMAでDartの仕様が承認されたみたいで、Ecma-408という名前で標準化したっぽいです。
その仕様は下記で公開されていました。
http://www.ecma-international.org/publications/standards/Ecma-408.htm
大変素晴らしいことに、株式会社クレスさんでECMA-408に対応する言語仕様を日本語訳されて公開されているようです。
http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageSpecification_Japanese.pdf
それとは並行して、Dartの新バージョンとして、Dart1.6が最近リリースされました。
目玉機能の1つとして、deferred loadingのサポートが挙げられていましたが、
deferred loadingはEcma-408に含まれていないのかな。
今後Ecma-408をバージョンアップして、仕様に含めていく方針のようです。
Ecma-408に含まれていない新機能として、Dartでは以下の3つが実装開始しています。
deferred loading (これは1.6で実装)
async-await (bleeding_edgeのvmで実装中)
enum(なぞ)
上記3つの、Ecma-408に含まれていない新機能に関しては、Dartのspecで仕様案として公開されていました。
https://www.dartlang.org/docs/spec/
今私が面白そうだなと思っているのは、async-awaitです。
仕様案は以下で公開されています。
https://www.dartlang.org/docs/spec/Asyncdraft-TC52.pdf
Dartではasyncパッケージが既にあるのですが、
今回の仕様案では、下記の識別子を言語仕様に追加するようです。
async, async*, sync*
await
yield, yield*
今はasync~awaitが実装中で、yieldは未着手ぽいです。
awaitに関してはVMで実装中のようで、Continuationで実現するようです。
AwaitContextVar でcontext情報一式を退避する命令を生成し、
AwaitJumpVarで対象のcontextにjumpする命令を生成するようです。
これでsingle threadingで動くdartでもawaitできる!
Continuationする関係上、既存のasyncパッケージのCompleterやStreamはどうなるんすかね、、
あとdart2jsだとどうするんだろう、Isolateに手を入れるのかな。
Optimizing Dart Applications
=====================================================================
Google IO 2014では、いくつかDartのsessionがあったみたいです。
Dart VM Observatory toolという、Dart VM組込みのプロファイラみたいなもんで、
WEBブラウザから参照、操作できるようです。
2014のDart Flight Schoolで、私は上記vm-serviceに関して少し紹介していましたが、
名前変わって完成したようです。
使い方はほぼ同じなのですが、
起動方法 ::
使ってみた感じですと、以下のことができました。
(1) VMの起動時のステータス表示
起動時のオプションや、pid 動いている時間の参照。
さらにはリモートからのVMのpauseやresumeもできるようでした。
(2) クラス階層の参照
読み込み済みのクラス(Core含める)や、ユーザ定義のクラスなど含めて、参照できるようです。
Dartのソースコードレベルでどのパスを通ったのかコードカバレージを表示したり、
実行時のinstance sizeを見れたりなど、高機能です。
(3) CPU Profile
CPUの消費率を、どの関数が何%みたいに参照できるようです。
また、VM内部の消費時間を、各tag付けして割合を見れるようでした。
これにより、どれだけコンパイルに時間がかかっているかとか、
optimizedされたコードに変換されて走っているか、
unoptimizedコードが走っている割合が参照できるようでした。
(4) Stack trace
isolate単位にstack traceを表示できるみたいで、
クリックしたらソースコードに飛べました。
私はfiboで試していたので、fibo関数が30個くらいネストしており、
traceの底は_RawReceivePortImpl._handleMessage()->anony closure()->_startIsolate()->main()->fibo()
みたいになってました。
(5) Allocation Profile
HeapやGCのプロファイル結果(NewGen, OldGenの現在のサイズや、GC時間、GC間隔のサマリなど)
を参照できるようです。
(6) Visual Heap
これはHeapをbitmap風に可視化したもので、断片化やメモリの使われ方をぱっとみれるようです。
bitmapにはそれぞれアドレスがmapされていて、
クリックしたらそのobject詳細(instance id,class,size,addr)が出てきて、いろいろとヤバいツールでした。
(7) Metrics
設定した情報の単位時間あたりのパラメータの遷移をグラフでみれる。
たぶん将来的には、ユーザが定義して埋め込んだdart:profilerパッケージで設定したタグに基づいて、
プロファイルした情報を参照できるようにするんだと思います。
この辺は試せてないです。
なんかすごく高機能です。。
興味あるかたは試してみてください、いろいろな情報が参照できて面白いです。
mozaic.fm
=====================================================================
LLDiverのプログラムの一つとして開催されていた「mozaic.fm出張版: TypeScript and Dart」がHPで公開され、
先日聴いて非常に面白かったですし、
いろいろと、これどうなってるんだっけと疑問が湧いてきました。
http://mozaic.fm/post/96461640633/8-altjs
Dart(夢)の進捗どうなんだっけ、、ということで、mozaic.fmで話題に挙がったり、
疑問に思ったところを調べてみました。
Dartは速くなるのか
=====================================================================
Dart VMを作り始めた頃は、
V8より10倍速く起動して、V8の2倍のスループットで動作することを目標に挙げていたようでした。
V8作ってた人たちがJavaScriptの仕様にぶちきれてDart VM作り始めたという話も、
そうだったんだろうなと考えています。
目標である、V8より10倍速く起動して2倍のスループットというのも、2013/10頃は達成していたのですが、
その後のV8の性能向上も著しく、
さらにV8は新JITコンパイラであるTurbofanを開発中ということで、更なる性能向上の可能性も秘めていて、
差は縮まるんじゃないか、、というのが感想です。
Dart VMからV8にいろいろと機能を取り込んでいる感じはありますけど。
Dart VMのパフォーマンスは2014年以降横ばいだけど、V8のスコアが上がっているのがわかると思います。
https://www.dartlang.org/performance/
Dart VMはJVMと同等までいくのかな!?と思っていましたが、いろいろと壁がありそうです。
とはいえ、言語仕様上、DartのほうがJavaScriptより性能上げやすいのは確かなので、
V8の2倍は、、どうなんだろうなと思いつつ、ベンチマークに限らず、広く確実に性能出るだろうなとは思っています。
FTL JITと比較してDart VMはどうかって話は、現状よく分からない。。詳しい人教えてください。
clientとserverのhtmlパッケージが分かれていて死ぬ
=====================================================================
パッケージ分かれているよねというのは、これのことかな。
たしかに混乱しやすいし、言語同じだけどクライアントとサーバでライブラリ違うじゃんって話もあります。
dart:html
dart:io
この2つ
Dart VMがChromeなどのブラウザにのったら、
Dart VMの全機能(たとえばIO)が使えるようになるかというとそうではなくて、
使用できるパッケージに変化はないです。
クライアント側では、dart2jsでdart:htmlを使うことが多いと思いますが、
Dart VMがブラウザに搭載された場合、dart:htmlパッケージをDart VMが実行することになると思います。
ブラウザにVMが載った場合、Dart VMでDart:htmlおよびDart:ioが使えるようにならない。
上記環境は、Dartiumを使うと体験できるはず。
Dartは対象プラットフォームとして2つを想定していて、
(1) JavaScript + ブラウザ依存(Dart VMのってる or のってない)
(2) Native VM + OSの提供するsystemcall
JavaScript + ブラウザ依存を対象としたdart:htmlでは、ブラウザ依存を吸収するレイヤとして、
dart2js(JavaScript only)とdartium用にシンボルが分かれています。
dart2jsからは、javascriptの仕様や、Khronosなんかが標準化したAPIを叩くようなコードを生成しますが、
dartiumの場合、dartium内部で定義されたシンボルを直接叩くようなコードになります。
仮にChromeにDart VMが搭載されて、Dartのコードを実行できるようになったら何が変わるのかというと、
(1) dart2jsでjavascriptに変換しないので、intの精度がjavascript依存にならない。
(2) 場合のよっては、V8とDart VMを両方起動するので、メモリ食うかも。
(3) Dartのコードはブラウザに搭載されたDart VMで実行したほうが、起動の遅延が小さいし、性能高いよね!
Dartのclientのパッケージとserverのパッケージは、
対象とするプラットフォームが異なるので、統合される予定はないような気がします。
Dartのself-hosting
=====================================================================
dart2jsはDartで書かれています。
そのため、dart2jsをブラウザで動かす方法は2種類存在します。
(1) dart2jsをブラウザ上のDart VMで動かす。
(2) dart2jsをブラウザ上のJavaScript実行エンジンで動かす。
(2)は多少複雑で、self-hosting?の要素がからんできます。
Dartでかかれたdart2js(dart)自体を、dart2js(dart or js)でコンパイルし、dart2js(js)に変換する必要があります。
dart2js自身のself-hostingは結構前に実現されています、、というか上記はブラウザ上で動かす上で必須ですね。。
Dart VMをDart自身で書き直す予定はないのだと思います。
そんなことやってる有名なVMはJikes RVM、PyPyくらいかなー、そのへんよくわからない。
AST解析やコード補完を支援するAPI
=====================================================================
AST解析やコード補完を支援するAPIなどが公開されていればみんなうれしいし
連携ツールを開発する人が出てきていいよね!
という話だと思いますが、そのとおりだと思います。
Dartのコードを解析するフェーズは2つに分かれていて、
(1) Editorと連携したanalyzerが、コンパイルエラーやwarningやコード補完を提供する
(2) コンパイルして、アセンブリ言語(x86とかARMとかJavaScript)に変換する。その際エラーも検出するよ。
eclipseベースのIDEにpluginで提供するという事情により、
初期の(1)analyzerはJavaで開発されていました。
今はDart版があるので、 WEBIDEなんかに組込みやすくなっているはずです。
※しかもJavaのソースからDartソースに自動変換したぽい。
(2)はdart2js(dart実装)とdart vm(C++実装)に分かれています。
これらは言語仕様の拡張に合わせて機能追加されてきましたが、今のところAPIとして提供されている感じはないですね。
APIとしてどうかっていうと、
pkg/analyzerでは、dartからAPIを叩ける(1)のanalyzerの機能は提供されているのかも。ちゃんとみてない。
さらにpkg/analysis_serverみたいのもあるので、いろいろとAPI提供は検討されているのかもしれません。
今後に期待です。
Dartのコンパイラフロントエンドって、上記だけでJava実装、Dart実装、C++実装があるんですよね。。
いいぞーもっとやれー
Ecma-408 Dart Spec
=====================================================================
2014年6月25日 ECMAでDartの仕様が承認されたみたいで、Ecma-408という名前で標準化したっぽいです。
その仕様は下記で公開されていました。
http://www.ecma-international.org/publications/standards/Ecma-408.htm
大変素晴らしいことに、株式会社クレスさんでECMA-408に対応する言語仕様を日本語訳されて公開されているようです。
http://www.cresc.co.jp/tech/java/Google_Dart/DartLanguageSpecification_Japanese.pdf
それとは並行して、Dartの新バージョンとして、Dart1.6が最近リリースされました。
目玉機能の1つとして、deferred loadingのサポートが挙げられていましたが、
deferred loadingはEcma-408に含まれていないのかな。
今後Ecma-408をバージョンアップして、仕様に含めていく方針のようです。
Ecma-408に含まれていない新機能として、Dartでは以下の3つが実装開始しています。
deferred loading (これは1.6で実装)
async-await (bleeding_edgeのvmで実装中)
enum(なぞ)
上記3つの、Ecma-408に含まれていない新機能に関しては、Dartのspecで仕様案として公開されていました。
https://www.dartlang.org/docs/spec/
今私が面白そうだなと思っているのは、async-awaitです。
仕様案は以下で公開されています。
https://www.dartlang.org/docs/spec/Asyncdraft-TC52.pdf
Dartではasyncパッケージが既にあるのですが、
今回の仕様案では、下記の識別子を言語仕様に追加するようです。
async, async*, sync*
await
yield, yield*
今はasync~awaitが実装中で、yieldは未着手ぽいです。
awaitに関してはVMで実装中のようで、Continuationで実現するようです。
AwaitContextVar でcontext情報一式を退避する命令を生成し、
AwaitJumpVarで対象のcontextにjumpする命令を生成するようです。
これでsingle threadingで動くdartでもawaitできる!
Continuationする関係上、既存のasyncパッケージのCompleterやStreamはどうなるんすかね、、
あとdart2jsだとどうするんだろう、Isolateに手を入れるのかな。
Optimizing Dart Applications
=====================================================================
Google IO 2014では、いくつかDartのsessionがあったみたいです。
Dart VM Observatory toolという、Dart VM組込みのプロファイラみたいなもんで、
WEBブラウザから参照、操作できるようです。
2014のDart Flight Schoolで、私は上記vm-serviceに関して少し紹介していましたが、
名前変わって完成したようです。
使い方はほぼ同じなのですが、
起動方法 ::
dart --enable-vm-service xxx.dart
もしくは
dart --observe xxx.dart
その後下記へアクセス
http://localhost:8181
使ってみた感じですと、以下のことができました。
(1) VMの起動時のステータス表示
起動時のオプションや、pid 動いている時間の参照。
さらにはリモートからのVMのpauseやresumeもできるようでした。
(2) クラス階層の参照
読み込み済みのクラス(Core含める)や、ユーザ定義のクラスなど含めて、参照できるようです。
Dartのソースコードレベルでどのパスを通ったのかコードカバレージを表示したり、
実行時のinstance sizeを見れたりなど、高機能です。
(3) CPU Profile
CPUの消費率を、どの関数が何%みたいに参照できるようです。
また、VM内部の消費時間を、各tag付けして割合を見れるようでした。
これにより、どれだけコンパイルに時間がかかっているかとか、
optimizedされたコードに変換されて走っているか、
unoptimizedコードが走っている割合が参照できるようでした。
(4) Stack trace
isolate単位にstack traceを表示できるみたいで、
クリックしたらソースコードに飛べました。
私はfiboで試していたので、fibo関数が30個くらいネストしており、
traceの底は_RawReceivePortImpl._handleMessage()->anony closure()->_startIsolate()->main()->fibo()
みたいになってました。
(5) Allocation Profile
HeapやGCのプロファイル結果(NewGen, OldGenの現在のサイズや、GC時間、GC間隔のサマリなど)
を参照できるようです。
(6) Visual Heap
これはHeapをbitmap風に可視化したもので、断片化やメモリの使われ方をぱっとみれるようです。
bitmapにはそれぞれアドレスがmapされていて、
クリックしたらそのobject詳細(instance id,class,size,addr)が出てきて、いろいろとヤバいツールでした。
(7) Metrics
設定した情報の単位時間あたりのパラメータの遷移をグラフでみれる。
たぶん将来的には、ユーザが定義して埋め込んだdart:profilerパッケージで設定したタグに基づいて、
プロファイルした情報を参照できるようにするんだと思います。
この辺は試せてないです。
なんかすごく高機能です。。
興味あるかたは試してみてください、いろいろな情報が参照できて面白いです。
mozaic.fm
=====================================================================
LLDiverのプログラムの一つとして開催されていた「mozaic.fm出張版: TypeScript and Dart」がHPで公開され、
先日聴いて非常に面白かったですし、
いろいろと、これどうなってるんだっけと疑問が湧いてきました。
http://mozaic.fm/post/96461640633/8-altjs
Dart(夢)の進捗どうなんだっけ、、ということで、mozaic.fmで話題に挙がったり、
疑問に思ったところを調べてみました。
Dartは速くなるのか
=====================================================================
Dart VMを作り始めた頃は、
V8より10倍速く起動して、V8の2倍のスループットで動作することを目標に挙げていたようでした。
V8作ってた人たちがJavaScriptの仕様にぶちきれてDart VM作り始めたという話も、
そうだったんだろうなと考えています。
目標である、V8より10倍速く起動して2倍のスループットというのも、2013/10頃は達成していたのですが、
その後のV8の性能向上も著しく、
さらにV8は新JITコンパイラであるTurbofanを開発中ということで、更なる性能向上の可能性も秘めていて、
差は縮まるんじゃないか、、というのが感想です。
Dart VMからV8にいろいろと機能を取り込んでいる感じはありますけど。
Dart VMのパフォーマンスは2014年以降横ばいだけど、V8のスコアが上がっているのがわかると思います。
https://www.dartlang.org/performance/
Dart VMはJVMと同等までいくのかな!?と思っていましたが、いろいろと壁がありそうです。
とはいえ、言語仕様上、DartのほうがJavaScriptより性能上げやすいのは確かなので、
V8の2倍は、、どうなんだろうなと思いつつ、ベンチマークに限らず、広く確実に性能出るだろうなとは思っています。
FTL JITと比較してDart VMはどうかって話は、現状よく分からない。。詳しい人教えてください。
clientとserverのhtmlパッケージが分かれていて死ぬ
=====================================================================
パッケージ分かれているよねというのは、これのことかな。
たしかに混乱しやすいし、言語同じだけどクライアントとサーバでライブラリ違うじゃんって話もあります。
dart:html
dart:io
この2つ
Dart VMがChromeなどのブラウザにのったら、
Dart VMの全機能(たとえばIO)が使えるようになるかというとそうではなくて、
使用できるパッケージに変化はないです。
クライアント側では、dart2jsでdart:htmlを使うことが多いと思いますが、
Dart VMがブラウザに搭載された場合、dart:htmlパッケージをDart VMが実行することになると思います。
ブラウザにVMが載った場合、Dart VMでDart:htmlおよびDart:ioが使えるようにならない。
上記環境は、Dartiumを使うと体験できるはず。
Dartは対象プラットフォームとして2つを想定していて、
(1) JavaScript + ブラウザ依存(Dart VMのってる or のってない)
(2) Native VM + OSの提供するsystemcall
JavaScript + ブラウザ依存を対象としたdart:htmlでは、ブラウザ依存を吸収するレイヤとして、
dart2js(JavaScript only)とdartium用にシンボルが分かれています。
dart2jsからは、javascriptの仕様や、Khronosなんかが標準化したAPIを叩くようなコードを生成しますが、
dartiumの場合、dartium内部で定義されたシンボルを直接叩くようなコードになります。
仮にChromeにDart VMが搭載されて、Dartのコードを実行できるようになったら何が変わるのかというと、
(1) dart2jsでjavascriptに変換しないので、intの精度がjavascript依存にならない。
(2) 場合のよっては、V8とDart VMを両方起動するので、メモリ食うかも。
(3) Dartのコードはブラウザに搭載されたDart VMで実行したほうが、起動の遅延が小さいし、性能高いよね!
Dartのclientのパッケージとserverのパッケージは、
対象とするプラットフォームが異なるので、統合される予定はないような気がします。
Dartのself-hosting
=====================================================================
dart2jsはDartで書かれています。
そのため、dart2jsをブラウザで動かす方法は2種類存在します。
(1) dart2jsをブラウザ上のDart VMで動かす。
(2) dart2jsをブラウザ上のJavaScript実行エンジンで動かす。
(2)は多少複雑で、self-hosting?の要素がからんできます。
Dartでかかれたdart2js(dart)自体を、dart2js(dart or js)でコンパイルし、dart2js(js)に変換する必要があります。
dart2js自身のself-hostingは結構前に実現されています、、というか上記はブラウザ上で動かす上で必須ですね。。
Dart VMをDart自身で書き直す予定はないのだと思います。
そんなことやってる有名なVMはJikes RVM、PyPyくらいかなー、そのへんよくわからない。
AST解析やコード補完を支援するAPI
=====================================================================
AST解析やコード補完を支援するAPIなどが公開されていればみんなうれしいし
連携ツールを開発する人が出てきていいよね!
という話だと思いますが、そのとおりだと思います。
Dartのコードを解析するフェーズは2つに分かれていて、
(1) Editorと連携したanalyzerが、コンパイルエラーやwarningやコード補完を提供する
(2) コンパイルして、アセンブリ言語(x86とかARMとかJavaScript)に変換する。その際エラーも検出するよ。
eclipseベースのIDEにpluginで提供するという事情により、
初期の(1)analyzerはJavaで開発されていました。
今はDart版があるので、 WEBIDEなんかに組込みやすくなっているはずです。
※しかもJavaのソースからDartソースに自動変換したぽい。
(2)はdart2js(dart実装)とdart vm(C++実装)に分かれています。
これらは言語仕様の拡張に合わせて機能追加されてきましたが、今のところAPIとして提供されている感じはないですね。
APIとしてどうかっていうと、
pkg/analyzerでは、dartからAPIを叩ける(1)のanalyzerの機能は提供されているのかも。ちゃんとみてない。
さらにpkg/analysis_serverみたいのもあるので、いろいろとAPI提供は検討されているのかもしれません。
今後に期待です。
Dartのコンパイラフロントエンドって、上記だけでJava実装、Dart実装、C++実装があるんですよね。。
いいぞーもっとやれー