【コラム】
前回は、Objective-CとJavaの間でのブリッジを、Cocoaのターゲット/アクションパラダイムに着目して紹介したが、他の言語からもObjective-Cへのブリッジが存在する。特に、スクリプティング言語とのブリッジは、お互いに動的な特性が似ているので、実現しやすいようだ。今回は、それらを考察してみたい。
PyObjCはPythonと、RubyCocoaはRubyとの間で、Objective-Cへのブリッジを実現する。どちらのライブラリも、Cocoaを含むObjective-Cベースのフレームワークにアクセスすることができ、使い慣れた言語を使ってアプリケーションを作ることができる。また、XcodeやInterface Builderといった、Mac OS Xとの開発環境とも統合されており、完成度は高い。
では前回に引き続き、これらのライブラリでのセレクタの扱いを見てみよう。Python、Rubyともに、メソッドをオブジェクトとして扱う機構は持っているが、これらはObjective-Cのセレクタと直接交換はできない。そこで、文字列を使ってセレクタの代用をしている。
たとえば、PyObjCでは、次のようなソースコードで、他のアプリケーション起動の通知を受け取ることができる。
NSWorkspaceというクラスを使い起動通知の受け取り処理を行っている。注目してほしいのは最後の処理である、addObserver_selector_name_objectというメソッドだ。このメソッドは通知受け取りの登録をするもので、第1引数にオブジェクトを、第2引数では呼び出されるメソッドの名前を文字列で指定している。
上のソースコードにあるように、PyObjCでは、指定するメソッド名はObjective-Cスタイルになっている。つまり、実際のCocoaへの登録、および通知の受け取りは、Objective-C空間で行われることになる。通知を受け取った後は、Objective-Cメソッド名をPythonスタイルに変換し、そのPython空間のメソッドを呼び出すことになる。
つまりここでも、文字列からのメソッド呼び出し機構が重要な役割を果たしている訳だ。
では、C++ではどうだろう?C++で、このようなObjective-Cブリッジを作ることはできるだろうか。結論から言ってしまえば、非常に難しい。いろいろな問題があるが、このターゲット/アクションの実装に限っても、任意のメソッドを変数として与えて実行するという機能がないため、代替物がないからだ。
C++でこの種の機能に一番近いものは、メンバ関数ポインタとなるだろうか。だがメンバ関数ポインタは、実装そのものを指すもので、そのクラスやメソッドに関する情報は含まれない。これでは、実装の有無をチェックしたり、セレクタのように異なるクラスに対して適用するといったことは、無理である。
どうしてもC++で実装するならば、メンバ関数ポインタとメンバ関数名のテーブルを作り、実行時に探索して呼び出すことになる。これは、動的な言語のランタイムが行っていることを、もう一度作り直すことと同じになるだろう。
ターゲット/アクションパライダイムを切り口として、様々な言語とObjective-Cとのブリッジを紹介してみたが、これで明らかになったのは、Cocoa + Objective-Cで求められていることは、メソッドを、メソッドの実体と切り離した状態で記述し、それを任意のオブジェクトに対して適用することだ。
Objective-Cではこのことを、メッセージ送信と呼ぶ。「メッセージ送信」という言葉は様々な文脈で使われるが、Objective-Cではこのような意味で使われる。メッセージの実体となるのはセレクタだ。このメッセージ送信の中に、Objective-Cの動的特性の醍醐味がある。後日稿を改めてメッセージング機構の大解剖を行い詳しく解説することになるだろう。
【コラム】ライトニングJava 第20回 Generic Java(1) - 賛否両論? ジェネリックプログラミングとは
【コラム】ダイナミックObjective-C 第6回 Cocoa-Javaの挑戦とは? - 似て非なるセレクタとリフレクション
| トマトを食べれば痩せられる!? -京大ら、新発見の成分で肥満改善効果を実証 [21:00 2/10] |
| JAXA、液体シリコン中に残存する共有結合を観察 -大口径ウェハの実現に期待 [20:11 2/10] |
| NEDOなど、熱膨張が小さな樹脂複合材料ペレットの量産化に成功 [19:22 2/10] |
| 理研、一般顕微鏡を蛍光顕微鏡に強化できるアダプタを試作して性能を実証 [19:15 2/10] |
| 天の川のブラックホールが小惑星を飲み込んでいる - NASAが発表 [18:08 2/10] |
|
【連載】鉄道トリビア 第137回 山手線と京浜東北線から●●●が消えた!? [08:00 2/11] ライフ |
|
JRグループ、「周遊きっぷ」を見直し - 19の周遊ゾーンが3/31で販売終了に [07:30 2/11] ライフ |
|
「青春18きっぷ」春季用は2/20発売 - 夏季用・冬季用の発売は現時点で未定 [07:30 2/11] ライフ |
|
【ハウツー】炊飯器でつくるチャーシューが簡単すぎ、しかもおいしい! [07:00 2/11] ライフ |
|
【連載】出社前に。日常生活ですぐに使える! 英語クイズ 第118回 「どうぞお話しください、あなたが話す番です」ってなんて言う? [07:00 2/11] ライフ |