二進製文件和庫有什麼區別?
我正在嘗試了解文件系統層次結構標準。我已經查找了二進製文件和庫,據我所知:
二進製文件是二進制格式的電腦可讀程式碼文件,它直接用位控制 CPU 和處理器。
庫是各種程序可以使用的函式,為了方便起見 - 比如當您需要 PHP 的 Javascript 中的模組時。
這種理解正確嗎?如果是,我們為什麼還要將庫和二進製文件分開?有些庫是二進製文件,對吧?並且一些二進製文件(cat、less、date、rm、cp 等)被使用和重用,就好像它們是庫一樣……有人可以幫助解釋差異並幫助我找到這兩個詞的更好定義嗎?謝謝你。
您的理解大部分是正確的,但還有一些額外的事情需要考慮:
- “二進制”是指人類不可讀的東西。這通常是指機器程式碼,但許多其他文件在這個意義上也是二進製文件,大多數多媒體格式就是一個很好的例子。然而,FHS 對該術語有更具體的用法。
- 庫可以是二進制程式碼。事實上,其中的大部分內容
/lib
都是編譯為機器程式碼的庫。- 雖然
cat
在 shell 腳本中使用了類似呼叫庫中程式碼的東西,但它們不是 FHS 意義上的庫,因為它們可以自己執行。由於這些觀點,不編寫標准文件的人中更常見的術語是:
目標文件:這些是本機編譯的機器程式碼,但甚至可能無法執行或無法呼叫。
.o
除非它們屬於其他類別之一,否則它們通常具有副檔名,並且在大多數係統上幾乎從未見過,除非在建構軟體時。我在這裡列出了它們,因為它們對於理解下面的一些事情很重要。執行檔:這些文件主要由可直接執行的自包含程式碼組成。它們可能是可以由核心直接載入的特殊格式的目標文件(像
cat
,bash
和python
都是這種類型的執行檔),或者由一些本身是執行檔的中間程序解釋(Minecraftpydoc
, 和cowsay
都是範例這種類型的執行檔)。第一種類型的執行檔在 UNIX 系統上幾乎沒有文件副檔名,而第二種類型的執行檔可能有也可能沒有。這就是 FHS 所說的“二進製文件”。它們可以從其他執行檔執行,但需要呼叫特殊函式來呼叫它們(在 Cfork()
和exec()
C++ 中,subprocess
Python 等中的模組)並作為單獨的程序執行。庫:這些文件包含可被另一個庫或執行檔呼叫的可重用程式碼。一旦庫被載入(在談論編譯程式碼時稱為“連結”),庫中的程式碼(大部分)由其他程式碼直接呼叫,並在與呼叫它的程式碼相同的程序中執行。共有三種通用類型的庫:
- 靜態庫:這些是原始的品種。它們由一個存檔文件(通常是 AR 格式)組成,其中包含大量目標文件,庫中的每個函式都有一個。目標文件被連結到使用它們的執行檔中,因此僅使用靜態庫的執行檔基本上 100% 獨立於任何其他程式碼。在 UNIX 系統上,它們通常具有
.a
副檔名。靜態庫的概念在編譯的程式語言之外並不真正存在。- 動態庫:這些是當今使用的最常見的庫類型。動態庫是一個特殊的對象文件,通常在 UNIX 上具有
.so
副檔名(.dll
是 Windows 上的標準),在執行時由使用它的執行檔載入。您會在/lib
生產系統中找到的大部分內容都是動態庫。- 模組:這相當於解釋語言的動態庫。處理與編譯語言略有不同,並且與編譯語言不同,文件可能既是模組又是執行檔(參見
http.server
Python 標準庫中的範例)。