Dartで遊んでみよう.2 [vs JSX その1]

こんばんは! 第二回はDartと他の言語との比較ということで、DeNA発のJSXというプログラミング言語との比較を行なってみようと思います。vs JSXです! 1回では纏まりそうにないので、複数回に分けていこうと思います。

それでは、軽くJSXの説明を行います。Dartについては前回の Dartで遊んでみよう.1 をご覧ください!

JSXとは、DeNAによって開発されたオブジェクト指向プログラミング言語です。

Dartと同じくJSXのコードはJavaScriptコンパイルされるため、node.jsやブラウザ上で動作させることができます。 文法はJavaScriptにとても近いので、JavaScriptユーザーはすぐに書き始めることが出来るはずです。 そして最大の売りは、静的型付けであることだと思います。 静的型付けは、打ち間違えによる些細なミスや、間違った値の代入、誤った型での関数の呼び出しを防ぐことが出来るため、堅牢であり大人数で開発されている中~大規模のソフトウェア開発に向いています。 JSXはJavaScriptより堅牢なプログラミング言語の必要性により開発されたため、静的型付けとして設計されています。 また、速度面においても大幅に最適化を行なってくれるということも魅力的です。

では、比べていきましょう! DartもJSXも2012/6/29時点での最新の処理系を使っているものとします。どちらも進化途中の言語ですので仕様がこれから大幅に変更されると思いますが、そのときにはまた記事で取り上げていきたいと思っています。

まずはエントリポイントの書き方から比較していきます。 Dart


void main() {
  print("Hello, World!");
}

JSX


class _Main {
  static function main(args : string[]) :void {
    log "Hello, world!";
  }
}

Dartでは、ただの main()関数 がエントリポイントです。コマンドラインから渡される引数は、Optionsインターフェースによって取得します。 JSXでは、_Main.main(:string[]):void がエントリポイントとなっているようです。コマンドラインから実行した際に、ここから呼び出されます。

次のコードからは、実際に動かして確かめることが出来ます! Dartのコードの場合は、try.dartlang.orgより、 JSXのコードの場合は、JSX - Statically-typed, object-oritented programming lauguageより実行できます。

次に、組み込みの基本型の扱いです。 Dart


main() {
  int v;
  // var v = 42;
  // String v = "Hoge";
  print( v );
}

JSX


class Test {
  static function run() : void {
    var v : number;
    // var v = 42;
    // var v : number = null; // Compile Error!!
    // var v : Nullable.<number> = null;
    // var v : string = "Hoge";
    log v;
  }
}

Dartの場合、null と表示されると思います。全てを参照として持つので、未初期化の場合は null が初期値となっています。よって、全ての型がNullableです。 また、最近の方針ではローカル変数に型の指定を行わないようにするらしいので、var i と書くのが正しいのかもしれません。(参照) JSXでは、未初期化であるという事でコンパイルエラーになりますね!これは凄く良いと思います。 JSXにおいて、boolean型、number型、string型はint型は全てNonNullableとなるようです。Nullable.<基本型> と書くことによって、Nullable にすることも可能です。 オブジェクトは全てNullableな様です。

そして誰もが欲しいと思うオーバーロードDart コンパイル時には不可能・・・。実行時に無理矢理やるなら。


void foo( value ) {
  if ( value is num ) {
    print("number! : $value");
  } else if ( value is String ) {
    print("string! : $value");
  } else {
    // ... ?
  }
}

main() {
  foo(42);
  foo("Dart!!");
}

JSX


class Test {
  static function foo(n : number) : void {
    log "number! : " + n as string;
  }
  static function foo(s : string) : void {
    log "string! : " + s;
  }

  static function run() : void {
    Test.foo(42);
    Test.foo("JSX!!");
  }
}

Dartはoptional typingのため、このように書くしか他ありません。そのうちに糖衣構文でも入るかもしれませんね。速度も少し気になります。 そしてJSX。なんという事でしょう・・・。オーバーロードが出来ている・・・。吐かれるjsのコードも勿論別物になっています。

(パフォーマンスを追記予定・・・もう少々・・・)

vs JSX その1 のまとめ。 やはり、構文はDartの方がスッキリしていて好きなのですが、JSXのこの静的型付けの威力の前では太刀打ちできないですね・・・。こんなはずでは。 次回ではよりJSXのコードを読みこみ、更なる濃ゆい戦いをお見せ出来るように調べてきます。 具体的には、DartジェネリクスとJSXのテンプレート。実際の活躍の場であるブラウザでのプログラムの書き方などなど。 Dart頑張れ!