コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

動的リンク

出典: フリー百科事典『ウィキペディア(Wikipedia)』

動的リンクどうてきりんく英語: dynamic link)とは二つの意味がある。

  1. コンピュータプログラムにおいて、実行時にプログラムの結合を行う方式。
  2. ハイパーテキストにおいて、ノード間のリンクを参照時に決定する方式。

プログラムにおける動的リンク

[編集]

動的リンキングダイナミックリンキングとも言う。

コンピュータプログラム作成時において、大規模なプログラムは一般的に複数のモジュールに分割される。ライブラリあるいはアプリケーションプログラムモジュールビルドする際に、まずコンパイラによってソースコードからオブジェクトファイルが生成されるが、各モジュールに必要なプログラムコードの実体すべてをリンケージエディタによってリンクしてモジュールに含め、実行可能形式のバイナリ(実行ファイル)を得る方式を静的リンクと呼ぶ。

これに対し、各モジュールに必要なプログラムコードの実体すべてを含めず、プログラムの実行開始時にローダによって初めて他のモジュールと結合する方式を動的リンクと呼ぶ。この動的リンク機構を使ったライブラリを、動的リンクライブラリ(ダイナミックリンクライブラリ)と呼ぶ。Microsoft Windows環境ではDLLと略されることが多い。よく使われる処理(アルゴリズム)を記述したサブルーチンを再利用するケースなど、動的リンクライブラリを複数のプログラムから共有することには利点があるので、しばしば「共有ライブラリ」として運用される。

動的リンクの利点としては、重複するコードやデータが減ることでモジュールのサイズを小さくできることや、ライブラリの実装を変更したときに、ライブラリのインターフェイスに変更がなければプログラムを再リンクする必要がないことが挙げられる[1]。動的リンクであっても一般的にはアプリケーション起動時にローダによって自動的にシンボルの解決を実行する早期束縛(アーリーバインディング)となり、必要なモジュールがシステム上に存在しなかったり、モジュール内にシンボルが見つからなかったりした場合はプロセスの起動に失敗する。しかし、最低限必要なコードのみを本体に含め、それ以外のコードは別のモジュールに分離し、ユーザーが特定の機能を使おうとしたタイミングで必要に応じてモジュールを動的ロードし、シンボルの解決を実行するといった遅延束縛(レイトバインディング)をサポートする環境もある。

動的リンクの欠点としては、モジュール自身に必要なコードが含まれていないため自己完結できないことや、シンボルの解決が実行時に(動的に)実施されるためプログラム実行時のオーバーヘッドがあることなどが挙げられる。

共有ライブラリ

[編集]

動的リンクされるライブラリは、単独のアプリケーションから利用される「プライベートライブラリ」だけでなく、複数のアプリケーションから利用される「共有ライブラリ」にすることもできる。ただし共有ライブラリの場合、暗黙的に特定のバージョンの共有ライブラリの内部処理や仕様に依存していたプログラムがライブラリのバージョンアップによって動作しなくなること、バージョンアップした共有ライブラリにバグが存在するとそのライブラリを利用するソフトウェアすべてに影響が及ぶこと(特にライブラリがシステム全体で共有される場合に深刻となる)、バージョンアップによる影響範囲を事前に特定できないこと[要説明]、同じ共有ライブラリの複数のバージョンがシステム内に存在するときに探索優先度の違いで動作が変わってしまうこと、などがある。これらの欠点は俗にコンピュータ業界で「DLL地獄(DLL Hell)」の名称で呼ばれることがある。

プラグイン

[編集]

動的ロード・動的リンクと動的束縛(ダイナミックバインディング)の仕組みを応用し、サードパーティの開発者あるいはエンドユーザーによるアプリケーションの機能拡張を可能とするのがプラグイン機構である。名前、戻り値や引数、呼び出し規約など、プラグインのインターフェイス仕様に従って実装され、モジュール外部に公開(エクスポート)されたサブルーチンでありさえすれば何でもアプリケーションから探索してコールバック関数として呼び出すことができるというダックタイピングによるポリモーフィズムを実現する。動的ロードをサポートするための下位レベルのAPIとして、Windowsでは主にLoadLibrary()GetProcAddress()[2]が、POSIX環境ではdlopen()dlsym()[3]が用意されている。

ハイパーテキストにおける動的リンク

[編集]

ハイパーテキストにおいて、ハイパーテキストを記述したときにノード間のリンクをあらかじめ定義する方式に対して、参照時に動的にリンクを決定する方式を言う。

脚注

[編集]

関連項目

[編集]