はじめまして。共同開発部でサーバ開発を担当しています とあるPlan 9使い こと門多です。
このごろ、 Ubuntu Phone、Firefox OS、Tizenなど、
いろいろなモバイル OS が現れてきていますよね。有名どころは他の人がやってくれているので、
最もマイナーな Inferno Phone(Hellaphone) を動かしてみた様子をご紹介したいと思います。
Inferno OS って?
まず、Inferno OS の前に、おそらくご存じない方が多いと思いますので、Inferno についてご紹介します。
Inferno とは、UNIX を開発したチームが、
UNIX の問題点を解決しようと開発した Plan 9 の成果をもとに、
組み込みデバイスや、 Windows や Linux などの OS の上でも動作することを目的として開発したものです。
主な開発言語は Limbo と呼ばれる、C like な言語で、 ls や cat といった基本的なコマンドを除いて異なっていて (vi さえありません)、
割と癖がある OS です。この記事の主題からは外れるので紹介だけに留めますが Inferno は Java や C# と同じように、
仮想マシンのうえで動作する OS なので、Windows, Mac, Linux といった OS の上でも動作します。興味のある方はぜひ動かしてみてください。
Inferno Phone って?
Inferno Phone(Hellaphone) とは、
Inferno を Android 端末の上で動かそうという試みです。
Android は結局 Linux なので、 Dalvik VM の代わりに Dis (Inferno が動作する仮想マシン)を動かせばいけるんじゃね?ってことみたいですね。
実際に Inferno Phone に付属していたインストールスクリプトを読んでみましたが、
Android の起動スクリプトから、 sshd が立ち上がるところを emu という Inferno のコマンドに差し替えてありました。
というわけで早速みていきましょう。
まずはホーム画面。最上部のボタンをタップすると、機能メニューが展開します。
基本的にはこのメニューからすべて操作します。左下の「100%」というのはバッテリ残ですね。
起動直後のプロセス一覧。シンプルです。
シェルも動きます、が、残念ながらキーボードが表示されないので、コマンド入力はできませんでした。
Inferno Phone 開発ことはじめ
Inferno Phone は Inferno そのものなので、Dis (Infernoが動作する仮想マシン)のバイナリが動作します。
Dis バイナリは Limbo という言語で作成するのですが、Inferno 環境には標準で Limbo コンパイラが入っていますので、
開発ツールは Inferno 環境そのものということになります。
Limbo でコードを書く
ここでは、簡単に、100個のスレッドを立てて、最初のスレッドから順番に値を回していって、
それぞれのスレッドが0〜99までの値を加算して、
すべての合計を出力するというプログラムにしました。
これは Mac で動いている Inferno です。右のほうに表示されている値は実行結果です。
Dis バイナリを Inferno Phone へ送る
Limbo のプログラムはコンパイルすると .dis というバイナリになります。これを adb を使って端末へ push します。
adb push demo.dis /data/inferno/usr/root/dis/demo.dis
最後に、Inferno 環境の/usr/root/lib/wmsetupを編集して、demo.dis が動作するようにしておきます (wmsetup が無ければ作ります)。
とりあえず Tk でウインドウを作るのが面倒だったので、ただのテキスト書き出しにしています。
bind -a $home/dis /dis; demo >$home/demo.out
Inferno Phone とはいえ中身は Inferno なので、当然ですが動いていますね。
おわりに
実際は、こんなシンプルな出力ではなくて、Tk というグラフィックス言語を使って、ガシガシ書いていく感じになります。
今回さわってみて感じたのは、現在のバージョンの Inferno Phone は、とりあえず動きました程度でしかなく、割と操作に難がありますけれど、
Inferno そのものは自分の資源(ファイルとかデバイス)を外部環境へエクスポートできたりと、非常に強力なので、発展してほしいですね。
個人的には、Inferno Phone は httpd などサーバプログラムも動作するので、手元にサーバを持ち歩いて、
必要なときにネットワーク経由で Inferno Phone からリソースを取り出す的な使い方になるといいんじゃないかなと思っています。
Inferno は、実際に組み込み OS として出荷されて、その機器はネットワーク上にリソースを提供していた例もあるようですよ。
参考資料
作者の方が作ったスライド (英語)が、知っている限りいちばんよくまとまっています。
B2G(Boot to Gecko) を使って Inferno Phone をブートする話。試せていませんが、Android 4 系でもブート可能なようです。
Inferno そのもののドキュメント。著者がそうそうたるメンバーですね!