2012年3月2日金曜日

Dartium を使ってみる

このエントリーをはてなブックマークに追加
Dartium は、Dart VM が組み込まれた Chromium です。Chromium は Chrome Webブラウザのオープンソース版です。

Dartium を使えば Dart をWebブラウザ上で試すことができます。現在のところDartiumのLinux版とMacOS X版のバイナリーが公開されていて、Dartの公式サイト内にある Chromium with the Dart VM のページからダウンロードすることができます。Windowsでも自分でビルドすれば動くと思いますし、遠くないうちに提供されるのではないかと思います。

Dartium を起動するとこんなかんじです。

Chromiumとほとんど変わりません。aboutの画面はこんなかんじです。

Dartのサンプルに含まれている dart/samples/hi を表示してみましょう。Dart VMが組み込まれていない通常のChromeですとこうなります。

Dartiumですとこうなります。

Dart言語の部分のコードはこうなっています。
#library('hi');

#import('dart:html');

main() {
  document.query('#status').innerHTML = 'Hi, Dart';
}
このサンプルから呼び出されている dart.js のコードを見ると、JavaScriptからDartのコードを開始していることがわかります。該当部分を抜粋したものが次のコード片です。
if (navigator.webkitStartDart) {
  navigator.webkitStartDart();
}
navigator.webkitStartDart() を呼び出すことで、Dartのmain関数が呼び出されるようです。


こちらもどうぞ

2012年3月1日木曜日

Dartにおける型とモード

このエントリーをはてなブックマークに追加
Dartにおいて特定の型を想定せずに変数を定義するには、varキーワードを使います。
var a = 1;
var b = 'abc';
定義の時に初期化を行わない場合、その値はnullになります。

varを使って定義した変数は動的な型(厳密にはDynamic型)になり、どのような型のオブジェクトでも代入することができます。初期化のときに設定した値とは別の型でもかまいません。
var a = 1;
a = 'abc'; // 問題なし
またDartには、boolintdoubleなどのインターフェイスが標準のライブラリ dart:core に用意されています。Dartでは、varを使って定義した変数だけではなく、どんな型を使って定義した変数であっても、すべての型の値が代入できます。つまり次のようなコードでも文法上は問題ないというわけです。
int a = 1;
a = true; // intで定義した変数aにboolの値を代入している。
a = new List(); // intで定義した変数aにListのオブジェクトを代入している。
String b = 2; // Stringで定義した変数bを整数2で初期化している。
変数aは型intを使って定義されていますが、bool型であるtrueやList型のオブジェクトも問題なく代入できます。つまり変数の定義時にどのような型を指定しても動的な型として扱われ、他のあらゆる型のオブジェクトも代入することができます。

ここでは代入のみ例に出しましたが、関数の呼出しパラメーターや、関数からの戻り値でも同様です。つまりパラメーターにint型の値を受けとると指定された関数にtrueを渡せますし、戻り値としてint型を返すと指定された関数がList型のオブジェクトを返すことも可能です。

ここまでは普通にDartのコードを実行した時の説明でした。Dartにはこれとは別に、型のチェックを有効にするモードがあります。上で見たような型チェックを行わないモードを「プロダクション モード(production mode)」、型のチェックを行うモードを「チェック モード(checked mode)」と呼びます。
int a = 1;
a = true; // エラー
a = new List(); // エラー
String b = 2; // エラー
var c = 1;
c = true; // 問題なし
c = new List(); // 問題なし
チェック モードでは、変数を定義したときと別の型の値を代入しようとするとエラーになります。ただしチェック モードでも、var型の変数はどのような型の値を代入してもエラーになりません。

Dartboard では、左上の「Checked Mode」のチェックを入れるとチェック モードになります。

チェック モードの型チェックは、コンパイル時と実行時の両方で行われます。コンパイル時にはコード上で明らかに分かるエラーのみチェックされ、あとは実行時にチェックが行われます。実行時にエラーを検出するとその場で動作は停止します。

プロダクション モードはチェックが行われませんので、プログラムの実行が停止することはありません。もし実行に影響のある問題が起きた場合は、例外が発生します。たとえばある型を想定してメソッドを呼び出したがそのような名前のメソッドは存在しなかったときには、NoSuchMethodException が発生します。


こちらもどうぞ

Dartにおける剰余(モジュロ)

このエントリーをはてなブックマークに追加
Dart言語では剰余(除算の余り)は % 演算子で計算できます。
main() {
  print('3 % 2 = ${3 % 2}'); // 3 % 2 = 1
}
これは問題ないと思いますが、負の値を与えたときには注意が必要です。Dartでは剰余の計算結果における符号は、常に正となります。サンプルコード
main() {
  print(' 3 %  2 = ${ 3 %  2}'); //  3 %  2 = 1
  print('-3 %  2 = ${-3 %  2}'); // -3 %  2 = 1
  print(' 3 % -2 = ${ 3 % -2}'); //  3 % -2 = 1
  print('-3 % -2 = ${-3 % -2}'); // -3 % -2 = 1
}
これはC/C++やJava、Ruby、Pyhtonなどと異なる動作です。たとえばJavaでは、剰余の符号は割られる数(被除数)の符号と一致します。他の言語の感覚で扱ってしまうと思わぬ動作にはまってしまうかもしれませんので注意してください。

とはいえ、ここで例にあげた言語だけでも剰余の符号の扱いはそれぞれ異なりますので、どの言語で書く場合でも剰余の扱いは注意が必要なポイントです。

この動作は実際のDart VMで確認したものです。確認できた限りではDart言語仕様で触れられてない内容ですので、今後変更になるかもしれません。