2014/03/29

Googleの新言語 Dart 期待ですね JavaScriptとDartVMで動作が違います

 Googleが開発している新言語Dart。
 これが実現すれば現代の複合的な技術の融合体であるWebシステムを、非常にシンプルにできるので、期待しています。
 ただ、まだ仕様が色々と変化するので少々没頭出来なかったのですが、なんと2013/11/14に1.0仕様が出来上がり、今はECMAが標準化を開始しています。
 標準化がなされれば、安心してシステムに採用でき、今までよりシンプルとなれば、爆発的に普及する可能性もありますね。
 (現行システムは残るでしょうから、全部が一新というわけには行きませんが)

 ということで最近触っているのですが、DartはDartVMとJavaScriptの両方で動くということで、JavaScriptの浮動小数点演算をどう乗りこなしているかなぁと。
 疑問があったら早速やってみようということで、やって見ました。
 なんと残念なことに、DartVMとJavaScriptで差が出ました。これって演算を行うシステムでは致命的に思われます。

検証内容と結果

 JavaScriptの浮動小数点は指数部(12ビット)、仮数部(52ビット)なので、2の52乗の値と、それに1を加えたものを表示してみます。

  2の52乗    =9007199254740992
  2の52乗+1=9007199254740993

 プログラムは、DartEditorで作成されるひな形を簡単に加工して表示してみます。
 以下のものです。
import 'dart:html';
void main() {
  querySelector("#sample_text_id")
      ..text = (9007199254740992).toString() + "   [" + (9007199254740993).toString() + "]"
      ..onClick.listen(reverseText);  
}
void reverseText(MouseEvent event) {
  var text = querySelector("#sample_text_id").text;
  var buffer = new StringBuffer();
  for (int i = text.length - 1; i >= 0; i--) {
    buffer.write(text[i]);
  }
  querySelector("#sample_text_id").text = buffer.toString();
}
 DartVMでの実行結果が以下のもの。2の52乗+1=9007199254740993がきちんとそのままの値で表示されています。([]内の値ですよ)

 JavaScriptでの実行結果が以下のもの。2の52乗+1=9007199254740993が9007199254740992と違う値が表示されています。([]内の値ですよ)

 DartVMがブラウザ側で動くのは当分の間は無理だと思います。ということなので少々無駄ですが、重要な演算はサーバ側のDartVMで動作させて転送するしかないようです。

 Dartでは整数のintと浮動小数点のdoubleの2種類がありますが、JavaScriptは浮動小数点演算しかありません。このことを注意した方がよさそうです。

0 コメント:

コメントを投稿