ライブラリとは、
汎用性の高い複数のプログラムを、再利用可能な形でひとまとまりにしたもの。後述。
筐体内に多数のドライブを収め、数百GBからTB、PBにおよぶ記憶容量を実現した補助記憶装置。
図書館のこと。また、本以外にレコードライブラリーやビデオライブラリーなどがある。
生物学において、ある属性を持った一群のDNA断片がベクターにクローン化されたもの。ゲノムライブラリ、cDNAライブラリなど。→遺伝子ライブラリ
ソフトウェアなどを分類ごとにまとめたメディアのこと。主にウェブサイトか光ディスクとして提供される。ベクター、窓の杜、MSDNライブラリなど。
ライブラリは、汎用性の高い複数のプログラムを、再利用可能な形でひとまとまりにしたものである。一般にライブラリは、それ単体ではプログラムとして動作させることはできないので実行ファイルではない。ライブラリは他のプログラムに何らかの機能を提供するコードの集まりと言うことができる。ソースコードの場合と、オブジェクトコード、あるいは専用の形式を用いる場合とがある。たとえば、UNIXのライブラリはオブジェクトコードをarと呼ばれるアーカイバでひとまとめにして利用する。
また、ソフトウェア以外の再利用可能なものの集合について使われることもある。
目次
1 動的リンク
2 動的読み込み
3 リモート・ライブラリ
4 共有ライブラリ
5 オブジェクト・ライブラリ
6 ネーミング
7 関連項目
8 数値計算ライブラリ
//
動的リンク(dynamic linking)は、あるライブラリ内のデータ(コードを含む)を新たな実行ファイルのコンパイル時にコピーすることはなく、ディスク上に別のファイルとして存在している。コンパイル時にリンカが行うのは、その実行ファイルが必要とするのがどのライブラリのどの部分であるか(関数名やインデックス)を記録するだけである。リンク作業の大部分はそのアプリケーションがメモリ上にロードされたときか、実行時である。リンクを行うコードはローダ(loader)と呼ばれ、実際にはオペレーティングシステムの一部と見なされる。適当な時点でローダは必要なライブラリをディスク上で見つけてプロセスのメモリ空間に(追加のデータ空間と共に)マッピングする。OSによってはプロセスが実行開始する前でないとライブラリをリンクできないものもあるが、多くのOSではプロセス実行時に実際にライブラリを参照したときにリンクすることができる。後者は「遅延読み込み」などと呼ばれる。どちらの場合もライブラリはダイナミックリンクライブラリと呼ばれる。DLL という呼び方は Microsoft Windows 環境で一般的であり、動的ライブラリのファイル拡張子は .dll である。
ローダの処理は、メモリ上の各ライブラリの位置が実際にロードされるまで確定しないため、ちょっとしたトリックを必要とする。ディスク上のファイル内に絶対アドレスを書きこんでおくことはDLL内であっても不可能である。理論的にはメモリにロードされたときにライブラリを参照している部分を全て書き換えて正しいメモリ上の位置を参照するようにすることはできるが、それによって消費される時間とメモリは無視できない。その代わりに多くの動的リンクシステムではアドレス欄が空欄となったシンボルテーブルをコンパイル時に用意する。ライブラリへの参照は全てこのシンボルテーブルを経由して行われる(コンパイラはシンボルテーブルからアドレスを取り出して使うコードを生成する)。メモリにロードされたとき、ローダがこのテーブルを書き換える。
ライブラリも全メソッド(関数、サブルーチン)のテーブルを持っている。ライブラリに入ってくるときは、このテーブルを経由して各ルーチンにジャンプする。これによってライブラリのルーチンコールにオーバヘッドが発生するが、それは無視できるほど小さい。
動的リンカ/ローダは機能面で様々なものがある。いくつかの場合、実行ファイルに格納された明示的なライブラリパスに依存し、ライブラリ名やディスク上の配置を変更するとシステムが動作できなくなる。より一般的な手法としてはライブラリ名だけを実行ファイルに格納し、オペレーティングシステムが何らかのアルゴリズムでディスク上のライブラリを検索する。UNIX系システムでは、ライブラリを探す場所(ディレクトリ)を構成ファイルにリストアップしておく。ライブラリ開発者はそこに書かれたディレクトリにライブラリを配置することを推奨される。しかし、この方法では新しいライブラリをインストールする際に問題が発生しやすく、共通のディレクトリにあまりにも多くのライブラリが置かれることとなって管理を難しくする。Microsoft Windows ではレジストリを使ってActiveX DLL の場所を決めているが、標準DLLでは、(1)現在のワーキングディレクトリ (2)SetDllDirectory()で示されるディレクトリ (3)System32 ディレクトリ (4)Systemディレクトリ (5)Windowsディレクトリ (6)PATH環境変数で示されるディレクトリ を探す。OPENSTEPはもっと柔軟なシステムを使用していて、ライブラリの探索リストを保持している。しかし不正なDLLが探索の上位に置かれていると実行ファイルは不正動作する可能性がある。Windowsでは、これが「DLL地獄」(DLL hell)と呼ばれ、よく知られている問題である。
Windows XPからは、マニフェスト(DLL署名, WinSxS)というメカニズムが追加された。これは動的リンク時にライブラリのファイル名ではなく、ライブラリにつけられた署名によってリンクすべきライブラリを決定するものである。これにより、同じファイル名を持つが異なる実装を持つライブラリを同時に使い分ける事ができる。よくあるパターンとして、ソースコードから改変・ビルドされたランタイムライブラリをシステムにインストールする場合にこのメカニズムが有効に働く。システムにインストールされたライブラリはライブラリ探索リスト上比較的上位に存在するが、署名が一致するプログラムにのみロードされるのでDLL地獄は今後解消されるであろうと考えられる。しかし、この機構には一つの弱点がある。