【文章內容使用 Gemini 1.5 Pro 自動翻譯產生】
Dart 3 之路:完全可靠的空安全語言
在過去的四年裡,我們將 Dart 發展成為一種快速、可移植且現代化的語言。我們的下一個版本 Dart 3 將完成到完全可靠的空安全語言的旅程。作為這段旅程的最後一步,我們將移除幾個歷史悠久的 Dart 語言和 SDK 工件,包括移除對在沒有可靠空安全的情況下運行的支援。這使得 Dart 更易於學習,並使我們能夠更快地發展 Dart SDK 以支援新功能。要了解 Dart 3 中的主要變化以及如何最好地準備您的應用程式和套件,請继续阅读!
為什麼要使用可靠的空安全?
許多現代程式語言都支援空安全(也稱為void 安全)。這可以避免空解引用問題,Tony Hoare 將其稱為十億美元的錯誤:「這導致了無數的錯誤、漏洞和系統崩潰,在過去的四十年裡可能造成十億美元的痛苦和損失」( Hoare 2009)。為了解決這個問題,像 Swift、C# 和 Kotlin 等語言支援一種類型系統,您可以將變數宣告為非空(永遠不能包含空值)或可空(可以包含值或空值)。這種類型系統可以與靜態分析結合使用,以檢測任何將空值賦值給非空變數的情況。Dart 語言中的空安全支援使用類似的模型,預設情況下變數是非空的,並且只在明確宣告時才允許空值。
更進一步,Dart 在現有語言中引入了可靠的空安全。一個可靠的系統可以保證非空變數永遠不包含空值。在 Dart 空安全的早期規劃中,我們探討了這個主題,以及其他語言所做的權衡。Swift 的設計從一開始就包含了可靠性。TypeScript 本質上是不可靠的,因為它的底層類型系統允許將任何物件視為任何靜態類型。正如您在此 TypeScript 範例中看到的,我們可以將空值賦值給非空變數。出於人體工程學和避免遷移所有現有程式碼的原因,C# 對其空檢查有幾個例外。Kotlin 有幾個不可靠的例外,部分原因是它旨在與 Java 互操作。正如您在此 Kotlin 範例中看到的,泛型可能會觸發空值流入宣告為包含非空元素的列表的情況。
對於 Dart,我們選擇了可靠空安全的路徑。這涉及到一個權衡。在少數情況下,這使得遷移到空安全的成本更高,但會產生一個可靠的類型系統,可以完全信任非空類型註釋。我們可以在我們的編譯器和執行時中基於類型系統的空值方面進行實作優化。我們確切地知道變數何時不為空。我們認為這些是 Dart 的正確權衡。
在 Dart 3 中,所有 Dart 程式碼都將使用可靠的空安全
追蹤議題:SDK #49530。
自從我們在Dart 2.12 中將空安全引入 Dart 語言以來已經三年了。如上一節所述,我們認識到遷移現有 Dart 套件和應用程式所需的影響。為了幫助遷移,Dart 支援以三種方式運行您的應用程式程式碼。它可以在沒有空安全的情況下運行,在具有部分空安全的混合模式下運行,或在完全可靠的空安全的情況下運行。當 100% 的程式碼(包括所有依賴項)已遷移時,就會出現完全可靠的空安全。這讓 Dart 開發人員有時間逐步遷移現有程式碼。然而,支援多種模式會增加開銷和複雜性。
首先,Dart 開發人員需要注意所有三種模式。每當您閱讀一段 Dart 程式碼時,您必須檢查語言版本以查看類型預設是否為非空、預設是否為可空,或兩者兼而有之。
其次,在我們的編譯器和執行時中支援所有三種模式會減慢 Dart SDK 的發展速度。這種支援會增加新增功能的成本和複雜性。
在 Dart 3 中,可靠的空安全將是,如前所述和前所述的,唯一支援的模式。在 Dart 3 及更高版本中,SDK 約束下限小於 2.12 的 Pubspec 檔案將停止解析。當您將約束設定為小於 2.12 時,任何包含語言標記的原始程式碼都將失敗(例如 // @dart=2.9)。
根據我們的遙測數據,我們認為目前大約 85% 的 flutter run
執行都使用可靠的空安全。如果您有剩餘 15% 的應用程式或套件,請在 Dart 3 發佈之前遷移,我們預計將在 2023 年年中左右發佈。
我們理解遷移大型程式碼庫可能需要一些時間。我們相信您會發現遷移是值得的。BMW 最近遷移了他們的主要 MyBMW 應用程式,一個非常大的應用程式,由大約 300 名開發人員組成的團隊建立:
_”雖然對於像 MyBMW 應用程式這樣的大規模程式碼庫來說,遷移到空安全肯定並不容易,但 Google 的工具為我們在遷移過程中提供了巨大的幫助。完成遷移後,我們很高興擁有一個錯誤更少的程式碼庫。”_,Christian Schmid,BMW AG
要了解有關遷移的更多資訊,請觀看以下影片,或查看遷移指南。
重大語言和 API 變更
除了空安全變更之外,我們還進行了一些其他變更,以移除 Dart 語言和核心函式庫 API 中的歷史工件。這些變更包括移除已停止使用的核心函式庫 API ( #49529)、移除預設參數值的歷史語法 ( #2357),以及要求 tear-offs 是顯式的 ( #2399)。
我們相信這些變更對已遷移到使用空安全的程式碼影響很小。當我們發佈第一個 Dart 3 alpha 版本時,您將能夠快速測試這些較小的重大變更是否適用於您的套件或應用程式。
Dart 3 的新功能
Dart 3 預計還將包含許多新功能,包括改進與其他程式語言的互操作性和新的語言功能。我們將在 2023 年 1 月 25 日的下一個重要活動 Flutter Forward 上詳細討論這個主題。
讓我們來預覽一下一個稱為模式的語言功能。模式使 Dart 語言更具表現力,增加了對更多結構化資料的支援,並透過代數資料類型實現更實用的風格。
以下程式碼顯示了一個在函數上使用多個返回值的範例,以及將這些返回值解構為單個變數的功能:
我們將在明年初分享更多關於此新功能的詳細資訊。要查看預覽,您可以查看語言規範
Dart 3 之後
我們同時致力於許多潛在的新功能,從構思到實驗再到潛在的發佈。因此,一些目前的工作將在 Dart 3 之後完成。
首先,正如我們去年提到的,我們正在致力於支援將 Dart 程式碼編譯為 WebAssembly (Wasm)。Wasm 使 Flutter Web 應用程式能夠在瀏覽器中以完全原生程式碼運行。這是一項龐大的工作,需要的不僅僅是更新 Dart 編譯器。它需要與 W3C 和瀏覽器供應商合作,透過 WasmGC 擴展,在 Wasm 中增加對垃圾回收語言的支援。
其次,我們正在致力於巨集。這些啟用了靜態元程式設計。這種強大的機制允許一段程式碼(巨集)在編譯程式期間修改和擴展程式的原始程式碼。例如,這可以減少反序列化 JSON 或建立資料類別所需的樣板程式碼。
您應該期待在 Dart 3 之後看到這些功能和其他令人興奮的功能。
通往 Dart 3 的道路
如前幾節所述,如果您尚未遷移到可靠的空安全,那麼這是第一步。我們建議您現在就這樣做!
接下來,Dart 3 將透過一系列里程碑推出。我們目前的預期圍繞著這些日期:
- 2023 年 1 月/2 月左右:Dart 3 alpha 發佈。它側重於啟用早期的 Dart 3 相容性測試。我們預計您將能夠運行靜態分析 (
dart analyze / flutter analyze
)。我們的目標是任何通過 Dart 3 alpha 靜態分析的應用程式或套件都應支援 Dart 3 穩定版。 - 2023 年 3 月/4 月左右:Dart 3 beta 發佈。此版本預覽了 Dart 3 中的新功能。您可以使用它來試驗新功能,並就問題或改進建議提供回饋。
- 2023 年年中左右:Dart 3 穩定版發佈。可靠的空安全成為唯一支援的模式。
總結
Dart 3 版本預計在 2023 年年中左右發佈。它將包含幾個重大變更,主要是停止在沒有可靠空安全的情況下運行。我們希望在 2023 年 1 月或 2 月左右準備好 Dart 3 alpha 版本,您可以用於 Dart 3 相容性測試。
要準備您的應用程式:
Dart 3 還將包含幾個新的強大功能,例如模式。我們希望在春季發佈 Dart 3 beta 版本,以展示所有新功能。
通往 Dart 3 的道路:完全可靠的空安全語言 最初發佈在 Dart 上的 Medium,人們在那裡透過突出顯示和回應這個故事來繼續討論。