Flutter 新春第一彈,Dart 宏功能推進暫停,后續專注定制數據處理支持

在去年春節,Flutter 官方發布了宏(Macros)編程的原型支持, 同年的 5 月份在 Google I/O 發布的 Dart 3.4 宣布了宏的實驗性支持,但是對于 Dart 內部來說,從啟動宏編程實驗開始已經過去了幾年,但是從目前的推進趨勢看,完全的宏功能支持并不理想,結論大概是:

能用是能用,但是質量和性能都達不到一開始的預期

具體原來在于 Dart 的靜態語言提前編譯和有狀態的熱重載等方面,對于元編程而言,需要建立在強大的內省基礎支持之上,但是對于 Dart 目前來說,運行時內省(例如反射)會讓 tree-shaking 優化變得困難 ,而 tree-shaking 優化是 Dart 在二進制優化的重要指標之一。

一開始 Dart 的目標是構建一個完整的宏系統,從而讓該系統支持在編譯時對程序進行深度語義內省,但是在實現語義內省時引入了大量的編譯時成本,而這讓有狀態的熱重載保持變得困難

目前的宏編程還讓 Flutter 開發時的 IDE 編輯與補全體驗下降。

同時帶來的還有依賴項里的宏循環依賴等問題,例如在 IDE 中輸入“.foo” 可能需要重新處理所有宏,從而執行正確的代碼,目前來看要么處理得太頻繁,要么給出的結果不正確。

在過去的測試里,宏在小型庫上的性能非常好,但是在真實應用的大周期開發里,會讓 Dart 的體驗變得很差,例如在頂層編輯(聲明、方法頭、字段等)時,基本上每次鍵入都需要重新運行整個宏構建。

而針對當前宏支持采用緩存的提議,也存在宏生成的代碼的整個版本適配問題,例如:

現在有一個依賴于 foo 和 bar 的 my_app 包,如果你只在 foo 上運行 pub get,解析器可能會給你 bar 1.2.3;而當你在 my_app上運行 pub get 時,也許會得到 bar 2.3.4,大概可能是 @doStuff 宏內省的 type from bar 在這些版本之間不同。

雖然也可以通過限制內省來避免這種深層依賴,但帶來的一些其他負面,例如你可能正在為 foo 生成 JSON 序列化代碼,并且宏正在嘗試判斷其類型來自 bar 的字段是否支持 JSON 序列化,甚至前面提到的循環依賴問題。

當然針對和這個可能還有其他解決方案,相比較目前帶來的編譯時間、靜態分析和整個程序的優化問題,對于 Dart 來說運行時方法并不現實。

所以最終 Dart 團隊決定,由于宏的性能具體目標還太遙遠,團隊決定把當前的實現回歸到編輯(例如靜態分析和代碼完成)和增量編譯(熱重載的第一步)上

具體在于重新投資Dart 中的數據支持**,因為這也是Dart & Flutter issue 里請求最多的問題,事實上一開始 Dart 對宏支持的主要動機也是提供更好的數據序列化和反序列化,但是目前看來,通過更多定制語言功能來實現這一點更加實際。

另外通過縮短構建時間和整體代碼生成體驗來彌補宏的確實,也是未來目標之一,目前 Dart 已經確定了 build_runner 的改進支持。

另外還計劃提供 augmentations 功能,這是作為宏的一部分制作原型的功能,例如增加修飾符 augment 作為擴充聲明,而該功能也是獨立的部份,并將改進現有的代碼生成。

通過 augment 實現將一個功能部署到多個文件里,同時可以添加新的頂級聲明,將新成員注入類,并將函數和變量包裝在其他代碼中。

相信宏支持停止這個消息會讓大家感到失望,盡管從長遠來看 Dart 仍然對通用元編程感興趣,因為它在數據之外還有許多潛在的用例,但是在短期之內,Dart 應該是不會發布宏支持。

對于包開發者來說,比如之前的 equatable 在 3.0.0-dev.1 就發布過宏的實驗性版本,體驗還不錯,但是現在看來只能繼續“實驗”下去。

最后,祝大家 2025 新春快樂~

參考鏈接

  • https://medium.com/dartlang/an-update-on-dart-macros-data-serialization-06d3037d4f12
  • https://github.com/dart-lang/build/issues/3800

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/67667.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/67667.shtml
英文地址,請注明出處:http://en.pswp.cn/web/67667.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

計算機組成原理——存儲系統(一)

在人生的道路上,成功與失敗交織成一幅豐富多彩的畫卷。不論我們是面對勝利的喜悅,還是遭遇失敗的痛苦,都不能放棄對夢想的追求。正是在這種追求中,我們不斷地超越自我,不斷地突破自己的極限。只有勇往直前,…

前端知識速記:節流與防抖

前端知識速記:節流與防抖 什么是防抖? 防抖是一種控制事件觸發頻率的方法,通常用于處理用戶頻繁觸發事件的場景。防抖的核心思想是將多個連續觸發事件合并為一個事件,以減少執行次數。它在以下場景中特別有效: 輸入…

無人機圖傳模塊 wfb-ng openipc-fpv,4G

openipc 的定位是為各種模塊提供底層的驅動和linux最小系統,openipc 是采用buildroot系統編譯而成,因此二次開發能力有點麻煩。為啥openipc 會用于無人機圖傳呢?因為openipc可以將現有的網絡攝像頭ip-camera模塊直接利用起來,從而…

藍橋杯例題一

不管遇到多大的困難,我們都要堅持下去。每一次挫折都是我們成長的機會,每一次失敗都是我們前進的動力。路漫漫其修遠兮,吾將上下而求索。只有不斷努力奮斗,才能追逐到自己的夢想。不要害怕失敗,害怕的是不敢去嘗試。只…

【JavaEE進階】圖書管理系統 - 壹

目錄 🌲序言 🌴前端代碼的引入 🎋約定前后端交互接口 🚩接口定義 🍃后端服務器代碼實現 🚩登錄接口 🚩圖書列表接口 🎄前端代碼實現 🚩登錄頁面 🚩…

【算法設計與分析】實驗8:分支限界—TSP問題

目錄 一、實驗目的 二、實驗環境 三、實驗內容 四、核心代碼 五、記錄與處理 六、思考與總結 七、完整報告和成果文件提取鏈接 一、實驗目的 掌握分支界限求解問題的思想;針對不同的問題,能夠利用分支界限法進行問題拆分和求解以及時間復雜度分析…

【3】阿里面試題整理

[1]. ES架構,如何進行路由以及選主 路由:在Elasticsearch(ES)中,默認的路由算法是基于文檔的_id。具體來說,Elasticsearch會對文檔的_id進行哈希計算,然后對分片數量取模,以確定該文…

【Linux】opencv在arm64上提示找不到libjasper-dev

解決opencv在arm64上提示找不到libjasper-dev的問題。 本文首發于?慕雪的寒舍 問題說明 最近我在嘗試編譯opencv,安裝依賴項libjasper1和libjasper-dev的時候就遇到了這個問題。在amd64平臺上,我們可以通過下面的命令安裝(ubuntu18.04&…

【數據結構】_時間復雜度相關OJ(力扣版)

目錄 1. 示例1:消失的數字 思路1:等差求和 思路2:異或運算 思路3:排序+二分查找 2. 示例2:輪轉數組 思路1:逐次輪轉 思路2:三段逆置(經典解法) 思路3…

基于微信小程序的電子商城購物系統設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導,歡迎高校老師/同行前輩交流合作?。 技術范圍:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容:…

【linux】Linux 常見目錄特性、權限和功能

目錄特性默認權限主要功能/用途/根目錄,所有目錄的起點755文件系統的頂層目錄,包含所有其他子目錄和文件/bin基礎二進制命令目錄(系統啟動和修復必需的命令)755存放所有用戶可用的基本命令(如 ls, cp, bash 等&#xf…

docker直接運行arm下的docker

運行環境是樹莓派A 處理器是 arm32v6 安裝了docker,運行lamp 編譯安裝php的時候發現要按天來算,于是用電腦vm下的Ubuntu系統運行arm的docker 然后打包到a直接導入運行就可以了 第一種方法 sudo apt install qemu-user-static 導入直接運行就可以了…

計算機網絡一點事(22)

地址解析協議ARP ARP:查詢Mac地址 ARP表(ARP緩存):記錄映射關系,一個數據結構,定期更新ARP表 過程:請求分組,響應分組 動態主機配置協議DHCP 分配IP地址,配置默認網關…

tomcat核心組件及原理概述

目錄 1. tomcat概述 1.1 概念 1.2 官網地址 2. 基本使用 2.1下載 3. 整體架構 3.1 核心組件 3.2 從web.xml配置和模塊對應角度 3.3 如何處理請求 4. 配置JVM參數 5. 附錄 1. tomcat概述 1.1 概念 什么是tomcat Tomcat是一個開源、免費、輕量級的Web服務器。 Tomca…

科技快訊 | OpenAI首次向免費用戶開放推理模型;特朗普與黃仁勛會面;雷軍回應“10后小學生深情表白小米SU7”

不用開口:谷歌 AI 幫你致電商家,價格、預約一鍵搞定 谷歌在1月30日推出Search Labs中的“Ask for Me”實驗性功能,用戶可利用AI代替自己致電商家咨詢價格和服務。該功能已與美汽車修理廠和美甲沙龍店合作,用戶需加入Search Labs并…

帆軟 FCA -業務分析師認證學習

帆軟 FCA -業務分析師認證學習 認證概述 適合人群 企業中有需求管理、指標梳理、業務邏輯梳理、項目規劃等需求的人員,想提升綜合數據能力、推進數據應用落地的業務/IT骨干。 具體-FCA-業務分析理論 考試要求: FCA-業務分析理論考試- 費用&#xff1a…

Vue.js路由管理與自定義指令深度剖析

Vue.js 是一個強大的前端框架,提供了豐富的功能來幫助開發者構建復雜的單頁應用(SPA)。本文將詳細介紹 Vue.js 中的自定義指令和路由管理及導航守衛。通過這些功能,你可以更好地控制視圖行為和應用導航,從而提升用戶體驗和開發效率。 1 自定義指令詳解 1.1 什么是自定義…

Maya軟件安裝步驟與百度網盤鏈接

軟件簡介: MAYA軟件是Autodesk旗下的著名三維建模和動畫軟件。maya軟件功能更為強大,體系更為完善,因此國內很多的三維動畫制作人員都開始轉向maya,maya軟件已成為三維動畫軟件的主流。 百度網盤鏈接: https://pan.baidu.com/s…

kamailio的部分模塊的解釋及代碼示例【文章由DeekSeek大模型提供】

以下是 Kamailio 中這些模塊的詳細說明及示例代碼: 1. tls.so 作用:提供 TLS 支持,用于加密 SIP 通信。示例:loadmodule "tls.so" modparam("tls", "certificate", "/etc/kamailio/tls/serve…

深入理解linux中的文件(上)

1.前置知識: (1)文章 內容 屬性 (2)訪問文件之前,都必須打開它(打開文件,等價于把文件加載到內存中) 如果不打開文件,文件就在磁盤中 (3&…