[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[b-free: 1431] Re: 例外処理と RTTIの OSでのサポート (Re:オブジェクト指向のOSへの適用)
林です。ごみ(^_^;)
In message <353D9981.15E90C@bridgew.edu>
"[b-free: 1430] Re: 例外処理と RTTIの OSでのサポート (Re:オブジェクト指向のOSへの適用)"
"Hideaki Suzuki <h1suzuki@bridgew.edu>" wrote:
h1suzuki> ちなみに、Cにあまり慣れていない人(はここにはいない気もするけど)のため
h1suzuki> に補足すると、longjmp できるのは呼び出し側の関数でしかないことを付け加え
h1suzuki> ておきます。関数の call tree を一気にとばして逆戻りはできるけど、関数を
h1suzuki> 超えた goto の様な使い方は出来ません。
(中略)
h1suzuki> 実際に longjmp と setjmp のやっていることは、(library source をみれば一
h1suzuki> 目瞭然ですが)registers の値の保存と回復に他なりません。
スレッドライブラリではこれを利用してコンテキスト切り替えをやってたり
しますね。setjmpで保存するのと同じ形式のコンテキストを自前で用意して
longjmpでスイッチする、と。setjmp/longjmpの実装に依存するけど移植性
は結構高いのかな。まあ単純なcall tree逆戻りでない一例でした。
h1suzuki> > C++ は、プログラムの裏側でコンパイラがごそごそやっている部分がありま
h1suzuki> > すから(constructor/destructor が暗黙で呼ばれたりする)、setjmp/longjmp
h1suzuki> > の処理と合わない部分があるということでしょう。
h1suzuki>
h1suzuki> ごそごそやっているのは、むしろ、例外処理の方ですね。
h1suzuki> 生成子・破壊子は、呼び出される順序も何も明確に決まっていますから。
call tree 逆戻りで constructor/destructor の暗黙呼び出しがあるから、
例外処理が単純なコンテキスト保存じゃすまなくて色々やらないといけなく
なったんですよね。
h1suzuki> > しかし、RTTI の機能にしても例外処理と同じく、C++ の特有の機能であって、
h1suzuki> > 一般的なオブジェクト指向の機能とは言えないでしょう(それ以前に、OS に簡
h1suzuki> > 単に組み込める方法があるんだろうか?)
h1suzuki>
h1suzuki> これは、OSをOOで作るという話でないと、組み込みにくいでしょうね。
h1suzuki> 要は、「動的型検査」の機能ですから、OSが型を扱うかどうかという話になり
h1suzuki> ます。
RTTIの処理はプロセス内で完全に閉じてるからOS機能にしても簡単にならない
どころかむしろややこしくなってコンパイラ作成も難しくなるのでは?
ちなみに例外処理についてはWindows(Win32)では構造化例外処理というC++風
の例外処理を提供していて、これはプロセッサ例外なども捕捉できるのでOSが
提供する意味があるとも言えます。ただコンパイラを複雑にしているのは同じ
じゃないかとも思いますけど。
ちなみにC++の例外処理って構文的にはlispの継続からくるものだそうです。
機能的にはlispのものはずっと自由度が高いらしいですが。
# この辺、聞きかじりで良く分かっていない。
--
Takanori Hayashi
takanori@ohsaki.meidensha.co.jp