
コンピュータ分野において、ライブラリとは、ソフトウェア開発中にコンピュータプログラムを実装するために使用できるリソースの集合体です。一般的に、ライブラリはコンパイル済みの関数やクラスなどの実行可能コードで構成されますが、ソースコードの集合体である場合もあります。リソースライブラリには、画像やテキストなどのデータが含まれることもあります。
ライブラリは、複数の独立した利用者(プログラムや他のライブラリ)が利用できます。これは、通常そのプログラムのみが利用できるプログラム内で定義されたリソースとは異なります。利用者がライブラリのリソースを使用すると、それを自身で実装することなく、ライブラリの価値を得ることができます。ライブラリは、モジュール方式によるソフトウェアの再利用を促進します。ライブラリは他のライブラリを利用できるため、プログラム内にライブラリの階層構造が構築されます。
ライブラリを使用するコードを書く場合、プログラマーはライブラリの内部構造を理解する必要はなく、そのライブラリのアプリケーションプログラミングインターフェース(API)の使い方だけを知っていればよい。例えば、複雑なシステムコールを抽象化したライブラリを使用すれば、プログラマーはシステム機能の詳細な仕組みを学ぶことなく、そのシステム機能を利用できる。
コンピュータライブラリの概念は、チャールズ・バベッジが最初に作ったコンピュータにまで遡ります。1888年に彼の解析機関に関する論文で、コンピュータの操作を数値入力とは別のカードにパンチできると提案されました。これらの操作パンチカードを再利用のために保存すれば、「徐々にエンジンは独自のライブラリを持つようになる」とされました。[ 1 ]

1947年、ゴールドスタインとフォン・ノイマンは、当時まだ稼働していなかった初期のコンピュータであるIASマシンでの作業のために、サブルーチンの「ライブラリ」を作成することが有用であると推測した。 [ 2 ]彼らは、各ワイヤに再利用可能なコンピュータコードを格納する磁気ワイヤ記録の物理的なライブラリを構想した。[ 3 ]
フォン・ノイマンに触発されたウィルクスとそのチームはEDSACを構築した。パンチテープのファイルキャビネットには、このコンピュータのサブルーチンライブラリが格納されていた。[ 4 ] EDSACのプログラムは、メインプログラムと、サブルーチンライブラリからコピーされた一連のサブルーチンで構成されていた。[ 5 ] 1951年、チームはプログラミングに関する最初の教科書『電子デジタルコンピュータ用プログラムの準備』を出版し、ライブラリの作成と目的を詳細に説明した。[ 6 ]
COBOLは1959年に「図書館システムのための基本的な機能」を備えていたが[ 7 ] 、ジャン・サメットは後になってそれらを「不十分な図書館設備」と評した[ 8 ] 。
JOVIALには通信プール(COMPOOL)があり、これはおおよそヘッダーファイルのライブラリと言えるでしょう。
現代のライブラリ概念に大きく貢献したもう 1 つの要素は、 FORTRANのサブルーチンの革新でした。FORTRAN のサブルーチンは互いに独立してコンパイルできますが、コンパイラにはリンカがありませんでした。そのため、Fortran-90 でモジュールが導入される前は、FORTRAN [ NB 1 ]のサブルーチン間の型チェックは不可能でした。[ 9 ]
1960年代半ばまでに、アセンブラ用のコピーライブラリとマクロライブラリは一般的になった。IBM System/360の普及を皮切りに、システムパラメータなど、他の種類のテキスト要素を含むライブラリも普及した。
IBMのOS/360とその後継システムでは、これはパーティション化されたデータセットと呼ばれます。
1965年に開発された最初のオブジェクト指向プログラミング言語であるSimulaは、コンパイラを介してライブラリにクラスを追加することをサポートしていました。 [ 10 ] [ 11 ]
リンク(またはバインディング)処理は、構成済みライブラリを含む様々な場所でシンボル(またはリンク)と呼ばれる参照を検索することで、それらを解決します。リンカー(またはバインダー)がシンボルを見つけられない場合、処理は失敗しますが、複数のシンボルが一致しても失敗するとは限りません。
静的リンクとは、ビルド時にライブラリの実行可能コードをプログラムに含めるリンクのことです。動的リンクとは、実行時にリンクするリンクのことです。これは、動的リンクライブラリ(DLL)への実行時リンクをサポートする情報を含めてプログラムをビルドすることを意味します。動的リンクの場合、実行時に互換性のあるDLLファイルがプログラムから利用可能である必要がありますが、静的リンクの場合は、プログラムはスタンドアロンです。
スマートリンクとは、ビルドツールがリンク処理において未使用のコードを除外する処理のことです。例えば、整数のみを用いて演算を行うプログラム、あるいは演算を一切行わないプログラムでは、浮動小数点ライブラリのルーチンを除外することができます。これにより、プログラムファイルのサイズを小さくし、メモリ使用量を削減することが可能になります。
プログラムやライブラリモジュール内の一部の参照は、相対参照またはシンボル参照の形式で格納されており、すべてのコードとライブラリに最終的な静的アドレスが割り当てられるまで解決できません。再配置とは、これらの参照を調整するプロセスであり、リンカまたはローダによって実行されます。一般に、個々のライブラリ自体に対して再配置を行うことはできません。なぜなら、メモリ内のアドレスは、それらを使用するプログラムや、それらと組み合わされる他のライブラリによって異なる可能性があるからです。位置独立コードは絶対アドレスへの参照を避けるため、再配置は不要です。
実行可能ライブラリは、ソースコードからマシンコードまたはバイトコードなどの中間形式に変換されたコードで構成されます。リンカは、各参照をオブジェクトのアドレスに関連付けることで、ライブラリオブジェクトを使用できるようにします。たとえば、C 言語では、ライブラリ関数は C 言語の通常の関数呼び出し構文と意味論を介して呼び出されます。[ 12 ]
バリアントとは、コンパイル済みコード(IBMの用語ではオブジェクトコード)を、OSではロードできないがリンカでは読み取れる形式で格納したライブラリのことである。
静的ライブラリは、ビルド時にリンカ(またはリンクを行うビルドツール)によってプログラムにリンクされる実行可能ライブラリです。[ 13 ] [ 14 ]このプロセスと、結果として得られるスタンドアロンファイルは、プログラムの静的ビルドとして知られています。仮想メモリが使用され、アドレス空間レイアウトのランダム化が不要な場合、静的ビルドではそれ以上の再配置は必要ない場合があります。[ 15 ]
静的ライブラリは、Unix系システムではアーカイブと呼ばれることもある。
動的ライブラリは、プログラムの実行時(ロード時または実行時)にリンクされます。動的ライブラリは、静的ライブラリに続いて、ソフトウェアの展開における柔軟性をさらに高めることを目的として開発されました。
ソースライブラリは、コンパイル済みのコードではなく、ソースコードで構成されています。
共有ライブラリとは、実行時に複数のコンピュータプログラムや他のライブラリによって使用されるように設計された実行可能コードを含むライブラリであり、そのコードのコピーはメモリ上に1つだけ存在し、そのコードを使用するすべてのプログラムによって共有されます。[ 16 ] [ 17 ] [ 18 ]
オブジェクトライブラリは、今日では一般的に廃れた技術ではあるものの、オブジェクト指向プログラミング(OOP)のためのリソースを公開するものであり、分散オブジェクトはリモートオブジェクトライブラリの一種です。例としては、 COM /DCOM、SOM /DSOM、DOE、PDO、および様々なCORBAベースのシステムなどが挙げられます。
オブジェクトライブラリ技術は、OOPが普及するにつれて、OOPランタイムバインディングには、従来のライブラリでは提供されていない情報が必要であることが明らかになったため開発されました。継承により、OOPバインディングでは、内部にあるコードの名前とエントリポイントに加えて、依存関係のリストも必要になります。これは、メソッドの完全な定義が異なる場所に存在する可能性があるためです。さらに、これは、あるライブラリが別のライブラリのサービスを必要とするというリスト以上のものを必要とします。OOPでは、ライブラリ自体がコンパイル時に不明な場合があり、システムごとに異なる可能性があります。
リモートオブジェクト技術は、パーソナルコンピュータ(PC)上で動作するユーザーインターフェースアプリケーションと、メインフレームやミニコンピュータのデータストレージおよび処理サービスを組み合わせた多層プログラムをサポートするために並行して開発されました。例えば、PC上のプログラムは、リモートプロシージャコール(RPC)を介してミニコンピュータにメッセージを送信し、比較的大きなデータセットから比較的小さなサンプルを取得します。これに対応して、分散オブジェクト技術が開発されました。
クラスライブラリには、オブジェクトを作成するために使用できるクラスが含まれています。たとえば、Javaでは、クラスはJAR ファイルに含まれており、実行時にクラスからオブジェクトが作成されます。しかし、Smalltalkでは、クラスライブラリは、環境、クラス、およびすべてのインスタンス化されたオブジェクトの完全な状態を含むシステムイメージの開始点です。ほとんどのクラスライブラリは、パッケージリポジトリ(Java の場合は Maven Central など) に格納されています。クライアントコードは、ビルド構成ファイル (Java の場合は Maven Pom など) で外部ライブラリへの依存関係を明示的に指定します。[ 19 ]
リモートライブラリは別のコンピュータ上で動作し、そのアセットはネットワーク経由のリモートプロシージャコール(RPC)によってアクセスされます。この分散アーキテクチャにより、各利用システムにおけるライブラリのインストールとサポートを最小限に抑え、一貫したバージョン管理を実現できます。ただし、大きな欠点として、ライブラリ呼び出しごとにローカルライブラリよりも大幅にオーバーヘッドが発生します。
ランタイムライブラリは、ホストプラットフォームに合わせて調整された、プログラムが利用できるランタイム環境へのアクセスを提供する。
多くの現代的なプログラミング言語は、言語環境の基本機能を提供する標準ライブラリを規定している。
コード生成ライブラリは、 Java用のバイトコードを生成または変換する高レベルAPIを備えています。これらは、アスペクト指向プログラミング、一部のデータアクセスフレームワーク、およびテストで動的なプロキシオブジェクトを生成するために使用されます。また、フィールドアクセスを傍受するためにも使用されます。[ 20 ]
ほとんどの最新のUnix 系/libシステムでは、ライブラリ ファイルは、/usr/libやなどのディレクトリに格納されます/usr/local/lib。ファイル名は通常、静的ライブラリ (アーカイブ)の場合はlib、で始まり、で終わります。共有オブジェクト (動的リンク ライブラリ) の場合は、で終わります。たとえば、やです。.a.solibfoo.alibfoo.so
ライブラリのバージョン管理には、バージョン指定のないリンクファイルを作成し、バージョン指定のあるファイルにリンクさせるシンボリックリンクファイルがよく使用されます。たとえば、ライブラリfoolibfoo.so.2のバージョン 2 の場合、リンクファイルによって、プログラムがリンクするファイルへのバージョンに依存しない名前が提供されます。リンクファイルをバージョン 3 ( ) を参照するように変更すると、利用するプログラムはプログラムを変更することなくバージョン 3 を使用できるようになります。libfoo.solibfoo.so.3
この拡張子を持つファイルはlibtool.laアーカイブであり、システムでは使用できません。
macOSシステムは、BSDから静的ライブラリの慣習を継承しており、ライブラリは.aファイルに格納されます。動的ライブラリには、またはのいずれ.soかを使用します.dylib。ただし、macOS のほとんどのライブラリは、「バンドル」と呼ばれる特別なディレクトリ内に配置された「フレームワーク」で構成されており、ライブラリに必要なファイルとメタデータをラップしています。たとえば、というフレームワークは、Abcというバンドルに実装されAbc.framework、はAbc.framework/Abc動的にリンクされたライブラリ ファイル、またはにある動的にリンクされたライブラリ ファイルへのシンボリック リンクのいずれかになりますAbc.framework/Versions/Current/Abc。
Windowsのダイナミックリンクライブラリ(DLL)は、多くの場合、ファイル拡張子を持ちますが.dll、[ 21 ] OLE.ocxライブラリなど、一般的な内容を示すために異なる拡張子が使用されることもあります。
ファイル.libは、静的ライブラリである場合もあれば、関連するDLLを使用するアプリケーションを構築するために必要な情報を含む場合もあります。後者の場合、関連するDLLファイルは実行時に存在している必要があります。
開発することが非常に重要になるでしょう。
バイトコード生成ライブラリは、Javaバイトコードを生成および変換するための高レベルAPIです。AOP、テスト、データアクセスフレームワークで、動的プロキシオブジェクトを生成し、フィールドアクセスを傍受するために使用されます。
の共有ライブラリは、Windowsのダイナミックリンクライブラリ(DLL)に似ています。WindowsのDLLは通常、.dllファイル名の拡張子で識別されます。{{cite book}}: CS1 maint: 非推奨のアーカイブサービス (リンク)コード: [リンク削除済み]訂正: