図書館(コンピューティング)

libvorbisfile を使用してOgg Vorbisファイルを再生するアプリケーションの図

コンピューティングにおいて、ライブラリとは、ソフトウェア開発中にコンピュータプログラムを実装するために使用できるリソースの集合体です。一般的に、ライブラリはコンパイルされた関数クラスなどの実行可能コードで構成されますが、ソースコードの集合体である場合もあります。リソースライブラリには、画像テキストなどのデータが含まれる場合があります。

ライブラリは、複数の独立した利用者(プログラムや他のライブラリ)から利用できます。これは、プログラム内で定義されたリソース(通常はそのプログラムでのみ使用可能)とは異なります。利用者がライブラリリソースを使用すると、ライブラリ自体を実装することなく、そのライブラリの価値を得ることができます。ライブラリは、モジュール形式でのソフトウェアの再利用を促進します。ライブラリは他のライブラリも使用できるため、プログラム内にライブラリの階層構造が形成されます。

ライブラリを使用するコードを書く場合、プログラマーはライブラリの内部構造を理解する必要はなく、そのライブラリのアプリケーション・プログラミング・インターフェース(API)の使い方さえ知っていれば十分です。例えば、複雑なシステムコールを抽象化するライブラリを使用することで、プログラマーはシステム関数の複雑な仕組みを学習することなく、システム機能を利用できるようになります。

歴史

コンピュータライブラリのアイデアは、チャールズ・バベッジが初めてコンピュータを開発した頃に遡ります。1888年に発表された解析機関に関する論文では、コンピュータの演算処理を数値入力とは別のカードにパンチできることが示唆されていました。これらの演算処理用のパンチカードを再利用のために保存しておけば、「次第に解析機関は独自のライブラリを持つようになるだろう」とされています。[ 1 ]

EDSACコンピュータ用のパンチテープのリールに収められたサブルーチンライブラリを収納したファイリングキャビネットの横で作業する女性

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、DOEPDO、そして様々な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から静的ライブラリの規約を継承しており、ライブラリは.aファイルに格納されます。動的ライブラリには.soまたは を使用します。ただし、macOSのほとんどのライブラリは「フレームワーク」で構成されており、「バンドル」と呼ばれる特別なディレクトリ内に配置されます。バンドルにはライブラリに必要なファイルとメタデータがラップされています。例えば、 というフレームワークはというバンドルに実装され、 は動的にリンクされたライブラリファイル、または 内の動的にリンクされたライブラリファイルへのシンボリックリンクのいずれかになります。 .dylibAbcAbc.frameworkAbc.framework/AbcAbc.framework/Versions/Current/Abc

ウィンドウズ

多くの場合、Windowsダイナミックリンクライブラリ(DLL)にはファイル拡張子が付きますが.dll[ 20 ] OLE.ocxライブラリなど、一般的なコンテンツを示すために異なる拡張子が使用されることもあります。

ファイル.libは静的ライブラリであるか、または関連するDLLを使用するアプリケーションをビルドするために必要な情報を含むファイルです。後者の場合、関連するDLLファイルは実行時に存在している必要があります。

参照

注記

  1. ^以前は、たとえば Ada サブプログラム間では可能でした。

参考文献

  1. ^バベッジ, HP (1888-09-12). 「解析機関」英国協会紀要バース.
  2. ^ゴールドスタイン、ハーマン・H. (2008年12月31日). 『コンピュータ:パスカルからフォン・ノイマンまで』. プリンストン:プリンストン大学出版局. doi : 10.1515/9781400820139 . ISBN 978-1-4008-2013-9
  3. ^ゴールドスタイン、ハーマンフォン・ノイマン(1947年)「電子計算機のための問題の計画とコーディング(報告書)」高等研究所。pp. 3, 21– 22. OCLC 26239859。サブルーチンの広範な「ライブラリ」を開発することがおそらく非常に重要になるだろう 
  4. ^ Wilkes, MV (1951). 「EDSACコンピュータ」 . 1951年国際要件知識管理ワークショップ. 1951年国際要件知識管理ワークショップ. IEEE. p. 79. doi : 10.1109/afips.1951.13 .
  5. ^キャンベル・ケリー、マーティン(2011年9月)「『ウィルクス、ウィーラー、そしてギル』を賞賛して」 . Communications of the ACM . 54 (9): 25– 27. doi : 10.1145/1995376.1995386 . S2CID  20261972 .
  6. ^ウィルクス、モーリスホイーラースタンレー・ギル(1951). 『電子デジタル計算機のためのプログラム作成法』アディソン・ウェスレー. pp. 45, 80–91 , 100. OCLC 641145988 . 
  7. ^ Wexelblat , Richard (1981).プログラミング言語の歴史. ACMモノグラフシリーズ. ニューヨーク: Academic Press ( Harcourt Braceの子会社). p.  274. ISBN 0-12-745040-8
  8. ^ヴェクセルブラット、 op.引用。、p. 258
  9. ^ウィルソン、レスリー・B.、クラーク、ロバート・G. (1988). 『比較プログラミング言語』 イギリス、ウォキンガム: アディソン・ウェスレー. p. 126. ISBN 0-201-18483-4
  10. ^ウィルソンとクラーク、前掲書、52ページ
  11. ^ヴェクセルブラット、 op.引用。、p. 716
  12. ^ Deshpande, Prasad (2013).関数呼び出しグラフ分析を用いたメタモーフィック検出(論文). サンノゼ州立大学図書館. doi : 10.31979/etd.t9xm-ahsc .
  13. ^ 「静的ライブラリ」 . TLDP. 2013年7月3日時点のオリジナルよりアーカイブ2013年10月3日閲覧。
  14. ^カミンスキー、ダン (2008). 「第3章 ポータブル実行ファイルと実行ファイルおよびリンク形式」 . IDA Proによるコードのリバースエンジニアリング. エルゼビア. pp.  37– 66. doi : 10.1016/b978-1-59749-237-9.00003-x . ISBN 978-1-59749-237-9. 2021年5月27日閲覧
  15. ^ Collberg, Christian; Hartman, John H.; Babu, Sridivya; Udupa, Sharath K. (2003). SLINKY: Static Linking Reloaded . USENIX '05.アリゾナ大学コンピュータサイエンス学部. 2016年3月23日時点のオリジナルよりアーカイブ。 2016年3月17日閲覧
  16. ^ Levine, John R. (2000). 「9. 共有ライブラリ」リンカーとローダー. ISBN 1-55860-496-0
  17. ^ UNIX System V/386 Release 3.2 プログラマーズ・ガイド 第1巻(PDF) . Prentice Hall. 1989. p. 8-2. ISBN 0-13-944877-2
  18. ^ 「SunOS の共有ライブラリ」(PDF) pp. 1, 3。
  19. ^ 「コード生成ライブラリ」。Source Forge2010年1月12日時点のオリジナルからのアーカイブ。 2010年3月3日閲覧バイトコード生成ライブラリは、JAVAバイトコードを生成・変換するための高レベルAPIです。AOP、テスト、データアクセスフレームワークにおいて、動的プロキシオブジェクトの生成やフィールドアクセスのインターセプトに使用されます。
  20. ^ 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

さらに読む