前回は、Cocoaのターゲット/アクションパラダイムに着目して、Objective-CとJavaの間でのブリッジを紹介した。肝となるのは、Objective-Cのセレクタをどのように実現するか、という点だった。 Objective-Cには、Java以外の言語からのブリッジが存在する。特に、スクリプティング言語とのブリッジは、お互いに動的な特性が似ているので、実現しやすいようだ。今回は、それらを紹介してみよう。 ----------------------------- PyObjC - Pythonブリッジ ----------------------------- PyObjCとRubyCocoa PyObjCはPythonと、RubyCocoaはRubyとObjective-Cのブリッジを実現する。どちらのライブラリも、Cocoaやその他Objective-Cベースのフレームワークにアクセスすることができ、PythonユーザやRubyユーザならば、使い慣れた言語を使ってCocoaアプリケーションを作ることができる。また、XcodeやInterface Builderといった、Mac OS Xとの開発環境とも統合されており、完成度は高い。 では、これらのライブラリでは、セレクタはどのように扱われるのだろう?結論から言うと、文字列で指定することになる。たとえば、PyObjCでは、次のようなソースコードで、他のアプリケーション起動の通知を受け取ることができる。 class PyTest def application workspace = NSWorkspace.sharedWorkspace() notificationCenter = workspace.notificationCenter() notificationCenter.addObserver_selector_name_object( PyTest.new(), "application", NSApplicationWillLaunchNotification); ここでは、NSWorkspaceというクラスを使っている。注目してほしいのは、最後の行にある、addObserver_selector_name_objectというメソッドだ。このメソッドは通知受け取りの登録をするもので、第1引数にオブジェクトを、第2引数に呼び出されるメソッドの名前を文字列で指定する。PyObjCでは、ここにObjective-Cスタイルのメソッド名を渡す。実際に通知が発生したときは、Objective-Cのオブジェクトが受け取り、メソッド名をPython空間に変換して、呼び出すことになる。 図 つまり、文字列を指定したメソッド名呼び出し機構を利用して、実現している訳だ。 ----------------------------- C++ブリッジは可能か? ----------------------------- では、C++はどうだろう?C++で、このようなObjective-Cブリッジを作ることはできるだろうか。結論から言ってしまえば、非常に難しい。いろいろな問題があるが、このターゲット/アクションの実装に限っても、任意のメソッドを変数として与えて実行するという機能がないため、代替物がないからだ。 C++で、この種の機能に一番近いものは、メンバ関数ポインタとなるだろう。だがメンバ関数ポインタは、実装そのものを指すもので、そのクラスやメソッドに関する情報は含まれない。これでは、実装の有無をチェックしたり、セレクタのように異なるクラスに対して適用するといったことは、無理である。 どうしてもC++で実装するならば、メンバ関数ポインタとメンバ関数名のテーブルを作り、実行時に探索して呼び出すことになるだろう。これは、動的な言語のランタイムが行っていることを、もう一度作り直すことと同じになる。 ----------------------------- メソッドの実体と、メッセージ ----------------------------- ターゲット/アクションパライダイムを切り口として、様々な言語とObjective-Cとのブリッジを紹介してみた。 これで明らかになったのは、Cocoa + Objective-Cで求められていることは、メソッドを、メソッドの実体と切り離した状態で記述し、それを任意のオブジェクトに対して適用することだ。Objective-Cではこれを、メッセージ送信と呼ぶ。メッセージの実体となるのはセレクタだ。 言語によっては、セレタクに相当するものがなくとも、メソッド名の文字列を使うことで代用できる。では、Objective-Cであえてセレクタを使う理由は何か?これは後日、メッセージング機構の大解剖を行うときに、詳しく解説することになるだろう。 PyObjcC - Home http://pyobjc.sourceforge.net/