運行時庫(Runtime Library),可能某些和我同樣的初學者不是很瞭解這個概念,可是運行時庫有着十分重要的做用。linux
下面來一段維基百科的解釋:程序員
運行時庫(runtime library,又稱運行期庫),在計算機程序設計領域中,是指一種被編譯器用來實現編程語言內置函數以提供該語言程序運行時(執行)支持的一種特殊的計算機程序庫。這種庫通常包括基本的輸入輸出或是內存管理等支持。它是一羣支持正在運行程序的函數,與操做系統合做提供諸如數學運算、輸入輸出等功能,讓程序寫做者不須要「從新發明輪子」,並善用操做系統提供的功能。 運行時庫由編譯器決定,以面向編程語言,提供其最基本的執行時須要。好比Visual Basic須要複雜的運行時庫支持而C的運行時庫則相對簡單。固然這仍是由編譯器廠商決定的。運行時庫中的函數可能對程序員透明,也可能不透明。這也是由編譯器廠商忖度語言執行環境的需求而決定的。 早期的運行期庫(例如Fortran)提供了數學運算的能力。其餘語言增長了諸如垃圾回收的先進功能,一般用於支持對象數據結構。 許多近代語言設計了更大的運行環境並添加更多功能。不少面嚮對象語言也包含了分派器與類讀取器。Java虛擬機(JVM)即是此類的典型運行環境:它也在運行期直譯或編譯具可攜性的二進制Java程序。而.NET架構也是另一個運行期庫的實例。 異常處理(Exception handling)是專門處理運行期錯誤的語言機制,使程序員能夠徹底捕捉非預期錯誤,或沒有適當處理的錯誤結果。 動態連接庫或靜態連接庫與運行時庫的分類角度不一樣,不得相提並論。編程
做爲一個C語言開發者,你是否想過,咱們常常所使用的printf,memset等函數,其功能是誰幫咱們實現的?又是如何作到能夠在不一樣平臺上兼容的?數據結構
這一切都是運行時庫的默默支持。架構
任何一個C程序,它的背後都有一套龐大的代碼來進行支撐,以使得該程序能正常運行。這套代碼至少包含入口函數,及其所依賴的函數所構成的合集。編程語言
固然,它還理應包括各類標準庫函數的實現。這樣一個代碼集合稱之爲運行時庫。函數
一個C語言的運行庫,至少包含如下功能:操作系統
--啓動與退出:包括入口函數及入口函數所依賴的其餘函數等線程
--標準函數:由C語言標準規定的C語言標準庫所擁有的函數實現設計
--I/O:I/O功能的封裝和實現,例如fopen等函數
--堆:堆的封裝和實現
--語言中特殊功能的實現;調試代碼的實現
在這些運行庫的組成部分中,C標準庫佔了大部分且大有來頭。當咱們使用printf,fread等標準庫中的函數,在不一樣平臺中移植代碼時就無需考慮兼容性,
由於標準庫中的函數實現其實是和不一樣平臺綁定的,標準庫就相似於C程序和不一樣的操做系統平臺間的抽象層,它將不一樣操做系統平臺的系統API封裝成一樣
功能的函數實現。
在Linux系統下,咱們使用的運行庫一般是glibc(GNU C Library),這是一個GNU旗下的C標準庫。實際上glibc是C標準庫的超集,即對C標準庫進行了一
些擴展,好比線程操做並不是是標準的C運行庫中的一部分,可是glibc支持了,即pthread庫中的pthread_create等函數。
在嵌入式linux系統中,爲了節省空間,咱們會使用uClibc運行庫,這是一個面向嵌入式linux操做系統的小型C標準庫。
小結:運行時庫其實本質是個就是個庫,多是動態的也多是靜態的,之因此稱之爲運行時庫主要是由於庫所提供的函數功能,好比提供基本的標準輸入輸出和內存管理,數學計算等許多底層功能,是程序運行時的底層支持。
換言之,若是你爲某系統開發了一個庫,實現了基本標準輸入輸出,內存管理,數學計算等功能,其餘應用在使用底層功能時能夠直接調用庫函數,那麼你的這個庫就是運行時庫。運行時庫使咱們從重複造輪子中解放出來。