函數庫
| 「library」的各地常用譯名 | |
|---|---|
| 中國大陸 | 庫、函數庫 |
| 香港 | 函數庫、程式庫 |
| 臺灣 | 函式庫、程式庫 |
函數庫(英語:library)是在電腦科學中用於開發軟件的子程式集合。庫和可執行檔案的區別是:它不是獨立的電腦程式,而是向其他程式提供服務的程式碼。
連結[編輯]
庫連結(英語:linking)是指把一個或多個庫包括到程式中,有兩種連結形式:靜態連結和動態連結;相應的,前者連結的庫叫做靜態庫,後者的叫做動態庫。
靜態庫[編輯]
靜態連結是由連結器在連結時將庫的內容加入到可執行程式中的做法。連結器是一個獨立程式,將一個或多個庫或目標文件(先前由編譯器或組譯器生成)連結到一塊,以生成可執行程式。
靜態連結的最大缺點是生成的可執行檔案較大,需要更多的系統資源,在載入到記憶體時也會消耗更多的時間。優點是代碼執行效率高。
共用庫[編輯]
共用庫或共用對象是旨在被執行檔和其他共用對象檔案共用的檔案。程式使用的模組在裝載時或運行時從各個共用對象載入到記憶體中,而不是在為程式建立單一整體可執行檔時由連結器複製。
共用庫可以在編譯時靜態連結,這意味着在建立可執行檔時解析對庫模組的參照,並為模組分配記憶體。但通常會推遲到共用庫被裝載時才進行連結。
動態連結庫[編輯]
動態連結是在可執行檔案裝載時或執行時,由作業系統的裝載程式載入庫。大多數作業系統將解析外部參照(比如庫)作為載入過程的一部分。在這些系統上,可執行檔案包含一個叫做匯入目錄(import directory)的表,該表的每一項包含一個庫的名字。根據表中記錄的名字,裝載程式在硬碟上搜尋需要的庫,然後將其載入到主記憶體中預先不確定的位置,之後根據載入庫後確定的庫的地址更新可執行程式。可執行程式根據更新後的庫資訊呼叫庫中的函數或參照庫中的數據。這種類型的動態載入稱為裝載(load-time)時載入,被包括Windows和Linux的大多數系統採用。裝載程式在載入應用軟件時要完成的最複雜的工作之一就是載入時連結。
其他作業系統可能在執行時解析參照。在這些系統上,可執行程式呼叫作業系統API將庫的名字、函數在庫中的編號和函數參數一同傳遞。作業系統負責立即解析然後代表應用呼叫合適的函數。這種動態連結叫做執行時連結。因為每個呼叫都會有系統開銷,執行時連結要慢得多,對應用的效能有負面影響。現代作業系統已經很少使用執行時連結。
可以動態連結的函數庫,在Windows上是Dynamic Link Library(DLL),在UNIX或Linux上是Shared Library。庫檔案是預先編譯連結好的可執行檔案,儲存在電腦的硬碟上。大多數情況下,同一時間多個應用可以使用一個庫的同一份拷貝,作業系統不需要載入這個庫的多個實例。
參考文獻[編輯]
- Levine, John R. Chapter 9: Shared Libraries & Chapter 10: Dynamic Linking and Loading. Linkers and Loaders. The Morgan Kaufmann Series in Software Engineering and Programming 1. San Francisco, USA: Morgan Kaufmann. 2000 [October 1999] [2020-01-12]. ISBN 1-55860-496-0. OCLC 42413382. (原始內容存檔於2012-12-05). Code: [1][2][失效連結] Errata: [3]
- Article Beginner's Guide to Linkers by David Drysdale
- Article Faster C++ program startups by improving runtime linking efficiency by Léon Bottou and John Ryland
- How to Create Program Libraries[被篡奪] by Baris Simsek
- BFD - the Binary File Descriptor Library
- 1st Library-Centric Software Design Workshop LCSD'05 互聯網檔案館的存檔,存檔日期2019-08-28. at OOPSLA'05
- 2nd Library-Centric Software Design Workshop LCSD'06 at OOPSLA'06
- How to create shared library by Ulrich Drepper (with much background info)
- Anatomy of Linux dynamic libraries at IBM.com