Dartのラクそうなところ The static checker


Eclipse上でAndroidのプログラムをJavaで書いていくのはとってもラクです。何がラクって、間違いをすぐに指摘してくれるところです。一方、XMLを書いているとそこまでラクではないです。何でだろう?もっとEclipse頑張って!と思いがちですが、根は深くてEclipseなどのIDEで何とかできるようなものではないような気がします。

詳細の説明は手に余りますが、Playframework2.0のテンプレートに採用が決まったScalaの良いところをJavaやRubyと比べている記事を紹介しておきます。

Ruby対Scala - tech.cm55.com
http://tech.cm55.com/wiki/scala/ruby
制限が厳格であればあるほど機械的な解析可能性が高まる。プログラマが「この名前とあの名前が同じものであるか」を悩む必要は無くなり、それらをコンピュータに肩代わりさせることができるのである。

Google Developper Day2011のGoogle Apps Script解答例
ところで、Google Developper Day2011のクイズでJavaScriptを書きました。Googleドキュメントで「20都市の日別の供給電力と最大消費電力」が記述されたJSONのデータを取得して個別のシートに展開する問題です。

function myFunction() {
  var url = "http://gdd-2011-quiz-japan.appspot.com/apps_script/data?param=-1488301623206336159";
  var fetchdata = UrlFetchApp.fetch(url);
  var json = Utilities.jsonParse(fetchdata.getContentText());
  var spreadsheet = SpreadsheetApp.getActiveSpreadsheet();

  //都市の数だけシートを追加する
  for(s =json.length - 1; 0 <= s ; s--){
    spreadsheet.insertSheet(json[s].city_name);
    // The code below will move the active sheet to the first position
    SpreadsheetApp.getActiveSpreadsheet().moveActiveSheet(1);

    //追加した名前のシートを取得
    var sheet = spreadsheet.getSheetByName(json[s].city_name);
    for (var i=0; i < json[0].data.length; i++){
      //供給電力(capacity)
      sheet.getRange(i+1,1).setValue(json[s].data[i].capacity);
      //消費電力(usage)
      sheet.getRange(i+1,2).setValue(json[s].data[i].usage);
      //電力の消費割合を0.00%の表示形式で設定
      sheet.getRange(i+1,3).setFormulaR1C1('=(R[0]C[-1])/(R[0]C[-2])').setNumberFormat('0.00%');
    }
  }
}

型のチェックが欲しい
JavaScriptでは変数をintで宣言できません。上の、sheet.getRange(i+1,1)というところ、iが0,1,2,,,ではi+1は1,2,3,,,となりますが、このコードを書いている過程では、01,11,21,,,と文字列の連結として認識されてしまいました。Javaに慣れている方がJavaScriptを書き始めると、きっと遭遇する点ではないかと思います。

このときは、01は1、11は11と認識され、21は元データが20都市だったためループを抜けるように認識されました。for文が2回しか回らなく?となってしまいました。変数宣言が厳格でなくても良いのですが、できれば、ここは間違えの可能性を指摘して欲しいところです。

キャストも面倒
一方、Androidのプログラムをしていると真っ先に覚えるのはボタンのキャストだと思います。
Button button = (Button)FindViewById(R.id.button1);でいうところの(Button)です。いちいちキャストの指示をしなくてもわかりそうなものですが、間違えの可能性を指摘してくれるので私はありがたいと思っています。

Dartはいいとこどり
Dartは型をチェックしてくれますが、キャスト(パース?)しなくても実行してくれるようです。(The static checker)
http://www.dartlang.org/articles/optional-types/#static-checker
For example, consider:
String s1 = '9';
String s2 = '1';
...
int n = s1 + s2;
print(n);
This is clearly a problem. The static checker will issue a warning in this case. Note that the code still runs, setting n to '91' and printing 91.
まさに、私がJavaScriptで引っかかった点が解説されています。


後発だけにシンプルで勉強しやすそう
ActionScript3.0での変数宣言で、var i:int = 0;などと型を後から指定するのを見て「他と揃えてよ!」などという人もいますが、後から言語仕様を拡張したのでしょうがないです。
Javaのジェネリックの入ったサンプルコードを幼馴染のSEに見せたら「<>って何?わからん」とか言っていてビックリしたことがありました。
後に『Java The good parts』を読んで後から追加された機能だと知り納得しました。言語仕様の拡張は便利にはなりますがシンプルさがなくなっていくので、勉強するには面倒です。
その点、Dartはサンプルを見た限りとってもシンプルです。

Virtual machineが気になる
Androidのプログラムをしていると少し不思議なところがあります。WebkitなのかWebClientなのか知りませんが、JavaScriptというかHTML5というか期待するほど対応していないようなのです。まるで、Dart活躍の場所が取ってあるかのようです。
もしかして、DartのVMってDalvik VMとバイナリ互換していたりするのでしょうか?そら恐ろしい感じがしてきました。
GWTの二の舞になるのか大化けするのか楽しみです。個人的には、JavaScriptはそこそこにJavaに注力しておこうと思うニュースでした。

リンク
米Google、ウェブプログラミング構造化言語「Dart」を発表
http://internet.watch.impress.co.jp/docs/news/20111011_482895.html

DART STRUCTURED WEB PROGRAMMING
http://www.dartlang.org/