整理丨諾亞
出品 | 51CTO技術(shù)棧(微信號:blog51cto)
眾所周知,Dart語言的流行與其關(guān)聯(lián)的Flutter框架密切相關(guān)。
于2011年推出的Dart,起初致力于成為一門結(jié)構(gòu)化的Web編程語言,暗藏取代JavaScript的野心。結(jié)果卻險些半道折戟,直到Flutter 的火爆才讓 Dart 重新進(jìn)入大眾的視線。
Flutter是一個跨平臺的UI開發(fā)框架,使用了Dart語言。Dart可以編譯為針對Arm32、Arm64或x86_64的原生可執(zhí)行文件,或者編譯為JavaScript。同屬于谷歌的Flutter和Dart,可以稱得上是互相成就。
日前,Dart又有新動作,谷歌發(fā)布了Dart 3.3版本。此版本的發(fā)布標(biāo)志著Dart語言在支持Flutter WebAssembly方面邁出了重要一步。
這次更新為開發(fā)人員提供了實(shí)驗(yàn)性的WebAssembly支持,使得開發(fā)者能夠以更高效的方式將Dart編寫的代碼編譯到WebAssembly標(biāo)準(zhǔn),從而在瀏覽器環(huán)境中運(yùn)行高性能的Flutter web應(yīng)用。更值得注意的是,谷歌還發(fā)布了用于在Dart和Flutter應(yīng)用中構(gòu)建生成式AI功能的SDK。
1、新模式:加強(qiáng)與JS的互操作
在Dart 3.3中,谷歌引入了一種與JavaScript庫進(jìn)行互操作的新模式,這對于順利過渡到使用WebAssembly至關(guān)重要。這意味著應(yīng)用程序和包作者現(xiàn)在可以開始調(diào)整其代碼結(jié)構(gòu),以便于未來與WebAssembly兼容。盡管當(dāng)前Flutter對于WebAssembly的支持還處于試驗(yàn)階段,但谷歌團(tuán)隊(duì)正積極致力于穩(wěn)定和完善這一功能。
早在2023年3月于巴塞羅那舉辦的Wasm I/O大會上,Google Flutter和Dart產(chǎn)品經(jīng)理Kevin Moore就表示,根據(jù)“非常有限的基準(zhǔn)測試”,相較于編譯為JavaScript,通過WebAssembly實(shí)現(xiàn)的性能提升可達(dá)1.5至3倍。
與微軟的C#不同,Dart編譯為WebAssembly時采用的是WasmGC,這是Wasm中針對垃圾收集語言的新標(biāo)準(zhǔn)API,但目前僅在基于Chromium的瀏覽器和Firefox中有效,而不支持Safari。
如今,Dart 3.3版本包含了邁向WebAssembly生產(chǎn)級使用的重大一步,其中包含一個全新的JavaScript互操作模型?!艾F(xiàn)在,Dart開發(fā)者能夠訪問一種用于與JavaScript交互的類型化API?!盡oore在上周發(fā)布的文章中解釋道。
尤其需要指出的是,在Dart 3.3中的擴(kuò)展類型引入了針對類型的零成本包裝器。新模型利用了一種被稱為“在現(xiàn)有類型上以不同的、僅靜態(tài)的接口進(jìn)行‘包裝’的編譯時抽象”。
其優(yōu)點(diǎn)在于,它們能夠在無額外開銷的情況下修改現(xiàn)有類型的接口,而不同于需要額外運(yùn)行時對象的包裝類,這使得擴(kuò)展類型非常適合高效的JavaScript互操作。
圖片
可以說,擴(kuò)展類型不僅提供了自定義類型的便捷性,同時消除了包裝器分配的開銷。因此,谷歌指出,可以直接使用原生類型,無需創(chuàng)建包裝器及其相關(guān)的間接調(diào)用開銷,從而提升了性能表現(xiàn)。
2、新用意:為生成式AI鋪路
使用這種新的JavaScript互操作模型是支持Wasm所必需的,但需要對舊代碼進(jìn)行遷移。為了使Flutter應(yīng)用能夠利用WebAssembly在Web平臺上運(yùn)行,開發(fā)者需要將所有相關(guān)的應(yīng)用代碼及其依賴項(xiàng)遷移到Dart中的新JavaScript互操作機(jī)制以及package:web提供的工具和技術(shù)上。
Dart團(tuán)隊(duì)表示:“如果您維護(hù)了一個使用dart:html或其他任何Dart SDK web庫的公共Flutter包,應(yīng)盡快遷移到package:web。長期來看,package:web將替代dart:html和其他web庫作為Dart的Web互操作解決方案。”
在過渡期間,開發(fā)者可能會遇到一些阻力。為此,Dart團(tuán)隊(duì)發(fā)布了詳細(xì)的遷移指南,以協(xié)助開發(fā)者適應(yīng)這些變化并順利啟動基于WebAssembly的Flutter Web項(xiàng)目。
雖然Wasm支持主要針對Flutter,但并非完全如此。
團(tuán)隊(duì)在GitHub上指出:“盡管Wasm最初是為了在Web上運(yùn)行原生代碼而設(shè)計(jì)的,但此后Wasm已經(jīng)發(fā)展成為一種跨多個平臺運(yùn)行編譯代碼的通用技術(shù)?!蔽磥響?yīng)用場景可能包括在服務(wù)器端代碼中使用Wasm編譯的Dart。
隨著Dart 3.3的發(fā)布,谷歌還推出了AI Dart SDK,該SDK通過package:google_generative_ai調(diào)用谷歌的Gemini AI模型,使得開發(fā)者能夠利用Gemini API在Dart或Flutter應(yīng)用中構(gòu)建生成式AI功能。
Flutter全球產(chǎn)品經(jīng)理Ander Dobo表示,Dart支持即將添加到谷歌的AI Studio中。AI Dart SDK的引入表明,谷歌正利用其對開源Dart和Flutter項(xiàng)目的支持,引導(dǎo)開發(fā)者使用其AI服務(wù)。