Java MIDP 実装 on HTML5 and Flash@Firefox Developers Conference 2010

今日は、Shibuya.js のイベントの一環として、Firefox Developers Conference 2010 で、「Java MIDP implementation on HTML5 and Flash」というタイトルでしゃべらせていただきました。

jQuery の作者の John Resig さんなど外国の方がいらした関係で、スライドがすべて英語です。

最近、携帯電話 の JavaMIDP の処理系を HTML5 および Flash で実装しています。それのプレゼンです。 http://orto-app.com/ でαバージョンを公開しましたので、よかったらご覧ください。IE8でみると、Flashで動きます。全体として、だいぶ、バグが多いのです。ごめんなさい。(画面転送が半分くらいのアプリでしか動いていません)。アプリももっといろいろ動くようにしたいです。

作っているのは、

  1. MIDP の処理系。Java class ファイル → JavaScript, ActionScriptコンパイラ
  2. MIDP の画面転送

この2つを作っています。画面転送は、遅延も小さくして、遠隔でもゲームができるクオリティで作ろうと目指しています。MIDPの処理系の方は高速化もがんばっていまして、パソコンでしたら十分な速度で動いていると思います。

僕の発表時間が1分短くなった関係もあり、最後の方が話せなかったので、コントロールフローグラフについてブログで補足させてください。

goto などで分岐が出てこないのを基本ブロックといいます。最後のページのスライドですが、分岐が出てこないということを利用して最適化をかけることができます。Java ニーモニックで、iload というのはローカル変数読み出してをスタックに積む命令ですが、単純に実装すると、stack は JavaScript の Array になりますが、Array.push() や Array.pop() は時間のかかる処理です。

しかし、Java のスタックの何番目に積むかという、スタックの深さは、実行パスに関係なく、静的に決まらないといけないという規約になっています。そのため、この部分は、JavaScript のローカル変数を代わりに使うことができます。それが Optimized JavaScript の部分です。

そして、基本ブロック内は分岐が出てこないことがわかっているので、2行目の localVars1 = stack1 の stack1 はその前をみると stack1 = localVars2 しているので、localVars2 が localVars1 にくるととがわかります。その処理をしたのが、More Optimized JavaScript です。

この JavaScript が僕のコンパイラで生成されているのですが、ブラウザの JIT コンパイラx86 に変換された(厳密にはイメージです)結果が一番下の JIT x86 で、結果として、C言語で同じようなコードを書いた場合と同じような x86 になり、高速化することができます。

という話を、2分でしようと思ったのですが、時間不足で全く伝わる形で説明できなくてごめんなさい。

あと、スピーカーとか関係なく、普通にじゃんけんに勝って、マウスパッド with John Resign のサインをいただきました!ありがとうございます。m(_ _)m