プラグイン・プログラミング(1)
2006年9月15日………前回の講座より、約二年が経過している。
出来る人ならば既に俺を追い越しているだろうし、何よりこんなところ誰も見な(略
さて、今回は前回の続きではない。飛躍して、プラグイン・プログラミングに関する事を徒然なる侭に書いてみようと思う。
★プラグインとは
プラグインとは、ソフトウェアに追加機能を与えるソフトウェアの事である。
………これだけでは流石に不親切すぎるので、一応は図解で説明しておく。
プラグインがある時(・∀・)
ソフトウェア側 ・機能A ↑ |
ユーザー 「新しい機能が欲しいなぁ(´Д`)」 ←←←←←←←←←←←←←←←←←← プログラミングに嗜みのあるユーザー |
プラグイン側 ・機能D ↑ |
↓ ↓ ↓ ↓ ↓ |
||
ソフトウェア側 ・機能A ↑ |
プラグインがない時(;´Д`)
ソフトウェア側 ・機能A ↑ |
ユーザー 「新しい機能が欲しいなぁ(´Д`)」 プログラミングに嗜みのあるユーザー |
つまりプラグインが存在する場合、プログラミングに嗜みのあるユーザーならば容易に追加機能をソフトウェアに持たせる事が可能となる。
また、追加機能を加えた場合もソフトウェア側に変更を加える必要はない。その簡便さより、嗜みのないユーザーも手軽に追加機能を取得する事が可能となる。
この機構を実現する為には、ソフトウェア側のプログラマにDLLに対する理解が必要となる。
★DLLとは
DLLとはDynamic Link Library(ダイナミック・リンク・ライブラリ)、即ち動的結合ライブラリである。
…と言って理解出来るヤツなら、そもそもここは見ないよな(´Д`) よろしい、以下で説明を始めよう。
プログラムとは本来、それ自身(実行ファイル、.exeってファイルね)で完結している。何故ならば、コンパイル・リンクを通して全てひとつのファイルに纏められてしまうからだ。
これをStatic Link(スタティック・リンク)、即ち静的結合という。
ソフトウェア(作成段階) ・AAA.h ↑ |
↓ ↓ ↓ ↓ ↓ |
ソフトウェア(コンパイル・リンク段階) ・AAA.hをコンパイル、AAA.cppをコンパイル、BBB.hをコンパイル…… |
↓ ↓ ↓ ↓ ↓ |
ソフトウェア(完成段階) ・Hoge.exe 実行すれば即座に動く、そこに痺れるぅ憧れるぅ!(・∀・) |
それに対し、コンパイル・リンク時にではなく実行時にリンクを行う方法が存在する。それがDynamic Link(ダイナミック・リンク)、即ち動的結合である。
この方法では静的結合に対し、柔軟性においては優れている(要するに後出しで簡単に機能が追加可能) しかし、安全性においては劣っている(コンパイラ・リンカがチェック不能)
ソフトウェア(作成段階) ・AAA.h ↑ |
プラグイン(作成段階) ・DDD.h ↑ |
|
↓ ↓ ↓ ↓ ↓ |
↓ ↓ ↓ ↓ ↓ |
|
ソフトウェア(コンパイル・リンク段階) ・AAA.hをコンパイル、AAA.cppをコンパイル、BBB.hをコンパイル…… |
プラグイン(コンパイル・リンク段階) ・DDD.hをコンパイル、DDD.cppをコンパイル、EEE.hをコンパイル…… |
|
↓ ↓ ↓ ↓ ↓ |
↓ ↓ ↓ ↓ ↓ |
|
ソフトウェア(完成段階) ・Hoge.exe 実行すれば即座に動く、そこに痺れるぅ憧れるぅ!(・∀・) |
プラグイン(完成段階) ・Hoge.dll 単体では実行不能、ソフトウェアとリンクせにゃなりません(´Д`) |
|
↓ ↓ ↓ ↓ ↓ |
↓ ↓ ↓ ↓ ↓ |
|
ソフトウェア(実行段階) ・Hoge.dllを呼び出してリンク(動的結合) |
←←←←← | プラグイン(実行段階) ・Hoge.exeに呼び出されてリンク(動的結合) |
DLLとプラグインの関係について、分かってもらえただろうか? 本来、DLLにはもうひとつの使途があるのだが………そっちはプラグインとは無関係なので、割愛する。
といいつつも、一応は補足 もうひとつの使途とは、共通部分のDLL化である。 |
★暗黙的リンクと明示的リンク
Dynamic Linkには二種類の方法が存在する。暗黙的リンクと、明示的リンクだ。
両者の差異を、以下で図解にて説明する↓
暗黙的リンク ・ソフトウェア側のソースコードに、「こういう名前のDLLのこういう名前の機能を取り込みますよ」と書いておく。 |
明示的リンク ・ソフトウェア側のソースコードに、「こういう名前のDLLを取り込みますよ」と書いておく |
つまり、共通部分のDLL化には暗黙的リンクが、プラグインには明示的リンクが最適という事である(何がリンクされるか分かっていたらプラグインではない)
………以上、これで(1)は終了である。今回はソースコード無しの抽象論に終わってしまった、次回は具体的なソースコードを出す心算なので期待していて欲しい('='