ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

运算符重载提案已撤回?proposal-operator-overloading 项目全解析:从诞生、争议到退场的前因后果

运算符重载提案已撤回?proposal-operator-overloading 项目全解析:从诞生、争议到退场的前因后果 运算符重载提案已撤回proposal-operator-overloading 项目全解析从诞生、争议到退场的前因后果【免费下载链接】proposal-operator-overloading项目地址: https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading在 JavaScript 生态中有一个让不少开发者既熟悉又陌生的名字——proposal-operator-overloading。这是一份由 TC39ECMAScript 标准委员会维护的JavaScript 运算符重载提案目标是让开发者能为自定义类型如 Decimal、向量、矩阵重载 - * /等运算符让代码回归数学直觉。遗憾的是这份提案的最终状态被标记为Withdrawn已撤回。为什么一个看起来如此实用的提案会被撤回它经历了怎样的设计、争议与波折本文将从诞生、方案、争议到退场为你完整还原这段 JavaScript 语言演进史上的「前因后果」。什么是运算符重载JavaScript 为什么需要它先解释概念运算符重载Operator Overloading指允许用户自定义类型复用 - * / 等内置运算符的行为。比如定义了一个Decimal十进制小数类后可以直接写Decimal(1) Decimal(2)而不是调用a.plus(b)。JavaScript 长期以来只提供两种数值类型Number双精度浮点和后来加入的BigInt任意精度整数。开发者真正需要的 decimal、有理数、复数等类型只能通过库和方法链模拟写起来又长又别扭。JavaScript 运算符重载提案正是为了补齐这块能力缺口而生。诞生记JavaScript 运算符重载提案的四个典型使用场景提案作者 Daniel Ehrenberglittledan在项目根目录的README.md中列举了四个核心场景几乎每个都直击日常开发痛点数值类型让 Decimal 回归直觉有了运算符重载Decimal(1) Decimal(2)会直接返回Decimal(3)Decimal(3) * Decimal(2)返回Decimal(6)。相比a.multiply(b)的链式写法这种方式直观太多也让财务计算类库的 API 变得亲切可读。矩阵与向量计算告别方法链JS 越来越多地被用于数据分析和科学计算。向量相加v1 v2、标量乘向量3 * v1这类在其他语言中再自然不过的写法在 JS 里却只能靠方法链模拟。提案让这一切变得可能文档中用Vector类的例子做了完整演示。方程 DSL让公式回归公式以 TensorFlow.js 为例一个多项式回归公式y a * x^3 b * x^2 c * x d在代码里要写成a.mul(x.pow(3)).add(...)一长串方法链旁边还得再写一遍注释。借助运算符重载代码可以直接写成a * x ** 3 b * x ** 2 c * x d连注释都可以省掉CSS 单位计算连样式都能更优雅提案还畅想了 CSS 单位的写法比如CSS.em(3) CSS.px(2)直接得到可用的长度值。配合扩展数字字面量提案CSS 相关的计算表达也能更符合直觉。提案如何设计一套「克制」的运算符重载方案与 C 的随心所欲不同这份提案在设计上相当克制主要体现在三个关键决策1. 只能重载内置运算符不能发明新符号可以重载不可以重载 - * / % **等数学运算符严格相等 \| ^ 等位运算符! \|\|布尔运算 等比较运算符.、()属性访问与调用用 Proxy 代替可能的[]、[]索引访问自定义运算符符号提案明确拒绝用户自定义运算符符号理由是担心 JS 代码出现「标点符号过载」损害整体可读性。2. 通过with operators from显式开启提案设计了with operators from声明后来演变为use: operators装饰器形式只有显式声明开启的代码块才能使用重载避免「一个对象悄悄改变已有代码行为」的隐患。这也是提案强调的可预测性设计目标。3. 基于类的内部槽位分发底层通过[[OperatorSet]]内部槽位和Operators工厂函数实现运算符分发详细机制记录在PROTOSPEC.md中而关于 Python、Ruby、C、Swift、Haskell 等十余种语言重载机制的横向对比可以参考LANGCOMP.md至今仍是了解该领域的最佳入门材料之一。从提案到原型运算符重载 Babel 插件与运行时 shim提案作者还亲自编写了一版可运行的原型实现位于src/目录包含两个 npm 包littledan/plugin-transform-operator-overloading一个 Babel 插件负责把with operators from语法编译成普通 JS。安装配置说明见src/transform/README.md核心逻辑在src/transform/plugin.js。littledan/operator-overloading-shim配套的运行时支持库导出Operators对象及一系列供编译产物调用的辅助函数见src/shim/shim.js与src/shim/README.md。这份原型让开发者可以在真实项目中提前体验提案语法。不过 README 也坦诚说明shim 不追求 100% 规范合规也不追求高性能仅仅是「先把基本场景跑通」的快速原型。运算符重载的争议可读性、性能与可预测性一份提案从 Stage 0 走向 Stage 4 从来不易运算符重载更是踩在无数争议点上⚖️可读性之争C 和 Haskell 常被诟病过度使用晦涩运算符导致代码难读而 Python尤其 NumPy被视为正面典型。提案试图通过「仅内置运算符」「需显式开启」等设计把生态往 Python 的方向引导但能否奏效始终存疑。性能与可实现性提案要求「不拖慢不使用重载的代码」。但with operators from的检查在引擎中很难被优化掉PROTOSPEC.md的实现笔记中也坦承这块开销是否值得需要更多讨论和验证。可预测性与安全提案核心理念是「不能悄悄改变已有代码的行为」但完全做到这一点需要牺牲性能和便利性——这是一个两难权衡。文档甚至在某处标注了「If this is feasible」暗示连作者自己都不确定能否实现。与其他提案的耦合提案早期设想用装饰器Decorators语法定义重载但装饰器提案本身长期不稳定它又与 Records Tuples、Typed Objects、Value Types、扩展数字字面量等多个提案存在潜在关联牵一发动全身。TC39 提案为何被撤回运算符重载退场原因解析最终这份提案的状态被定格为Withdrawn已撤回。从仓库留下的文档看撤回并非单一事件所致而是多重因素叠加的结果TC39 委员会对「运算符重载带来的复杂度、实现工作量和安全面是否值得」始终没有形成共识性能检查开销与可预测性目标之间存在难以调和的矛盾依赖的装饰器等相邻提案迟迟未能定稿[]索引重载、membrane 系统交互等细节问题悬而未决。更关键的是这份提案的定位本身偏「探讨性」——作者在 README 开头就写道本文试图探讨运算符重载在 JS 中「可能的样子」希望用具体方案帮助委员会决定是否值得走这条路。当探讨的结论是「暂不前行」时主动撤回、把完整文档保留在仓库中供后人参考反而是一种负责任的选择。结语运算符重载提案给 JavaScript 留下的遗产虽然提案已撤回但它并非毫无价值。BigInt、Records Tuples、扩展数字字面量等后续提案或多或少继承了这份提案的讨论成果LANGCOMP.md中的跨语言对比、PROTOSPEC.md中的底层机制设计至今仍具参考意义那套 Babel 原型也证明哪怕是被撤回的提案也可以有完整、可运行、可学习的技术示范。如果你对这段历史感兴趣可以克隆仓库亲手翻阅git clone https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading从README.md的提案全文到PROTOSPEC.md的底层机制再到LANGCOMP.md的跨语言对比这份「被撤回的提案」依然是一份高质量的 JavaScript 语言设计教材。运算符重载的故事暂时告一段落但它留下的思考仍在持续影响着 JavaScript 的未来。【免费下载链接】proposal-operator-overloading项目地址: https://gitcode.com/gh_mirrors/pr/proposal-operator-overloading创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表