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.mzph.cn/web/67667.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

无人机图传模块 wfb-ng openipc-fpv,4G

openipc 的定位是为各种模块提供底层的驱动和linux最小系统,openipc 是采用buildroot系统编译而成,因此二次开发能力有点麻烦。为啥openipc 会用于无人机图传呢?因为openipc可以将现有的网络摄像头ip-camera模块直接利用起来,从而…

【JavaEE进阶】图书管理系统 - 壹

目录 🌲序言 🌴前端代码的引入 🎋约定前后端交互接口 🚩接口定义 🍃后端服务器代码实现 🚩登录接口 🚩图书列表接口 🎄前端代码实现 🚩登录页面 🚩…

【算法设计与分析】实验8:分支限界—TSP问题

目录 一、实验目的 二、实验环境 三、实验内容 四、核心代码 五、记录与处理 六、思考与总结 七、完整报告和成果文件提取链接 一、实验目的 掌握分支界限求解问题的思想;针对不同的问题,能够利用分支界限法进行问题拆分和求解以及时间复杂度分析…

【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、大数据、物联网、机器学习等设计与开发。 主要内容:…

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…

帆软 FCA -业务分析师认证学习

帆软 FCA -业务分析师认证学习 认证概述 适合人群 企业中有需求管理、指标梳理、业务逻辑梳理、项目规划等需求的人员,想提升综合数据能力、推进数据应用落地的业务/IT骨干。 具体-FCA-业务分析理论 考试要求: FCA-业务分析理论考试- 费用&#xff1a…

Maya软件安装步骤与百度网盘链接

软件简介: MAYA软件是Autodesk旗下的著名三维建模和动画软件。maya软件功能更为强大,体系更为完善,因此国内很多的三维动画制作人员都开始转向maya,maya软件已成为三维动画软件的主流。 百度网盘链接: https://pan.baidu.com/s…

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

1.前置知识: (1)文章 内容 属性 (2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中) 如果不打开文件,文件就在磁盘中 (3&…

一个用于测试的 HL7 Server

说明 一个用于测试的 HL7 Server。在过NIST的认证时,需要演示检验数据通过HL7进行传输,所以写了这工具。 HL7的消息解析和编码使用了NHapi。包含两个服务: ReceiveServiceSendService 这2个服务都继承自 BaseService public class BaseSe…

洛谷题目 P5994 [PA 2014] Kuglarz 题解 (本题较难)

题目传送门: P5994 [PA 2014] Kuglarz - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 前言: 本题涉及到最小生成树中的 kruskal 算法和并查集算法,图论基础概念两大知识点,瞎按对莱索没有学过图论的或最小生成树的可能会对这道…

消息队列篇--通信协议篇--网络通信模型(OSI7层参考模型,TCP/IP分层模型)

一、OSI参考模型(Open Systems Interconnection Model) OSI参考模型是一个用于描述和标准化网络通信功能的七层框架。它由国际标准化组织(ISO)提出,旨在为不同的网络设备和协议提供一个通用的语言和结构,以…

C# Winform制作一个登录系统

using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;namespace 登录 {p…

记一次STM32编译生成BIN文件过大的问题(基于STM32CubeIDE)

文章目录 问题描述解决方法更多拓展 问题描述 最近在一个项目中使用了 STM32H743 单片机(基于 STM32CubeIDE GCC 开发),它的内存分为了 DTCMRAM RAM_D1 RAM_D2 …等很多部分。其中 DTCM 的速度是比通常的内存要快的,缺点是不支持…

996引擎 -地图-添加安全区

996引擎 -地图-添加安全区 文件位置配置 cfg_startpoint.xls特效效果1345参考资料文件位置 文件位置服务端D:\996M2-lua\MirServer-lua\Mir200客户端D:\996M2-lua\996M2_debug\dev配置 cfg_startpoint.xls 服务端\Mir200\Envir\DATA\cfg_startpoint.xls 填歪了也有可能只画一…

【leetcode强化练习·二叉树】同时运用两种思维解题

本文参考labuladong算法笔记[【强化练习】同时运用两种思维解题 | labuladong 的算法笔记] 有的题目可以同时用「遍历」和「分解问题」两种思路来解,你可以利用这些题目训练自己的思维。 559. N 叉树的最大深度 | 力扣 | LeetCode | 给定一个 N 叉树,…

栈和队列特别篇:栈和队列的经典算法问题

图均为手绘,代码基于vs2022实现 系列文章目录 数据结构初探: 顺序表 数据结构初探:链表之单链表篇 数据结构初探:链表之双向链表篇 链表特别篇:链表经典算法问题 数据结构:栈篇 数据结构:队列篇 文章目录 系列文章目录前言一.有效的括号(leetcode 20)二.用队列实现栈(leetcode…

ios swift画中画技术尝试

继上篇:iOS swift 后台运行应用尝试失败-CSDN博客 为什么想到画中画,起初是看到后台模式里有一个picture in picture,去了解了后发现这个就是小窗口视频播放,方便用户执行多任务。看小窗口视频的同时,可以作其他的事情…

人生不止于职业发展

0 你的问题,我知道! 工作意义是啥?职业发展在人生啥角色? 1 工作意义 农村人努力学习考上大学,得好工作,为逃离同村同龄人十几岁就工厂打工命运,过不凡人生,实现改命的唯一途径。…