狠狠撸

狠狠撸Share a Scribd company logo
Inside frogc in Dart
   闇鍋プログラミング勉強会 2012/3/31




     gfx <gfuji@cpan.org>




               1
自己紹介

名前: hatena:gfx, github:gfx twitter:@__gfx__

職業:プログラマ

 スマホ向けのミドルウェアの開発など

   Objective-C, Java, JavaScript, ActionScript, Perl

 最近の興味はスマートフォンでのHTML5


                         2
本日のテーマ




  3
Dart


JavaScriptの置き換えを狙ったプログラミング言語

構文は (JavaScript + Java + C++)/3 + α

クラスベースのオブジェクト指向言語




                          4
Hello, Dart!
class HelloWorld {
    void say() {
        print("Hello, Dart world!");
    }
}
void main() {
    HelloWorld instance = new HelloWorld();
    instance.say();
}




                       5
発表資料



http://gfx.github.com/yaminabePG-2012-3-31/

スライドは後ほど狠狠撸shareに上げます




                          6
なぜ顿补谤迟か




   7
JavaScript sucks

JavaScriptで大きなアプリケーションを書くのは難しい

 プロパティ名のtypoなどのコーディングミスを実行
 時まで検出できない

 ミスを防ぐためにJSLintのような仕組みが必要



              8
FAQ
CoffeeScriptと何が違う?

GWTとは何が違う?

速度は?

生産性は?

デバッグしにくいのでは?

                     9
Q. CoffeeScriptと何が違う?

CoffeeScriptのような徹底的な「記述量の削減」はそも
そも目指していない

型アノテーションにより動的型言語の欠点を緩和

っていうかCoffeeScriptで中規模~大規模なWebアプリ
ケーション開発とか冗談でしょ?


               10
Q. GWTとは何が違う?
GWT: Google Web Toolkit (Java to JavaScript compiler)

JavaとJavaScriptというまったく異なる言語の間でのつ
じつま合わせがボトルネック

Dartの設計には最初からJavaScriptの仕様が織り込まれ
ているので相性がよい

さらにoperator overloadなどの糖衣構文もあり

                            11
Q. 速度は?
オーバーヘッドはあるが、そこらのLLよりずっと速い

普通のアプリケーションでJavaScriptの70-90%程度

 半年後くらいのfrogcを想定した予想値

基本的な言語仕様はJSとほぼ互換だからオーバーヘッ
ドは極めて少ない

 ただしHashMap、テメーはダメだ!
                12
Q. 生産性は?
JavaScriptと比べると書いていて気持ちがいい

ただし型推論のない静的型付け言語特有の二重型記述
地獄が…

 List< List<String> > table = new List< List<String> >();

型推論はおそらく検討中と思われる

 型推論が入らなければDartに未来はない

                            13
Q. デバッグしにくいのでは?
DartVMなら自然にデバッグできる

 Dartium (Dart Editorに同梱) でも同様

source mapに対応すればJS debuggerでもいける

 ステップ実行もたぶんできる

DartVM+実行時型チェックモードならむしろJSよりデ
バッグしやすい
                    14
今現在使い物になるか

未熟すぎてとても使えるレベルではない

そもそも仕様が固まっていない

2つの処理系(standalone VM & frogc)の差が無視できない

ライブラリがない

ベストプラクティスがない

                  15
言語処理系の話



Dart Editor (IDE and Dartium)

Dart SDK (CLI commands)




                            16
Dart SDK
frogc - Dartの処理系のひとつ

 Dartで書かれたDartコンパイラ

 DartプログラムをJavaScriptにコンパイルする

DartVM - Dartの処理系のひとつ

 frogcはこれによって実行される

                  17
frogc

これ以降「Dart処理系」とはfrogcのこと

Dart Editor (Eclipse-based IDE) でのJS生成に使われる

コマンドラインからも使用可能

frogc.dartはfrogcでコンパイルできない…



                    18
どのようにJSに変換するか

CLIのhelloworldは500行程度

400行のshootingは3000行程度

多くはランタイム/ライブラリによるもの

ロジックはほぼそのまま



                   19
コンパイル例

                Dart                 JavaScript

print(“Hello, world”);    print$(“Hello, world”);

                          for(var $$i = a.iterator();
for(var i in a) {
                          $$i.hasNext();){ var i = $$i.next();
                          Parent.prototype.de?nedInParent.
super.de?nedInParent()
                          call(this)
                          x + y (when num x, y)
x+y
                          $add(x, y) (when var x, y)


                         20
そんなことはどうでもいい
    Isolate
を知りたいんだオレは!


     21
Isolate
Actor model (shared nothing)のthread interface

frogcでの実装は3つ(Worker, timer, while loop)

  WebWorkerでは spawn-self hack で実行

ただしDartiumではすぐクラッシュするしfrogc+Chrome
でも挙動はあやしいしfrogc+node.jsでは動かないし全
然ダメ

                            22
Isolation of global state
すべてのグローバル変数?クラスは、JSレベルでは
global stateというオブジェクトのプロパティ

spawnするとこれをコピーして、functionオブジェクト
とglobal stateを一緒にqueueに突っ込むイメージ

そしてイベントループの中でqueueから取り出して実行

コンテキストスイッチは単に $globals = c.isolateStatics

                    23
Isolateは使えるの?
まともに動かせませんでした><

たとえば document.query(‘#foo’).innerHTML = “hoge” とか
どうなるの?

実装がダメダメすぎるのでまだ海のものとも山のもの
ともつかない

要はWebWorkerへのインターフェイスと考えればおk

                       24
Snapshot

起動高速化のための機能

frogcでは未実装

というかfrogcでどうやって実装するのか

manifestによるcacheと関数単位の遅延evalで高速化はで
きるかもしれないが…?


                25
Run Time Type Information
Run-Time Type InformationはほぼJSそのまま

 Dart VMだと値が型情報を持つ


C<T> はTの情報を持たない

 だからC<T>のメソッドでnew T()ができない

 当然 if(c is C<T>)もまともに動かない

doubleとintも区別なし
                     26
まとめ


frogcが吐き出すJSがバケモノというのは都市伝説

 肥大化は主にランタイムとライブラリのせい

IsolateはWeb Workerを抽象化したインターフェイス

あと1年くらいすれば普通に仕事でも使えそう

                27
JavaScript sucks.

  Dart rocks.


        28

More Related Content

Inside frogc in Dart

Editor's Notes