Symbian OS

昨日今日とセミナーに行ってきました。
場所は溜池山王駅、山王パークタワー。
普段お世話になってる街と雰囲気違うからなんかいいです。
先月も赤坂見附でセミナーがあったのですが、
ああいうビジネスっぽいというかちょっとした緊張感がある街も悪くないですね。
セミナーの案内を見たときには全然知らないことばかりで不安だったのだけど、
全然知らない人にもわかるように一から教えてくれたので良かった。
内容は書いても問題なさそうなところだけ書くと、
SymbianOSでの開発の話。
Symbianという名前自体初耳だったのだけど、
調べてみるとこれ、EpochOSの名前が変わっただけみたい。
EpochはPDAメーカPSIONが作っていたOSで、
OS開発部隊を分社化し、それにノキア、モトローラ、エリクソンといった
携帯電話大手が出資してSymbianという会社ができたらしい。
同時にEpochOSもバージョン6から名前を変えてSymbianOSにしたと。
それからQuartzというGUIフレームワークがあったのだけど、
これの製造がSymbianからまた分社化したのだかどうかわからないが
子会社のUIQ Technologyがやることになって名前がQuartzからUIQに変わった。
SymbianはイギリスでUIQはスウェーデンだというのが謎だけど。
そういうわけでSymbianOSはいきなり現れていろんな先進携帯端末に
使われるようになったわけではないということだ。
で、このSymbianというOSだがなかなか面白いポリシーを持っている。
携帯端末はPCよりも安定・安全・堅牢性が重要視される。
それでメモリーリークやバッファオーバーランなどのバグが入り込まないように
いろんなところに工夫が凝らされている。
特にフレームワークがなかなか面白い。
開発は基本的にはC++で行うようだけど、
標準の型や文字列は使わない。標準の関数も使わないで、
ディスクリプタという安全なクラスを使う。
C++言語仕様catch-throwでの例外処理ではなく独自の機構trap-leaveを使う。
コンストラクタで初期化しないでね。
インスタンス作ったらオブジェクトスタックというものに積んで開放忘れを防ぐ。
バグが入り込まないように気遣われたコーディング規約。
例えば例外を投げるメソッドには最後にLを付ける、
中でデストラクトするメソッドには最後にDを付ける、
外部リソースを使うクラスの先頭にはRを付ける等々。
マルチスレッドはできるけどなるべくやらないように。
フレームワークがサポートしてるのでActiveObject使ってね。
プロセスレベルのクライアント・サーバによるモジュール化がかなり徹底している。
とにかく面白いところがいっぱいある。
SymbianはリッチOSと呼ぶらしく、速度のことはあまり考えないで
それよりも安全性をとことん気にしてる感じ。
フレームワークや約束事で縛るのもありだとは思うけど、
いっそのこと言語変えちゃえば? と思うのです。
C++だからできるいろいろな工夫だけど、
C++だからコード汚くなっちゃうんだよね。
あと「こういうことなるべくしないでね」とは言えても
C++と銘打っている限りは「できないよ」とは言えないところとか。
言語変えればできなくしちゃって問題無いわけだ。
概念的にはなかなかいい線行ってると思うんだ。
あとは見た目。
既に独自路線つっぱしってるのでC++捨てちゃっても大差ないような…
Windows,UNIXで開発してる人にはけっこう新しいスタイルが多いです。
ま、ASP+VBSよりは何倍かエキサイティングなことは確かです。
こいつで開発する日は果たして来るかどうか。

ほぉ、SymbianOSにそんな特徴があったとは知りませんでした。
なかなか興味深いですね。
>あと「こういうことなるべくしないでね」とは言えても
>C++と銘打っている限りは「できないよ」とは言えないところとか。
>言語変えればできなくしちゃって問題無いわけだ。
あまいな。「しないでね」と「できません」の間には越えられない壁があるんだ。
もし、ある方法以外で実装することが出来ないような機能が必要になったときに、「できません」では困るということ。
プログラマであるプログラマが開発する限りはC++でインラインアセンブリ使用可としておいても良い。しかし、
プログラマと呼べないプログラマが開発に参加する場合があるせいでとんでもないことをしでかすことがある。
要は、包丁を何に使うかと言うことと同じで、モラルのないやつが多くなると「しないでね」を「できません」に
しなくてはならなくなると。
まあ一番の問題は移植の手間がかかりすぎるって事だけど。
>インスタンス作ったらオブジェクトスタックというものに積んで開放忘れを防ぐ。
>マルチスレッドはできるけどなるべくやらないように。
だったらオブジェクトスタックがわざわざ前面に出てくる必要は無いと思うんだが。
class CObjectStack {
CObjectStack();
~CObjectStack();
CObjectStack *m_pcPrev;
CList *m_cObjectList;
static CObjectStack *m_pcCur;
add(CObject *p);
del(CObject *p);
};
CObjectStack::CObjectStack() {
this->m_pcPrev = CObjectStack::m_pcCur;
}
CObjectStack::~CObjectStack() {
CObjectStack::m_pcCur = this->m_pcPrev;
m_cObjectList内のObjectを破棄(開放)する。
}
こんなクラスを用意しておいて、関数で
result func0001(...) {
CObjectStack stack;
CObject *p = new CObject();
return(...);
}
と、pを開放し忘れたとしても、stackが破棄される時に開放できる。もちろんCObjectのコンストラクタ内で
CObjectStack::m_pcCur->add(this);
をする。他のクラスはCObjectから派生させれば問題なし。
グローバルに使いたいポインタをどう確保するかが問題になるけど、例えば
CObjectStack::disable(); // CObjectStack::m_pcCurを退避して、グローバルスタックをセットするメソッド。
ポインタを確保
CObjectStack::enable(); // 退避したCObjectStack::m_pcCurを元に戻すメソッド。
とすれば良いだろう。これなら一般の開発でも実用になるかと。
WINDOWSのハンドルリークを防ぐのも同様の方法でできるので、そのうちライブラリ化する予定。かも
まーとりあえず、最近のソフトは(セキュリティソフトやサーバーソフトでさえ)リークの多いものがあるからね。
開発者の質の低下ってやつですか。
スクリプトエンジンとコンパイラを1つずつ作りたいな。そのうち。できれば。
仮想化を進めたタイプのはjavaがあるから必要なさそうなのでOS書ける(だがしかし普通のコードも書ける)タイプのコンパイラと
自作ソフトに組み込む時のためのスクリプトエンジンかな。
ま今回の記事の一番の謎は、なんでdescriptor(記述子)と呼ぶのかだなのせ
んー確かに。できなくしちゃまずいこともありますね。
いろんな層のプログラムを一つの言語で記述しようとしたら
どっかに皺寄せが行くのは避けられないということかな。
でもただでさえでっかいC++に更に概念や規約をガチャガチャくっつけるのも
どうかと思うわけですよ。一度綺麗に整理して出直して来いやみたいな。
オブジェクトスタックはグローバルな物みたいです。
で、必要となる背景はマルチスレッド云々という話ではなく
関数の途中で例外が発生した時に開放処理が飛ばされちゃう
事に対する対処だと聞きました。
void function(CTrapCleanup* objStack) {
CObject* obj = new (ELeave) CObject();
objStack->PushL(obj);
...
leaveする可能性のある処理
...
objStack->Pop();
delete obj;
}
こうしとけばプログラムがobjのポインタを見失っても
objStackが知ってるので~てことだったと思うのだけど
知ってるからどうすればいいんだろう・・・
そこまでは聞きませんでした。
ディスクリプタについてちょっと補足します。
ディスクリプタは一般的なC/C++プログラムでバイト配列や
ポインタ、ヒープ領域などの危険性のある低レベル操作を
カプセル化したものです。
TDescというのがディスクリプタのルートになっていて、
これを継承してTBuf,TBufC,TPtr,TPtrC,HBufCなどの
クラスが用意されています。
CはConstantの意味で変更不可になります。
ディスクリプタにはいろんなメソッドが定義されているので、
それを使う事によって安全な低レベル操作が可能となります。
例えば、
const char *src = "hello";
char dst[256];
strncpy(dst, src, strlen(src));
以下のような標準的コードをディスクリプタを使って書くと、
_LIT(KSrc, "hello");
TBuf<256> dst;
dst.Insert(KSrc);
合ってるかわからないけどこんな感じ。
KSrcはTBufC型なんだけど定数オブジェクトはKで始める規約。
まぁJavaのプリミティブ型のC++版ですね。
ちなみにintやboolなんかもTInt,TBoolなどクラス化されてます。
Tはスタックに持つクラスですという意味。
ヒープに持つ場合にはCが先頭に付く。
あと外部リソースを使うクラスの先頭がMと書いたけど、
Rの間違いでした。訂正しておきます。
Mはmixin/interfaceクラスに付ける印でした。
>どうかと思うわけですよ。一度綺麗に整理して出直して来いやみたいな。
というか、やり方に問題があるだけのように見える。オブジェクトスタックの実装方法も「はぁ?」と言いたくなるような方法だし。
詳細は↓で。
void function(CTrapCleanup* objStack) {
CObject* obj = new (ELeave) CObject();
objStack->PushL(obj);
...
leaveする可能性のある処理
...
objStack->Pop();
delete obj;
}
objStackを渡さなきゃいけない理由が良くわからないな。グローバルなんでしょ?
ついでに、もしスタックがグローバルなものだとして、pushとpopしかできないものだとすると致命的な欠点があるんじゃ?
leaveする可能性のある処理で、関数αを呼び出すとして、それにobjStackを渡して、α内でスタックに2個push(つまりnew)して、
1個popし忘れ(つまりdeleteし忘れ)たとすると、スタックの位置がずれるわけだよな。でもって、関数から戻った後
function自体で何度かpopするわけで、そうなるとαでdeleteし忘れたものは行方不明だよな。
そもそも確保したらpushする。開放したらpopするという固定処理をプログラマが書くのはどうかと思う。
私の方法だと、開放し忘れは関数から抜ける時に自動で開放される(gabage collect)し、プログラマが意識しなければならないのは
永続オブジェクトを作る場合だけになる。あと、私の方法なら、CObjectStackの寿命を基準として動的確保したオブジェクトの
寿命を決めることができるので便利。
というか、要するに、私の方法だと、javaのように、deleteする必要がなくなるって事だな。
私は基本的に超高級言語(perl,java,phyton,ruby,etc...)系はあまり好きではないので
本とか資料(仕様)を読むことはまず無いからそのへん局長のほうがいろいろ知ってると思うんだが、
とりあえずobjectstackについては私の方法はかなりイイと思うんだけどどう?(そのうちライブラリ化するので意見とかあれば欲しいな)のせ
んー、突っ込むべきかどうか悩みつつ突っ込み。
eclipseの話は、eclipse自身も詳しく知ってる話じゃないから、
それに対して突っ込むのは筋違いな気もするけど(苦笑)、
まあ、オブジェクトスタックのメリットが良く分からないって言う点では同じ。
(でも、なんとなくコンパイラの実装が楽になるっていう感じのことじゃないかと適当に予測)
>とりあえずobjectstackについては私の方法はかなりイイと思うんだけどどう?(そのうちライブラリ化するので意見とかあれば欲しいな)のせ
んー、wizのデストラクタを使って解放っていうのは結構有名なネタで、
既にライブラリが幾つかあったと思うよ。有名所ではBoostとかね。
# 今日はほぼ一日中コーディングしてた。
# 携帯のへたれJavaを使ってると、C++がまぶしい(苦笑
>有名所ではBoostとかね。
聞いたことはあるんだけどなんだか見る気にならないんだよな~と。
いろんなライブラリや言語の特徴をこう数行でまとめたサイトないかな。まあ自力で探すつもりは無いけど。
必要になったら1週間もあれば程ほどのレベルで使えるようになるから、予め本とか検索とかで学ぼうと言う気が起きないな・・・ 困った
そういえば携帯向けのワームがいたような気がするなぁと。携帯でゲームとかいろんなコンテンツを動かそうとすると
機種間の違いをなくしてコンテンツ提供者に有利になるようにjavaなんかの採用が進みそうだけど
そうなるとワームとか作りやすくなるよなと。
>んー、突っ込むべきかどうか悩みつつ突っ込み。
コメント無いと寂しいし、更新しなくなりそうなのでたくさんコメントをした方が良いかなと。
yamaとか既にTOP記事の無いやつもいるけどね。今ごろ凍ってたりして。:-P
オブジェクトスタックについてはいろいろ調べてみたのだけども
どうも納得のいく解説が見つかりませんでした。すみません。
というかそもそも日本語の資料皆無ですし・・・
まぁwizのCObjectStackだとちゃんとできるってことはわかりますけど、
SymbianOSもちゃんとできてるとは思いますよ。
anmも言ってるように私が詳しく知らないからちゃんと説明できないだけで。
あとコメントについてはつけてくれると確かに嬉しいです。
書く原動力にもなります。
お気遣いありがとうございます。
# でも直接それをここで言うかなぁ・・・まぁいいんだけどー
あと更新しないとTOPに記事が何にもなくなっちゃうのは
MovableTypeの設定で回避できるんですよね。
うちは常に最近5件のエントリーを表示するようにしてます。