函式庫
「library」的各地常用譯名 | |
---|---|
中國大陸 | 庫、函數庫 |
臺灣 | 函式庫、程式庫 |
香港 | 函數庫、程式庫 |
函式庫(英語:library)是在計算機科學中用於開發軟件的子程序集合。庫和可執行文件的區別是:它不是獨立的計算機程序,而是向其他程式提供服務的程式碼。
鏈接
庫鏈接(英語:linking)是指把一個或多個庫包括到程序中,有兩種鏈接形式:靜態鏈接和動態鏈接;相應的,前者鏈接的庫叫做靜態庫,後者的叫做動態庫。
靜態庫
靜態鏈接是由鏈接器在鏈接時將庫的內容加入到可執行程序中的做法。鏈接器是一個獨立程序,將一個或多個庫或目標文件(先前由編譯器或匯編器生成)鏈接到一塊,以生成可執行程序。
靜態鏈接的最大缺點是生成的可執行文件較大,需要更多的系統資源,在載入到記憶體時也會消耗更多的時間。優點是代碼執行效率高。
共享庫
共享庫或共享對象是旨在被執行檔和其他共享對象文件共享的文件。程式使用的模組在裝載時或運行時從各個共享對象加載到記憶體中,而不是在為程式建立單一整體可執行檔時由連結器複製。
共享庫可以在編譯時靜態連結,這意味著在創建可執行檔時解析對庫模組的引用,並為模組分配記憶體。但通常會推遲到共享庫被裝載時才進行連結。
動態鏈接庫
動態鏈接是在可執行文件裝載時或運行時,由操作系統的裝載程序加載庫。大多數操作系統將解析外部引用(比如庫)作為加載過程的一部分。在這些系統上,可執行文件包含一個叫做匯入目錄(import directory)的表,該表的每一項包含一個庫的名字。根據表中記錄的名字,裝載程序在硬盤上搜索需要的庫,然後將其加載到內存中預先不確定的位置,之後根據加載庫後確定的庫的地址更新可執行程序。可執行程序根據更新後的庫信息調用庫中的函數或引用庫中的數據。這種類型的動態加載稱為裝載(load-time)時加載,被包括Windows和Linux的大多數系統採用。裝載程序在加載應用軟件時要完成的最複雜的工作之一就是加載時鏈接。
其他操作系統可能在運行時解析引用。在這些系統上,可執行程序調用操作系統API將庫的名字、函數在庫中的編號和函數參數一同傳遞。操作系統負責立即解析然後代表應用調用合適的函數。這種動態鏈接叫做運行時鏈接。因為每個調用都會有系統開銷,運行時鏈接要慢得多,對應用的性能有負面影響。現代操作系統已經很少使用運行時鏈接。
可以動態鏈接的函式庫,在Windows上是Dynamic Link Library(DLL),在UNIX或Linux上是Shared Library。庫文件是預先編譯鏈接好的可執行文件,存儲在計算機的硬盤上。大多數情況下,同一時間多個應用可以使用一個庫的同一份拷貝,操作系統不需要加載這個庫的多個實例。