翻譯自Swift在Github上發佈的Swift ABI Manifestogit
原文連接github
當前,Swift最重要的工做之一,就是在多個版本之間保持兼容性。而所謂的兼容性,則是要在源碼以及二進制層次上,分別達到它們各自的目標。編程
在源代碼層次實現兼容,也就是讓新版本的編譯器能夠編譯老版本的Swift代碼。這能夠下降開發者在遷移到Swift新版本時的痛苦。沒有源代碼層次的兼容,用Swift編寫的項目就很可貴以傳承,項目中全部的源代碼和使用的程序庫必須使用同一個版本的Swift語言。而提供了源代碼層次的兼容性,程序庫的做者就能夠基於某個Swift版本只維護一套代碼,而且讓程序庫的使用者使用更新版本的Swift。swift
程序庫和運行時在二進制上的兼容性則讓(用某個版本編譯的)程序庫在多個不一樣的Swift版本上進行分發成爲可能。二進制的程序庫包含了一個Swift module file,它提供了這個程序庫API源代碼級別的信息;以及一個共享的程序庫文件,它包含了在運行時加載的編譯以後的代碼。所以,實現二進制的兼容性須要完成兩目標:架構
首先,Swift module格式的穩定性可讓編譯器用固定的方式表達程序庫的公共接口,這也就是Swift module file的穩定性。這包括了API的聲明以及代碼是否能夠inline的表達方式。編譯器須要使用module file完成諸多必要的工做,例如,當編譯程序庫的客戶端調用時,對其進行類型檢查以及生成調用代碼。app
其次,ABI的穩定性則爲使用不一樣版本Swift編譯的程序庫和應用程序提供了兼容性。這是這份文檔接下來的部分關注的內容。這份文檔探索並解釋了什麼是Swift ABI,並羅列了宣稱Swift ABI已穩定前要進行的調查以及完成的目標。做爲Swift社區的一份資源,這份文檔也爲Swift ABI的發展指明瞭方向。編程語言
這份文檔中,會用"SR-xxxx"的形式,引用Swift issue tracking system中的內容。這些內容記錄了和Swift ABI相關的工程和設計任務。函數
在運行時,經過Swift編寫的二進制程序經過ABI和其餘的程序庫或組件進行交互。ABI是Application Binary Interface的縮寫,它是一個規範,經過這個規範,全部被獨立編譯的二進制實體才能被連接在一塊兒並執行。這些二進制實體必須在一些很低層的細節上達成一致,例如:如何調用函數,如何在內存中表示數據甚至是如何存儲以及訪問metadata。工具
ABI是平臺相關的,由於它關注的這些底層細節會受到不一樣的硬件架構以及操做系統的的影響。大部分的平臺都定義了一份能夠用於C以及C語言家族代碼的「標準ABI」。但Swift是一門和C大相徑庭的語言,它須要爲每一種平臺定義本身的ABI。而這份文檔中中的絕大部份內容都是和平臺無關的,和具體平臺相關的考量會影響到Swift ABI的設計和實現細節。若是你要了解不一樣平臺上的「標準ABI」,能夠參考附錄中的內容。性能
ABI穩定是指把ABI鎖定在某種形式,以致於將來的編譯器均可以生成聽從這種形式的二進制實體(能夠是程序庫,也能夠是應用程序)。一旦ABI穩定了,就意味着它會伴着這個平臺的一輩子一世,直至日益增加的依賴關係讓它走向滅亡。
ABI的穩定性僅會影響到外部可見的公共接口和符號的不變性。而內部使用的符號、調用約定以及內存格局仍舊能夠修改而不會破壞ABI約定。例如,將來版本編譯器徹底能夠在保留外部接口函數調用約定的同時,改變內部函數的調用約定。
對ABI作的每個決定都會對編程語言產生長遠的影響,甚至會制約一門編程語言在將來能夠發展和進化的空間。Swift將來的版本可能會在更多垂直領域爲ABI添加特性,但只要聲明瞭某個平臺的ABI已穩定,那麼任何在效率以及靈活性上曾經不妥的設計都將永遠伴着這個平臺存在。
爲ABI在垂直領域添加新的特性叫作ABI積累性更新(ABI-additive changes)。每當支持這個特性的Swift版本達到最小目標值的時候,就能夠把這個特性歸入積累性更新。這種方式容許咱們逐步擴展或鎖定ABI中的內容。例如,讓ABI支持更多特性,或使用更有效率的數據訪問方式等。在這份文檔後面,咱們會看到不少這樣的例子。
ABI穩定以後,OS發行商就能夠把Swift標準庫和運行時做爲操做系統的一部分嵌入,因爲這些標準庫和運行時能夠支持用更老或更新版本Swift構建的應用程序,這樣,開發者就無需在分發應用的同時,還要帶上一份本身構建應用時使用的標準庫和運行時拷貝。這使得工具和操做系統能夠更好的進行集成。
就像以前提到的同樣,對二進制程序庫來講,ABI穩定是必要但不充分的。模塊文件格式的穩定性也是必須的,但這超出了這份文檔討論的範疇。
一般,若是一門編程語言在表現力和性能上均表現良好,而且還提供了二進制接口,它就很容易表現出二進制接口很脆弱的問題。對於用這種語言編寫的程序庫或組件來講,要讓用戶在不從新編譯源碼的條件下使用新版本的程序庫是很難的。當前,Swift主要的前進方向是標準庫的進化,天然就要給開發者在維護二進制兼容性這個問題上更多進退的空間。不少實現上的考量的確會對ABI的設計有所影響。
所以,遲遲沒有聲明ABI穩定的一個主要目的,就是爲程序庫的進化保留足夠的靈活性,而不但願開發者因爲ABI的穩定性而限制設計空間。程序庫在進化上的考量將會在下面每個單獨的章節中描述,但它們闡述的一個公共的觀點則是有些設計細節仍舊沒有肯定下來。
(To be continue...)