プラグイン・プログラミング(1)

 

2006年9月15日………前回の講座より、約二年が経過している。
出来る人ならば既に俺を追い越しているだろうし、何よりこんなところ誰も見な(略
さて、今回は前回の続きではない。飛躍して、プラグイン・プログラミングに関する事を徒然なる侭に書いてみようと思う。

★プラグインとは

プラグインとは、ソフトウェアに追加機能を与えるソフトウェアの事である。
………これだけでは流石に不親切すぎるので、一応は図解で説明しておく。

プラグインがある時(・∀・)

ソフトウェア側

・機能A
・機能B
・機能C


以上、全てプログラマが作った機能

ユーザー
「新しい機能が欲しいなぁ(´Д`)」

←←←←←←←←←←←←←←←←←←

プログラミングに嗜みのあるユーザー
「プラグイン作れるんかいな、なら作っとこ」

プラグイン側

・機能D
・機能E
・機能F


以上、全てプログラミングに嗜みのあるユーザーが作った機能





   
ソフトウェア側

・機能A
・機能B
・機能C
・機能D
・機能E
・機能F


機能が追加されている、しかもプログラミングに嗜みのないユーザーも簡単に機能が追加できる!(指定の位置にプラグインのファイルを放り込むだけでおk)

プラグインがない時(;´Д`)

ソフトウェア側

・機能A
・機能B
・機能C


以上、全てプログラマが作った機能

ユーザー
「新しい機能が欲しいなぁ(´Д`)」

プログラミングに嗜みのあるユーザー
「んなこと言われても、追加できね〜よ(´Д`)」

つまりプラグインが存在する場合、プログラミングに嗜みのあるユーザーならば容易に追加機能をソフトウェアに持たせる事が可能となる。
また、追加機能を加えた場合もソフトウェア側に変更を加える必要はない。その簡便さより、嗜みのないユーザーも手軽に追加機能を取得する事が可能となる。
この機構を実現する為には、ソフトウェア側のプログラマにDLLに対する理解が必要となる。

★DLLとは

DLLとはDynamic Link Library(ダイナミック・リンク・ライブラリ)、即ち動的結合ライブラリである。
…と言って理解出来るヤツなら、そもそもここは見ないよな(´Д`) よろしい、以下で説明を始めよう。

プログラムとは本来、それ自身(実行ファイル、.exeってファイルね)で完結している。何故ならば、コンパイル・リンクを通して全てひとつのファイルに纏められてしまうからだ。
これをStatic Link(スタティック・リンク)、即ち静的結合という。

ソフトウェア(作成段階)

・AAA.h
・AAA.cpp
・BBB.h
・BBB.cpp
・CCC.h
・CCC.cpp


通常、プログラマは複数のファイルにソースコードを分割して記述する。
(理由:機能別にソースコードを分割した方が、見直しを行い易い)





ソフトウェア(コンパイル・リンク段階)

・AAA.hをコンパイル、AAA.cppをコンパイル、BBB.hをコンパイル……
・そして、全てのコンパイル済みファイルをリンク(静的結合)





ソフトウェア(完成段階)

・Hoge.exe

実行すれば即座に動く、そこに痺れるぅ憧れるぅ!(・∀・)

それに対し、コンパイル・リンク時にではなく実行時にリンクを行う方法が存在する。それがDynamic Link(ダイナミック・リンク)、即ち動的結合である。
この方法では静的結合に対し、柔軟性においては優れている(要するに後出しで簡単に機能が追加可能) しかし、安全性においては劣っている(コンパイラ・リンカがチェック不能)

ソフトウェア(作成段階)

・AAA.h
・AAA.cpp
・BBB.h
・BBB.cpp
・CCC.h
・CCC.cpp


通常、プログラマは複数のファイルにソースコードを分割して記述する。
(理由:機能別にソースコードを分割した方が、見直しを行い易い)

  プラグイン(作成段階)

・DDD.h
・DDD.cpp
・EEE.h
・EEE.cpp
・FFF.h
・FFF.cpp


プログラミングに嗜みのあるユーザーが作成中(´Д`)





 



ソフトウェア(コンパイル・リンク段階)

・AAA.hをコンパイル、AAA.cppをコンパイル、BBB.hをコンパイル……
・そして、全てのコンパイル済みファイルをリンク(静的結合)

  プラグイン(コンパイル・リンク段階)

・DDD.hをコンパイル、DDD.cppをコンパイル、EEE.hをコンパイル……
・そして、全てのコンパイル済みファイルをリンク(静的結合)





 



ソフトウェア(完成段階)

・Hoge.exe

実行すれば即座に動く、そこに痺れるぅ憧れるぅ!(・∀・)

  プラグイン(完成段階)

・Hoge.dll

単体では実行不能、ソフトウェアとリンクせにゃなりません(´Д`)





 



ソフトウェア(実行段階)

・Hoge.dllを呼び出してリンク(動的結合)
・Hoge.dllのソースコードを取り込んで、機能追加!
・Hoge.dllを別に取り込まなくても、基本機能は使用可能な状態で動作

←←←←← プラグイン(実行段階)

・Hoge.exeに呼び出されてリンク(動的結合)

DLLとプラグインの関係について、分かってもらえただろうか? 本来、DLLにはもうひとつの使途があるのだが………そっちはプラグインとは無関係なので、割愛する。

といいつつも、一応は補足

もうひとつの使途とは、共通部分のDLL化である。
たとえば、A.exeとB.exeとC.exeがあったとする。で、全ての実行ファイルに共通のソースコードが100KB存在したとしよう。
その場合、共通のソースコードをDLL化する事で全ての実行ファイルのファイルサイズを100KBずつ小さくする事ができる。
単純計算では、200KBのディスク容量を節約する事ができる。また、共通部分にバグが見つかった場合はDLLを修正するだけで全ての実行ファイルが正常に動く。
つまり、共通部分のDLL化はディスク容量節約とデバッグの面においてメリットが存在するワケだ。

★暗黙的リンクと明示的リンク

Dynamic Linkには二種類の方法が存在する。暗黙的リンクと、明示的リンクだ。
両者の差異を、以下で図解にて説明する↓

暗黙的リンク

・ソフトウェア側のソースコードに、「こういう名前のDLLのこういう名前の機能を取り込みますよ」と書いておく。
・メリット:しっかりとコンパイラやリンカが正当性をチェックしてくれる、DLLとの結合・解除をプログラマが管理する必要がない。
・デメリット:あらかじめ、どんな名前のDLLのどんな名前の機能が取り込まれるか知ってなければならない。よって、プラグインには使えない。

明示的リンク

・ソフトウェア側のソースコードに、「こういう名前のDLLを取り込みますよ」と書いておく
・メリット:どんな名前のDLLのどんな名前の機能が取り込まれるか知っている必要はない。呼び出し、存在すればリンクするだけのことである。
・デメリット:コンパイラやリンカが正当性をチェックしてくれない、DLLとの結合・解除をプログラマが管理する必要がある(解除しないとDLLがメモリから解放されない!)

つまり、共通部分のDLL化には暗黙的リンクが、プラグインには明示的リンクが最適という事である(何がリンクされるか分かっていたらプラグインではない)

 

 

 

………以上、これで(1)は終了である。今回はソースコード無しの抽象論に終わってしまった、次回は具体的なソースコードを出す心算なので期待していて欲しい('='

 

前へ                                        戻る                                        次へ