統一実行環境

tsurumaru2006-12-17

UIEngine が AVM(Flash VM) に移植されたみたいですね。オイラも同じようなコトを考えていたけど…中島さん、流石だなぁ、早いなぁ。思いついてから完成まで持って行くスピードが命だからなぁ、この世界。オイラも見習おうっと。


■真の統一実行環境は存在し得るのか

 一般的に、実行環境を階層分けする場合、CPU、OS、アプリケーションっていう大まかに3階層になるけれども、Java が登場してから、仮想マシンが本格的になってきて、一般的な階層分けが通用しなくなってきている気がします。今現在の一般的な実行環境をアプリケーション側から捉えてみると…x86、ARM、JVM、AVM、.NET CLR が主流になるんでしょうか、やっぱり(*1)。んで、これらの実行環境ですが、仮想マシンである、JVM、AVM、.NET CLR なんかは、CPU というかハードウェア依存しない実行環境を構築するために作られましたが、結果として、複数の仮想マシン環境が出てきていて、なんだか訳のわからない状況になってます。

 まだ、DOS 全盛のころに、DOS(PC-98x1/FM-16B/J-3100)/SystemV/BSD で動作する、単一ソースのフルスクリーンエディタを作ったことがありますが、このころの問題も仮想統一プラットフォームの実現が課題でした(*2)。

 こんなことを考えてみると、Write Once Run Anywhere の問題って、根本的に何も解決してないんですねぃ。さてどうしたものやら


(*1)JVM や AVM、.NET なんかは、デバイス I/O がライブラリに吸収されてるけど、x86 と ARM は OS が要るから、全く同レベルとは言えないのかもしれないけど…
(*2)この時は、DOS版のCursesライブラリを起こして、作ってみたけど、結局コード体系の違いもあったりして、鼻血出しまくりでしたが…


■んじゃ、どうすんだ

 いろんなアプローチがあるんでしょうが、

VM の上で動く VM を作りまくる
 AVM 上で動く JVM とか、JVM 上で動く AVM とかを作れば、たいがいのことは出来るような気がしますが、モバイルデバイスに行った瞬間に、メモリ制限にひっかかって、アウト。

トランスレータを作りまくる
 Java から ActionScript へのトランスレータとか、C#.NETへのトランスレータとかを作りまくる。メモリ効率は最高だし、速度も実行環境上の最高速が実現できる。でもデバイスアクセスしようとした瞬間に、全デバイスのドライバ/ライブラリを作るハメになるので、これもアウト。


 結局、どうにもならんのだな、こりゃ。


■ところで、マルチスレッディングなんですが…

 最近の Pen4 dual core に始まって、Quad core やら、Playstation3 で採用された Cell やら、マルチコアな CPU が増えて参りましたが、このスレッディングの抽象化ってどうすれば良いのでしょう?特に、Cell みたいな、スレッドコンテキスト間での共有メモリマップを持たない実装の場合(正確に言えば、共有は可能だが、そのために転送が発生する)、ワーカスレッド的な動作しか行えないので、単純にワーカスレッドとしてモデリングすれば良いのでしょうが、既存の実行環境(JVM やら AVM)には、CPU を指定したスレッド割付やらの細かいスレッディングコントロールが出来んので、パフォーマンスを絞り出すようなアプリケーションが作りづらいですわいね。

 まぁ、実装技術自身が発展途上なので、本当に問題になるのは、まだ少し先のような気もしますが。


■オイラのお勧めは

 オイラのお勧めマルチスレッディング環境は…

 SQL2005/SQLCLR でんすw。SQL2005くんが CPU 割付やら、優先度設定やら、いろいろやってくれるし、レプリケーションを併用して Grid もどきなこともできたり…

 まぁ、モバイルデバイスとは何の関係もありませんがね。




 あ〜ぁ。ハードウェアをモデリングするトコロから始めんとイカンのかなやはり。MATLABでも調べてみますかねぃ。モデルベースって面白そうだし。モデルベースでハードウェアをモデリングして VM を自動生成ってのが理想ですわいね。先は長いな。