應用程式介面 API(概覽)
/ ay-pee-eye /
API 是一段軟體公開的「菜單」:你被允許請它做的那些事,以及該怎麼請。API 是 application programming interface(應用程式介面)的縮寫。就像餐廳菜單,它告訴你有什麼可點、怎麼點,卻不透露廚房實際怎麼烹調。你針對菜單來寫程式,而軟體承諾完全照菜單所述,履行你下的每一張單。
具體來說,當一個函式庫或作業系統提供一個 API,它公開的是你可以呼叫的函式、它們接受什麼引數、做什麼以及回傳什麼。例如,C 標準函式庫的 API 包含 printf("%d", n) 之類用來列印、以及 malloc(size) 用來要求記憶體的函式:你被告知名稱、參數與承諾的行為——也就是契約——但不告訴你內部實作。只要那份契約成立,函式庫背後的人就能自由重寫內部,而你的程式碼照常運作,因為它向來只倚賴那份公開的介面。
為何重要:API 正是抽象堆疊各層實際連接的方式。你透過作業系統的系統呼叫 API(open()、read()、write())來使用它;你透過一個函式庫的 API 來使用它。關鍵概念是介面與實作的分離:你倚賴的是承諾的行為,而不是它怎麼做到的。請注意,API 是原始碼層級、面向程式設計師的契約——是你在程式碼裡寫的東西。這跟 ABI 不同,後者是編譯之後所用的二進位層級契約。
當你寫 fopen("data.txt", "r"),你在使用 C 函式庫的檔案 API。你承諾傳入一個檔名與一個模式字串;函式庫承諾回傳一個可用的檔案控制代碼、或在失敗時回傳 NULL。它內部怎麼開那個檔案,與你無關。
API 為各個呼叫及其承諾的行為命名,把實作藏起來。
API 是原始碼層級的契約,不是二進位層級的:它說的是要呼叫什麼、它做什麼。對應到編譯後程式碼的二進位層級契約是 ABI。把兩者搞混很常見——API 是你寫的東西,ABI 則是編譯後那些位元組如何彼此咬合。