2012年2月29日水曜日

Dartにおける論理型(boolean)の扱い

このエントリーをはてなブックマークに追加
Dartの論理型(boolean)は、他の多くのプログラミング言語と同様にtrue(真)とfalse(偽)の2つの値から構成され、型はboolです。

また、論理型以外の型は、必要になると自動的(暗黙的)に論理型へと変換されます。例えば if 文などの条件式では論理型しか受け付けませんが、そこに論理型以外の値をとる式を書くと論理型に変換されます。

論理型への変換ルールはとても単純で、true 以外のすべての値は false になります。
if (1) { print('これは表示されません。'); }
else   { print('1はfalseに変換されます。'); }
if ("abc") { print('これは表示されません。'); }
else       { print('"abc"はfalseに変換されます。'); }
これは他の多くの言語と異なりますので注意しておいた方が良いでしょう。

ただしこの説明は、現時点での最新版の仕様であるバージョン0.07に基づいたものです。いくつか変更の要望も出されているようですので、今後変更になるかもしれません。

Dartのビルド状況が公開されています

このエントリーをはてなブックマークに追加
Dartのビルド状況が次のURLで公開されています。

BuildBot: Dart
http://build.chromium.org/p/client.dart/console

これを見ると、ツールやプラットフォームごとのビルド状況がわかります。失敗したビルドやそのコミットが一目瞭然ですね。

このサイトはBuildBotというCI(Continuous Integration)システムが使われています。

UbuntuでDart Editorを使う

このエントリーをはてなブックマークに追加
Ubuntu 11.10上で、Dartの統合開発環境であるDart Editorをインストールし、Dart言語でスクリプトを作成して、実際に動かしてみるまでの手順です。

Windowsの場合は「WindowsでDart Editorを使う」をご覧ください。

1. UbuntuソフトウェアセンターからOpenJDK Java 7 Runtimeをインストールします。

2. Dart Editorのページ から自分の使用している環境に合わせて 32-bit Dart Editor(リンク) か 64-bit Dart Editor(リンク) のダウンロード リンクを開きます。

3. ダウンロードしたアーカイブをすべて展開します。

4. DartEditorを実行します。

5. Dart Editorのウィンドウが開きます。

6. メインメニューから「New Applications...」を選択します。

7. プロジェクトの名前とディレクトリを指定し、Application TypeとしてScriptを選択します。入力を終えたらFinishボタンを押します。

8. プロジェクトが作成されます。

9. ツールバーの緑色の丸に矢印の実行ボタンを押します。

10. エラーになってしまいました。メッセージを見ると libcrypto.so.0.9.8 が見つからないようです。(必要なlibsslのバージョンはDart Editorのバージョンによって変わります。組み合わせによっては最初から対応するlibsslが入っている場合もあり、その場合はエラーなく実行できます。)
11. libcrypto.so.0.9.8 は libssl 0.9.8 に含まれていますので、Ubuntuソフトウェアセンターからインストールします。

12. Dart Editorに戻って実行ボタンを押すと、Dartスクリプトが実行され、実行結果がConsoleに表示されます。今度は正常に実行されました。

今回使用したバージョン:
  • Ubuntu 11.10
  • Dart Editor 0.1.0.201202240929 Build 4577

WindowsでDart Editorを使う

このエントリーをはてなブックマークに追加
Windows 7上で、Dartの統合開発環境であるDart Editorをインストールし、Dart言語でスクリプトを作成して、実際に動かしてみるまでの手順です。

Ubuntuの場合は「UbuntuでDart Editorを使う」をご覧ください。

1. Javaのページ からJava実行環境をインストールします。

2. Dart Editorのページ から自分の使用している環境に合わせて 32-bit Dart Editorリンク) か 64-bit Dart Editorリンク) のダウンロード リンクを開きます。

3. ダウンロードしたアーカイブをすべて展開します。

4. DartEditorを実行します。

5. Dart Editorのウィンドウが開きます。

6. メインメニューから「New Applications...」を選択します。

7. プロジェクトの名前とディレクトリを指定し、Application TypeとしてScriptを選択します。入力を終えたらFinishボタンを押します。

8. プロジェクトが作成されます。

9. ツールバーの緑色の丸に矢印の実行ボタンを押します。

10. 実行結果がConsoleに表示されます。

今回使用したバージョン:
  • Windows 7 Ultimate with Service Pack 1
  • Dart Editor 0.1.0.201202270526 Build 4612

2012年2月28日火曜日

Dartにおける等価比較

このエントリーをはてなブックマークに追加
Dart言語においてオブジェクトが等しいかどうか(等価かどうか)を比較するには、2種類の方法があります。

まずひとつは == 演算子を使う方法。これは左辺オブジェクトの == メソッドを呼び出し、その値によって結果が決まります。Dartでは演算子を自分で再定義(演算子オーバーロード)できますので、これによって == 演算子を使用した時の動作を変更することができます。左辺のオブジェクトが == 演算子をオーバーロードしていない場合は、基底のクラス(何も継承していないクラスならばObjectクラス)にある == メソッドが呼ばれます。

たとえば、あるクラスCが、aとbという2つのint型の値を持っていたとしましょう。しかし == の比較には a しか使用しないとします。この場合のコードは次のようになります。サンプルコード
class C {
  int a_, b_;
  C(this.a_, this.b_) {}
  // a_の値しか比較しない。b_の値は違っていても構わない。
  bool operator==(other) { return this.a_ == other.a_; }
}

main() {
  C one = new C(1, 1);
  C two = new C(1, 2);
  if (one == two) {
    print('one == two');
  } else {
    print('one != two');
  }
}
このコードを実行すると one == two を出力します。operator== をコメントアウトすると Object.== が呼び出され、one != two と表示されるようになります。

もうひとつの比較方法は、=== 演算子を使う方法です。こちらはオブジェクトの参照が等しいかどうかが評価されます。つまり値が同じかどうかではなく、まったく同じオブジェクトかどうかです。サンプルコード
main() {
  Object one = new Object();
  Object two = one;
  if (one === two) {
    print('one === two');
  } else {
    print('one !== two');
  }
}
このコードの実行結果は one === two になります。two の値を new Object(); にすると、結果は one !== two です。

すでに登場していますが、== の結果の真偽値が逆になる演算子は != 演算子で、同様に === の結果が逆になるのは !== 演算子です。

なお、=== 演算子はオーバーロードできません。

Dartで文字列リテラルを使う

このエントリーをはてなブックマークに追加
Dartで文字列リテラルは次のように使います。
String hoge1 = 'hoge';
String hoge2 = "hoge";
シングルクォートとダブルクォートはどちらも同じです。シングルクォートで囲まれた文字列にはダブルクォートを含むことができます。逆も可能です。

シングルクォート3つ、あるいはダブルクォート3つを続けると、複数行の文字列も表現できます。
String hoge3 = '''abc
def''';
String hoge4 = """ghi
jkl""";
これらは改行が含まれる文字列として扱われます。サンプルコード
main() {
  String block = '''
<div>
  <span class="xyz"/>
</div>
''';
  print('<body>' + block + '</body>');
}
実行結果は次のようになります。
<body>
<div>
  <span class="xyz"/>
</div>
</body>
文字列の中にはエスケープ シーケンスが使えます。\r(キャリッジリターン)、\n(改行)などのよく使われるものの他に、\uに16進数値4桁あるいは \u{16進数値} でユニコード文字を表せます。
String hoge5 = '\x0A'; // 改行
String hoge6 = '\u3042'; // 'あ'
文字列の先頭にアットマーク @ をつけると、エスケープ シーケンスとなる文字をエスケープせずに、そのままの文字として扱えます。サンプルコード
String hoge7 = @'\x0A'; // '\x0A'
String hoge8 = @'''a\n
b'''; // 'a\nb'('\n'のうしろ改行が入る)
また、文字列リテラル中にドルマーク $ で始まる表現を使って、変数名などの式とその値を使った文字列補間(String interpolation)が行えます。
int a = 5;
print('a=$a'); // a=5
式の区切りが明らかでない場合は、変数名をかっこ {} で囲います。
int b = 5;
print('b=${b}th'); // b=5th
文字列補間はネストできますので、こんな書き方もできます。サンプルコード
main() {
  for (int i = 1; i <= 5; i++) {
    print('${i == 1 ? "${i}st" : i == 2 ? "${i}nd" : i == 3 ? "${i}rd" : "${i}th"}');
  }
}
実行結果は次のようになります。
1st
2nd
3rd
4th
5th

Isolate APIが変更になります

このエントリーをはてなブックマークに追加
DartのIsolate APIが変更になります。

今までは分離処理を行うためにIsolateクラスを派生したクラスを作る必要がありました。この方法は今後使えなくなり、新たに用意された dart:isolate ライブラリにある spawnFunction メソッドを呼び出し、指定した関数をそのまま分離処理に利用するようです。

詳細はDart News & Updatesにて。

Upcoming changes to the isolate API

2012年2月27日月曜日

スクリプトの実行時間を計測する

このエントリーをはてなブックマークに追加
Dart VMでDartスクリプトを実行するときに --time_all オプションを付けると実行時間の詳細が項目別に表示されます。

実行例を見てください。
$ dart --time_all pi.dart
pi = 3.141603
Script Loading :  281 micros.
Snapshot Creation :  0 micros.
Isolate initialization :  23031 micros.
Function compilation :  4654 micros.
Bootstrap of core classes :  83 micros.
Total runtime for isolate :  189878 micros.
それぞれの実行時間について、フラグを指定することで個別に出力することもできます。
  • time_all:個別のすべての実行時間を表示する
  • time_total_runtime:全体の実行時間を表示する
  • time_bootstrap:コアクラスのブートストラップ時間を表示する
  • time_compilation:関数のコンパイル時間を表示する
  • time_isolate_initialization:分離の初期化時間を表示する
  • time_creating_snapshot:スナップショットの作成時間を表示する
  • time_script_loading:スクリプトのロード時間を表示する
今回使用したコード(pi.dart)はこちら。
main() {
    double x = 1.0;
    double sign = 1.0;
    for (int i = 1; i <= 100000; i++) {
        sign *= -1; 
        x += sign / (2 * i + 1);
    }
    print("pi = " + (x * 4));
}


こちらもどうぞ

Dart VMのコマンド オプション

このエントリーをはてなブックマークに追加
dartコマンドで起動するDart VMには、Dart VMに渡すフラグを指定することができます。dartコマンドの実行時に --print_flags オプションを指定すると、フラグの一覧と、そのフラグの現在の状態を表示することができます。

フラグに値を指定するには、= に続けて値を指定します。例えば --code_heap_size=8 のようになります。真偽値(有効無効)で指定するものについては、true または false を指定します。例えば --enable_type_checks=true のようになります。

真偽値を指定するフラグには、フラグ名の先頭に no_ を付けることで、そのフラグを無効化することもできます。例えば、enable_type_checks フラグを無効化するには、コマンドラインで --no_enable_type_checks と指定します。

おそらくバージョンによって使えるオプションは変わりますが、現時点での最新版(リビジョン4577)のDart VMには次のフラグが用意されています。リストにある値は、オプションを指定しなかった場合のデフォルト値です。
  • verify_implements: false (Verify that all classes implement their interface.)
  • trace_type_finalization: false (Trace type finalization.)
  • trace_class_finalization: false (Trace class finalization.)
  • print_classes: false (Prints details about loaded classes.)
  • trace_bailout: false (Print bailout from new compiler.)
  • use_new_compiler: false (Try to use the new compiler backend.)
  • deoptimization_counter_threshold: 5 (How many times we allow deoptimization before we disallow certain optimizations)
  • trace_compiler: false (Trace compiler operations.)
  • disassemble: false (Disassemble dart code.)
  • print_stack_trace_at_throw: false (Prints a stack trace everytime a throw occurs.)
  • ignore_unrecognized_flags: false (Ignore unrecognized flags.)
  • print_flags: false (Print flags as they are being parsed.)
  • print_flow_graph: false (Print the IR flow graph.)
  • code_heap_size: 8 (code heap size in MB,e.g: --code_heap_size=8 allocates a 8MB old gen heap)
  • old_gen_heap_size: 512 (old gen heap size in MB,e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap)
  • new_gen_heap_size: 32 (new gen heap size in MB,e.g: --new_gen_heap_size=64 allocates a 64MB new gen heap)
  • gc_at_alloc: false (GC at every allocation.)
  • verify_after_gc: false (Enables heap verification after GC.)
  • verify_before_gc: false (Enables heap verification before GC.)
  • verbose_gc: false (Enables verbose GC.)
  • trace_isolates: false (Trace isolate creation and shut down.)
  • report_invocation_count: false (Count function invocations and report.)
  • generate_gdb_symbols: false (Generate symbols of generated dart functions for debugging with GDB)
  • trace_optimization: false (Trace optimizations.)
  • silent_warnings: false (Silence warnings.)
  • warning_as_error: false (Treat warnings as errors.)
  • trace_parser: false (Trace parser operations.)
  • enable_type_checks: false (Enable type checks.)
  • enable_asserts: false (Enable assert statements.)
  • trace_resolving: false (Trace resolving.)
  • print_tokens: false (Print scanned tokens.)
  • disassemble_stubs: false (Disassemble generated stubs.)
  • use_slow_path: false (Set to true for debugging & verifying the slow paths.)
  • inline_alloc: true (Inline allocation of objects.)
  • time_all: false (Time all functionality)
  • time_total_runtime: false (time_total_runtime)
  • time_bootstrap: false (time_bootstrap)
  • time_compilation: false (time_compilation)
  • time_isolate_initialization: false (time_isolate_initialization)
  • time_creating_snapshot: false (time_creating_snapshot)
  • time_script_loading: false (time_script_loading)
  • verify_on_transition: false (Verify on dart <==> VM.)
  • print_stop_message: true (Print stop message.)
  • trace_runtime_calls: false (Trace runtime calls.)
  • trace_patching: false (Trace patching of code.)
  • trace_ic: false (trace IC handling)
  • trace_deopt: false (Trace deoptimization)
  • inline_cache: true (enable inline caches)
  • optimization_invocation_threshold: 1000 (Number of invocations before a function is optimized, -1 means never.)
  • print_ic_in_optimized: false (Debugging helper to identify potential performance pitfalls.)
  • trace_functions: false (Trace entry of each function.)
  • print_scopes: false (Print scopes of local variables.)
  • print_ast: false (Print abstract syntax tree.)
  • compiler_stats: false (Compiler stat counters.)
  • intrinsify: true (Instrinsify when possible)
  • trace_natives: false (Trace invocation of natives)
  • print_bootstrap: false (Print the bootstrap source.)
  • trace_type_checks: false (Trace runtime type checks.)
  • trace_intrinsified_natives: false (Report if any of the intrinsified natives are called)
多くのフラグがありますが、ほとんどはあまり使用機会がないものだと思います。よく使われるのは次のフラグでしょう。
  • --enable_type_checks:型チェックを有効にします。
  • --silent_warnings:警告を抑制します。
  • --warning_as_error:警告をエラーとして扱います。
  • --enable_asserts:assertを有効にします。

こちらもどうぞ

日経LinuxにDartの記事が載っています

このエントリーをはてなブックマークに追加
日経Linux 2012年2月号と3月号でDartについての記事が載っています。現時点でDartについてまとまった情報が日本語で手に入るのは貴重です。

日経Linux 2012年2月号
JavaScriptを置き換える?! Googleの新言語「Dart」
前編 DartEditorを使って体感してみよう

 

日経Linux 2012年3月号
JavaScriptを置き換える?! Googleの新言語「Dart」
後編 言語仕様を学んで開発してみよう

 

Dart SDKをダウンロードする

このエントリーをはてなブックマークに追加
最新のDart SDKは次のURLからダウンロードできます。

http://gsdview.appspot.com/dart-editor-archive-integration/latest/
今のところDart SDKの正式なリリースは公開されていませんが、前述のURLからダウンロードできるものはある程度動作が確認されたものです。

Dartは活発に開発されていますので、より新しい機能は前述の最新版には含まれていないこともあります。さらに新しい機能を試してみたい場合は、最新のソースコードから自動的にビルドされたDart SDKを利用することもできます。ダウンロードは http://gsdview.appspot.com/dart-editor-archive-continuous/ からできます。ただしこのビルドは1日に何度も更新されており、正しく動かない場合も十分に考えられますので注意してください。

Dart SDKには主に次のものが含まれています。
  • Dart VM
  • Dartライブラリ
  • Dart-to-JavaScript Compiler (コマンドはfrogcです)
  • Dartium (現時点では自動ビルドのLinux版のみに含まれています)
Dartiumは、Dart VMを組み込んだChromiumのニックネームです。ChromiumはGoogle Chromeのオープンソース版のビルドで、Chromeの開発版にあたります。

DartをWebブラウザ上で試す - Dartboard

このエントリーをはてなブックマークに追加
DartプログラミングをWebブラウザ上で試すことができます。

Dartboard: try.dartlang.org


このページを開くとプログラム開発環境のような画面が表示されます。白地のエディタ部分にDartのコードを入力し、左上の丸に三角のボタンを押すと、実行結果が画面下に表示されます。

実行結果には print関数 の引数に指定した文字列が表示されます。

右上に表示されているURLを共有すると、そのコードを共有することができます。

FizzBuzz: http://try.dartlang.org/s/Chwt


書いたコードを共有と、共有したコードがそのまま実行できるので便利です。

ただしtry.dartlang.orgでは、外部のライブラリをインポートしたりはできないようです。


こちらもどうぞ

Dartとは

このエントリーをはてなブックマークに追加
DartはWeb向けの新しいプログラミング言語です。サーバーとクライアント両方のアプリケーションを、ひとつの言語で効率的に開発することができます。

公式の情報は次のサイトにあります。

Dart : Structured web programming

その他の情報。