在 GitHub 上編輯此頁面

二進位相容性

在 Scala 2 中,編譯器的不同次要版本可以自由變更編碼不同語言功能到 JVM 位元組碼的方式,因此編譯器次要版本的每次升級都會導致二進位相容性中斷,而且如果專案有任何 Scala 相依性,它們都需要 (交叉) 編譯到該專案本身使用的相同次要 Scala 版本。相反地,Scala 3 具有穩定的編碼到 JVM 位元組碼的方式。

除了類別檔外,Scala 3 中的編譯程序還會產生副檔名為 .tasty 的檔案。TASTy 格式是 Scala 程式碼的中間表示法,包含原始碼的完整資訊,以及類型檢查器提供的資訊。其中一些資訊會在產生位元組碼時遺失,因此 Scala 3 編譯器會在編譯時讀取 TASTy 檔案,除了類別檔之外,還會知道已編譯類別中值、方法等的精確類型 (雖然也可以只從 TASTy 檔案編譯)。TASTy 檔案通常也會與類別檔一起發布在已發行的成品中。

TASTy 格式可擴充,但它會保留向後相容性,而且演進會發生在語言的次要版本之間。這表示版本 3.x1.y1 中的 Scala 編譯器能夠讀取版本 3.x2.y2 中的另一個編譯器產生的 TASTy 檔案,如果 x1 >= x2(假設考慮兩個編譯器的穩定版本 - SNAPSHOTNIGHTLY 編譯器版本能夠以較舊的穩定格式讀取 TASTy,但即使編譯器具有相同次要版本,它們的 TASTY 版本彼此不相容;而且穩定版本中的編譯器無法讀取不穩定版本產生的 TASTy)。

TASTy 版本號碼的格式為 <主要版本>.<次要版本>-<實驗版本>,編號會與語言版本平行變更,也就是語言次要版本升級對應到 TASTy 次要版本升級(例如,對於 Scala 3.0.0,TASTy 版本是 28.0-0)。實驗版本設定為 0 表示穩定版本,而其他版本則視為不穩定/實驗版本。TASTy 版本並未嚴格約束於資料格式本身 - 標準程式庫的 API 任何變更也需要變更 TASTy 次要版本。