編程核心知識—API與ABI的區別

編程核心知識—API與ABI的區別

API與ABI不時會出現在軟件開發的文檔中,他們看上去相似卻有很大區別,屬於編程核心知識。鑑於,在維基百科上的定義比較形式化,不易理解。這裡先從通俗易懂的角度講解區別,然後再看維基百科的定義。

一句話區別

  • API(Application Programming Interface,應用程序編程接口)是對源代碼的約束。
  • ABI(Application Binary Interface,應用程序二進制接口)是對目標代碼的約束。

更詳細說明

API

通常,我們使用特定的編程語言來描述API,儘管某些軟件系統(“框架”或“庫”)提供了多種語言的API(例如,許多機器學習框架同時具有C++和Python API)。API不僅包括功能、過程和數據結構的描述,還包括其使用約定(用於正確的資源管理 、回調機制和性能特徵等)。紮實的API知識對於在特定框架下高效開發應用程序必不可少。大多數應用程序會使用多個API或框架:包括“開箱即用”編程語言提供的API、操作系統提供的API和第三方API等。大型應用程序還將傾向於包含”內部API“,這是專門為該應用程序開發的庫的API(作為一種可以降低應用程序整體複雜性的機制)。

ABI

ABI包含很多方面的東西:

  • 如何編碼函數名稱。
  • 如何將參數傳遞給函數,以及如何獲取返回值。
  • 如何佈局數據結構:大小、對齊方式和相對偏移量等。
  • 如何拋出和處理異常。
  • 等等。

儘管ABI中的A是應用程序的縮寫,但通常應用程序的程序員對ABI的關注並不多。相反,它們通常處理以下兩種情況:

  • 以源代碼分發的框架:該框架是使用與應用程序相同的工具集(編譯器、鏈接器等)構建的,並且該工具集可確保所有”二進制位“都連接在一起。
  • 以二進制分發的框架:該框架是為特定工具集預先構建的,應用程序開發人員只需確保其用的工具集與該框架兼容即可。
編程核心知識—API與ABI的區別

維基百科定義

API

應用程序編程接口(API)是計算機程序不同部分之間的接口或通信協議,旨在簡化軟件的實現和維護。

API可以用於基於Web的系統、操作系統、數據庫系統、計算機硬件或軟件庫。

API規範可以採用多種形式,但通常包括例程、數據結構、對象類、變量或遠程調用的規範。 POSIX、Windows API和ASPI是不同形式的API的示例。通常會提供API文檔,以方便使用和實施。

最近,該術語通常用於指代客戶端和服務器之間的特定類型的接口,該接口被描述為兩者之間的“合同”。因此,如果客戶端以特定格式發出請求,將始終以特定的格式獲得響應或啟動已定義的操作。這是API的一種特殊形式,有時也定義為WEB API。

ABI

在計算機軟件中,應用程序二進制接口(ABI)是兩個二進制程序模塊之間的接口。通常,這些模塊之一是庫或操作系統工具,另一個是用戶正在運行的程序。

ABI定義瞭如何在機器代碼中訪問數據結構或計算例程,這是一種低級的,與硬件相關的格式。相比之下,API在源代碼中定義了這種訪問,這是一種相對高級的、獨立於硬件的、通常是人類可讀的格式。 ABI的一個常見方面是調用約定,它確定如何將數據作為計算例程的輸入提供或從計算例程的輸出讀取。示例是x86調用約定。

堅持使用ABI(可能會或可能不會正式標準化)通常是編譯器、操作系統或庫作者的工作;但是,當使用多種編程語言編寫程序時,應用程序程序員可能必須直接處理ABI,這可以通過使用外部函數調用接口(FFI)來實現。


參考:https://www.quora.com/What-is-the-difference-between-API-and-ABI


分享到:


相關文章: