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

1947年、ゴールドスタインとフォン・ノイマンは、当時まだ稼働していなかった初期のコンピュータであるIASマシンでの作業にサブルーチンの「ライブラリ」を作成することが有用であると推測しました。 [ 2 ]彼らは、磁気ワイヤ記録の物理的なライブラリを構想し、各ワイヤに再利用可能なコンピュータコードを格納しました。[ 3 ]
フォン・ノイマンに触発され、ウィルクスと彼のチームはEDSACを構築した。パンチテープを収納したファイルキャビネットに、このコンピュータのサブルーチンライブラリが収められていた。[ 4 ] EDSACのプログラムは、メインプログラムと、サブルーチンライブラリからコピーされた一連のサブルーチンで構成されていた。[ 5 ] 1951年、チームはプログラミングに関する最初の教科書『The Preparation of Programs for an Electronic Digital Computer』を出版し、ライブラリの作成と目的を詳細に説明した。[ 6 ]
1959年のCOBOLには「ライブラリシステムのための基本的な機能」が含まれていましたが[ 7 ] 、 Jean Sammetは後から振り返ってそれを「不十分なライブラリ機能」と評しました[ 8 ] 。
JOVIAL には、通信プール (COMPOOL) があり、これはヘッダー ファイルのライブラリとほぼ言えます。
現代のライブラリ概念へのもう一つの大きな貢献は、 FORTRANにおけるサブプログラムの革新でした。FORTRANのサブプログラムは互いに独立してコンパイルできますが、コンパイラにはリンカーがありませんでした。そのため、Fortran-90でモジュールが導入される前は、FORTRAN [注1 ]サブプログラム間の型チェックは不可能でした。[ 9 ]
1960年代半ばまでに、アセンブラ用のコピーライブラリとマクロライブラリは一般的になりました。IBM System/360の普及に伴い、システムパラメータなど、他の種類のテキスト要素を含むライブラリも普及しました。
IBM の OS/360 およびその後継製品では、これをパーティション データ セットと呼びます。
1965年に開発された最初のオブジェクト指向プログラミング言語であるSimulaは、コンパイラを介してライブラリにクラスを追加することをサポートしていました。 [ 10 ] [ 11 ]
リンク
リンク(またはバインディング)プロセスは、設定されたライブラリを含むさまざまな場所でシンボル(またはリンク)と呼ばれる参照を検索することで解決します。リンカー(またはバインダー)がシンボルを見つけられない場合は失敗しますが、複数の一致があった場合は失敗する場合とそうでない場合があります
静的リンクはビルド時にリンクを行い、ライブラリの実行可能コードをプログラムに組み込みます。動的リンクは実行時にリンクを行い、ダイナミックリンクライブラリ(DLL)への実行時リンクをサポートする情報を使用してプログラムをビルドします。動的リンクの場合、プログラムの実行時に互換性のあるDLLファイルが利用可能である必要がありますが、静的リンクの場合、プログラムはスタンドアロンです。
スマートリンクは、ビルドツールによって実行され、リンクプロセスにおいて未使用のコードを除外します。例えば、算術演算に整数のみを使用するプログラム、または算術演算を全く行わないプログラムでは、浮動小数点ライブラリルーチンを除外できます。これにより、プログラムファイルのサイズが小さくなり、メモリ使用量も削減されます。
再配置
プログラムまたはライブラリモジュール内の一部の参照は、相対形式またはシンボリック形式で格納されており、すべてのコードとライブラリに最終的な静的アドレスが割り当てられるまで解決できません。再配置はこれらの参照を調整するプロセスであり、リンカーまたはローダーによって実行されます。一般に、メモリ内のアドレスは、それらを使用するプログラムや、それらが結合される他のライブラリによって異なる可能性があるため、個々のライブラリ自体に対して再配置を行うことはできません。位置非依存コードは絶対アドレスへの参照を回避するため、再配置は必要ありません
カテゴリー
実行可能
実行可能ライブラリは、ソースコードから機械語またはバイトコードなどの中間形式に変換されたコードで構成されています。リンカーは、各参照をオブジェクトが配置されているアドレスに関連付けることで、ライブラリオブジェクトの使用を可能にします。たとえば、Cでは、ライブラリ関数はCの通常の関数呼び出し構文とセマンティクスを介して呼び出されます。[ 12 ]
バリアントとは、OS ではロードできないがリンカーでは読み取ることができる形式でコンパイルされたコード (IBM の命名法ではオブジェクト コード) を含むライブラリです。
静的
静的ライブラリとは、リンカー(またはリンクを行うビルドツールの名称)によってビルド時にプログラムにリンクされる実行可能ライブラリです。[ 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など)で外部ライブラリへの依存関係を明示的に指定します。
リモート
リモートライブラリは別のコンピュータ上で実行され、その資産にはネットワーク経由のリモートプロシージャコール(RPC)を介してアクセスされます。この分散アーキテクチャにより、各利用システムにおけるライブラリのインストールとサポートを最小限に抑え、一貫したバージョン管理を確保できます。大きな欠点は、各ライブラリ呼び出しがローカルライブラリよりも大幅に大きなオーバーヘッドを伴うことです
ランタイム
ランタイムライブラリは、ホストプラットフォームに合わせて調整された、 プログラムで利用可能なランタイム環境へのアクセスを提供します
言語標準
多くの現代のプログラミング言語は、言語環境の基本レベルの機能を提供する 標準ライブラリを規定しています
コード生成
コード生成ライブラリは、 Javaのバイトコードを生成または変換する高水準APIを備えています。アスペクト指向プログラミング、一部のデータアクセスフレームワーク、および動的プロキシオブジェクトを生成するためのテストで使用されます。また、フィールドアクセスをインターセプトするためにも使用されます。[ 19 ]
ファイル名
Unixライク
ほとんどの最新の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
macOSシステムはBSDから静的ライブラリの規則を継承し、ライブラリはファイルに保存されます。動的ライブラリにはまたはを使用します。ただし、macOSのほとんどのライブラリは「フレームワーク」で構成されており、「バンドル」と呼ばれる特別なディレクトリ内に配置され、ライブラリに必要なファイルとメタデータがラップされます。たとえば、フレームワークはバンドルと呼ばれるバンドルに実装され、は動的にリンクされたライブラリファイル、または内の動的にリンクされたライブラリファイルへのシンボリックリンクのいずれかになります .a.so.dylibAbcAbc.frameworkAbc.framework/AbcAbc.framework/Versions/Current/Abc
Windows
多くの場合、Windowsダイナミックリンクライブラリ(DLL)のファイル拡張子は.dll[ 20 ]ですが、 OLE.ocxライブラリなど、 一般的なコンテンツを示すために異なる拡張子が使用されることもあります
ファイル.libは静的ライブラリであるか、または関連するDLLを使用するアプリケーションをビルドするために必要な情報を含むファイルです。後者の場合、関連するDLLファイルは実行時に存在している必要があります。
参照
- コードの再利用 – 新しいソフトウェアで既存のコードを使用する
- オブジェクトファイル – 再配置可能な形式のマシンコードを含むファイル
- プラグイン – 既存のソフトウェアの機能を拡張するソフトウェアコンポーネント
- プレリンク(プレバインディングとも呼ばれる)
- ランタイムライブラリ – プログラムのランタイム環境へのアクセス
- ビジュアル コンポーネント ライブラリ – Windows 用 Object Pascal フレームワーク (VCL)
- クロスプラットフォーム向けコンポーネントライブラリ(CLX)
- C標準ライブラリ – Cプログラミング言語の標準ライブラリ
- Java クラスライブラリ – コア Java ライブラリ
- フレームワーク クラス ライブラリ – Microsoft の .NET Framework の標準ライブラリ
- ジェネリックプログラミング– コンピュータプログラミングのスタイル( C++標準ライブラリ で使用)
- soname – 共有オブジェクトファイル内のデータフィールド
- メソッドスタブ – メソッドの短くシンプルなバージョン
- オープンソースコードライブラリのリスト
注記
- ^以前は、例えばAdaサブプログラム間では可能でした
参考文献
- ^バベッジ、H.P. (1888-09-12). 「解析機関」 .英国協会紀要. バース
- ^ゴールドスタイン、ハーマン・H. (2008年12月31日). 『コンピュータ:パスカルからフォン・ノイマンまで』. プリンストン:プリンストン大学出版局. doi : 10.1515/9781400820139 . ISBN 978-1-4008-2013-9。
- ^ゴールドスタイン、ハーマン、フォン・ノイマン(1947年)「電子計算機のための問題の計画とコーディング(報告書)」高等研究所。pp. 3, 21– 22. OCLC 26239859。
サブルーチンの広範な「ライブラリ」を開発することがおそらく非常に重要になるだろう
。 - ^ Wilkes, MV (1951). 「EDSACコンピュータ」 . 1951年国際要件知識管理ワークショップ. 1951年国際要件知識管理ワークショップ. IEEE. p. 79. doi : 10.1109/afips.1951.13 .
- ^キャンベル・ケリー、マーティン(2011年9月)「『ウィルクス、ウィーラー、そしてギル』を賞賛して」「 . Communications of the ACM . 54 (9): 25– 27. doi : 10.1145/1995376.1995386 . S2CID 20261972 .
- ^ウィルクス、モーリス、ホイーラー、スタンレー・ギル(1951). 『電子デジタル計算機のためのプログラム作成法』アディソン・ウェスレー. pp. 45, 80–91 , 100. OCLC 641145988 .
- ^ Wexelblat , Richard (1981).プログラミング言語の歴史. ACMモノグラフシリーズ. ニューヨーク: Academic Press ( Harcourt Braceの子会社). p. 274. ISBN 0-12-745040-8。
- ^ウェクセルブラット、前掲書、258ページ
- ^ウィルソン、レスリー・B.、クラーク、ロバート・G. (1988). 『比較プログラミング言語』 イギリス、ウォキンガム: アディソン・ウェスレー. p. 126. ISBN 0-201-18483-4。
- ^ウィルソンとクラーク、前掲書、52ページ
- ^ヴェクセルブラット、 op.引用。、p. 716
- ^ Deshpande, Prasad (2013).関数呼び出しグラフ分析を用いたメタモーフィック検出(論文). サンノゼ州立大学図書館. doi : 10.31979/etd.t9xm-ahsc .
- ^ 「静的ライブラリ」 . TLDP. 2013年7月3日時点のオリジナルよりアーカイブ。2013年10月3日閲覧。
- ^カミンスキー、ダン (2008). 「第3章 ポータブル実行ファイルと実行ファイルおよびリンク形式」 . IDA Proによるコードのリバースエンジニアリング. エルゼビア. pp. 37– 66. doi : 10.1016/b978-1-59749-237-9.00003-x . ISBN 978-1-59749-237-92021年5月27日閲覧
- ^ Collberg, Christian; Hartman, John H.; Babu, Sridivya; Udupa, Sharath K. (2003). SLINKY: Static Linking Reloaded . USENIX '05.アリゾナ大学コンピュータサイエンス学部. 2016年3月23日時点のオリジナルよりアーカイブ。 2016年3月17日閲覧。
- ^ Levine, John R. (2000). 「9. 共有ライブラリ」リンカーとローダー. ISBN 1-55860-496-0。
- ^ UNIX System V/386 リリース3.2 プログラマーズ・ガイド、第1巻(PDF) 。Prentice Hall、1989年、 p.8-2。ISBN 0-13-944877-2。
- ^ 「SunOSの共有ライブラリ」(PDF)。1、3ページ
- ^ 「コード生成ライブラリ」。Source Forge。2010年1月12日時点のオリジナルからのアーカイブ。 2010年3月3日閲覧。
バイトコード生成ライブラリは、JAVAバイトコードを生成・変換するための高レベルAPIです。AOP、テスト、データアクセスフレームワークにおいて、動的プロキシオブジェクトの生成やフィールドアクセスのインターセプトに使用されます。
- ^ Bresnahan, Christine; Blum, Richard (2015-04-27). LPIC-1 Linux Professional Institute 認定試験対策ガイド: 試験 101-400 および 試験 102-400 . John Wiley & Sons (2015年出版). p. 82. ISBN 9781119021186。2015年9月24日にオリジナルからアーカイブ。 2015年9月3日閲覧。Linuxの共有ライブラリは、Windowsのダイナミックリンクライブラリ(DLL)に似ています。WindowsのDLLは通常
、ファイル名拡張子
で識別されます
.dll
さらに詳しい情報
- Levine, John R. (2000) [1999年10月]. 「第9章:共有ライブラリ」と第10章:動的リンクとロード.リンカーとローダー. モルガン・カウフマン・シリーズ ソフトウェア工学とプログラミング(第1版). サンフランシスコ、米国: Morgan Kaufmann . ISBN 1-55860-496-0. OCLC 42413382 . 2012年12月5日にオリジナルからアーカイブ。2020年1月12日閲覧。コード: [1] [2]エラッタ: [3]
- 記事リンカー初心者ガイドby David Drysdale
- 記事Léon Bottou と John Ryland によるランタイムリンク効率の改善による C++ プログラムの起動の高速化
- プログラムライブラリの作成方法(Baris Simsek 著)
- BFD - バイナリファイル記述子ライブラリ
- 第1回図書館中心のソフトウェア設計ワークショップ LCSD'05 2019年8月28日アーカイブ- Wayback Machineの OOPSLA'05
- 第2回ライブラリ中心のソフトウェア設計ワークショップ LCSD'06 at OOPSLA'06
- Ulrich Drepper による共有ライブラリの作成方法(詳細な背景情報付き)
- IBM.com のLinux 動的ライブラリの解剖