(cache) LLVMとコンパイラとVM 2014/09のDartに関して

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に関して少し紹介していましたが、
名前変わって完成したようです。

使い方はほぼ同じなのですが、
起動方法 ::

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++実装があるんですよね。。
いいぞーもっとやれー
FC2 Management

コメントの投稿

非公開コメント

検索フォーム
プロフィール

nothingcosmos(坂頂佑樹)

Author:nothingcosmos(坂頂佑樹)
IT系、特にVMに関して
周辺技術の紹介等をしています。
コメント・質問はお気軽にどうぞ。

LLVM wiki
twitter:nothingcosmos

リンク
最新記事
カテゴリ
最新トラックバック
月別アーカイブ