2011/03/27

[java]Cからコールバックしたい(考察編)

まだ考えている段階で、調査してない。

今回Javaを調べ始めたのも、元はといえばJNIで呼び出した先からコールバックしたいというだけのことだ。
私の思うコールバック(Javaではない)は、自分の関数を相手から呼び出してもらう、だ。
それだけのしくみ。
電話の「かけ直してください」だ。

電話だと、相手が誰からなのかは固定されていない。
固定された相手だったら単なる関数呼び出しなのだが、不定なので「かけ直してください」という登録が必要になる。
なので、呼び出してもらう関数を登録するところから呼び出しするまでが「コールバック」としてよいだろう。
よいのだ。

C/C++ならば、引数でアドレスを教えてもらって保持するだけだ。
コールも、そのアドレスを呼び出すだけ。
実にシンプルで、私にとってはわかりやすい。
わかりやすいが、安全ではない。
アドレス/ポインタでC/C++でチェックできるのは、NULLかどうかくらいしかない。
無効なポインタかどうかのチェックはできない。
inlineとかになると、関数になるかどうかすら確定してない。
とにかく「書いたコード以上のことはしない」というスタイル。

JNIもC/C++だから、Objectでメソッドのアドレスとコンテキストをもらえば何とかなるかな、と思っていたけれども、リフレクションの話を聞いていて、そんな簡単では済まないと感じた。
ちゃんとJavaVMを介して呼び出すようにしないと、呼び出せないだろうという感触だ。

高速だけど何かあったら即死するC/C++、死んでもJavaVMが管理してくれるJava、というところか。
いつもC/C++でしかコードを書かないけれども、一番気を配らないといけないのは死なないようにすることで、それが一番難しいし時間もかかる。
想定する範囲外でなにか起こったら対処できないし。
「安全」のためには、そういう言語がいいのだろうな、と改めて思った。

まあ、OSの類が動ける環境でなくても使えるC/C++が好き、ということには変わりないがね。
いいところはいいと認める心の余裕はあるのだ。
あとは勉強が足りないのを何とかせんと・・・。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。