Bend CHANGELOG 深度解读:0.2.0 至 0.2.38 的语法演进、类型系统与编译管线变迁

📅 发布时间:2026/9/13 8:30:02
Bend CHANGELOG 深度解读:0.2.0 至 0.2.38 的语法演进、类型系统与编译管线变迁
Bend CHANGELOG 深度解读0.2.0 至 0.2.38 的语法演进、类型系统与编译管线变迁【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/BendBend 是一个大规模并行的高级编程语言massively parallel, high-level programming language其核心思路是把高层抽象程序直接编译为交互组合子interaction combinator网络交由 HVMHigher-order Virtual Machine并行执行。本文以仓库根目录的 CHANGELOG.md 为骨架逐版本还原 Bend 从 2024 年 5 月首次公开发布0.2.0到 2025 年 2 月0.2.38的完整演进脉络并结合 src/main.rs、src/fun/builtins.bend、src/fun/transform、src/fun/check/type_check.rs 等源码讲清每一项变更背后的设计动机与工程落点。读完本文你将能依据版本号快速定位功能、理解各类语法糖的由来并掌握与当前仓库代码一一对应的命令与内建函数全貌。版本地图九个多月的密集迭代CHANGELOG.md 遵循 Keep a Changelog 的组织格式并明确声明项目当前不遵循特定版本号方案does not currently adhere to a particular versioning scheme即版本号 0.2.x 的小步快跑并不等同于语义化版本中的 patch 概念。从时间线看仓库记录了两个阶段的迭代2024-05-14 至 2024-10-180.2.0 到 0.2.37集中在 2024 年 57 月爆发式演进0.2.00.2.36 密集发布于一个月内随后 0.2.37 于 10 月落地类型系统与 import 系统两大工程。2025-02-230.2.38以 match 类型统一、不可达规则警告与有符号数字解析修复收尾。其中 0.2.31 在变更记录中缺失属于跳号发布。整个文件将每条变更对应到 GitHub issue/PR 编号如[gh-736]便于回溯原始讨论这种变更可追溯的组织方式本身也是本仓库工程规范的一部分。起点0.2.0 首次公开与命名史0.2.02024-05-14是 Bend 的首次公开发布Initial public release。此后的版本号变更背后有一段命名演进史0.2.3 将包名重命名为bend-lang并改用 crates.io 上发布的 HVM 依赖0.2.4 为适配 hvm-core 发布新版本0.2.7 引入 Apache-2.0 License仓库根目录现存 LICENSE-APACHE。这三个版本说明 Bend 在诞生初期即完成了语言包独立发布 HVM 运行时解耦 开源协议落地三件工程基础工作。语法层的持续演进注释系统从//到#再到多行注释0.2.2 将注释符号从//改为#0.2.37 新增多行注释#{ ... #}语法[#595]。当前仓库中 src/fun/builtins.bend 开头的#{ ... #}注释块即为该语法的直接使用证据测试用例 tests/golden_tests/parse_file/multi_line_comment.bend 覆盖了多行注释的解析路径。关键字与语法糖的更名轨迹CHANGELOG 记录了一组关键字演进理解它们有助于阅读历史代码版本变更语义0.2.2更新 Lambda 语法与内建构造器名称函数式核心语法定型0.2.5bend语句中的go更名为fork显式表达并行分支语义0.2.12函数式语法data关键字改为type数据类型定义统一为type0.2.26do关键字改为with并新增wrap别名单子/状态传递块语法改名0.2.27with子句改为接收一个 bind 和一个参数with 块签名规范化其中bend与fork的语法在 src/imp/parser.rs 的parse_bend约 L955中有完整实现与bend对应的函数式去糖由 src/fun/transform/desugar_bend.rs 的desugar_bend完成with块的去糖则由 src/fun/transform/desugar_with_blocks.rs 负责。运算符与数字体系0.2.5新增幂运算符**0.2.11新增位左移与位右移0.2.15修复幂运算exponentiation的误编译[#444]0.2.34新增小于等于与大于等于数字运算符[#451]0.2.36改进十六进制与二进制浮点数字面量解析[#648]0.2.38修复括号(之后的有符号数字i24 与 f24解析问题[#748]。数字体系在 0.2.10 有一次底层重构数字改用新的 HVM 数字操作格式规则定义收敛为单一代码块Rules definition to be in a single block。当前源码中i24/f24/u24的类型与转换函数可参见 src/fun/builtins.bend 中hvm f24/to_u24、hvm i24/to_u24、hvm u24/to_f24、hvm f24/to_i24等原生定义它们正是 0.2.36 新增的to_f24、to_u24、to_i24数字转换 builtins 的底层实现[#582]。函数式与命令式语法特性的扩充Bend 同时提供函数式equational与命令式imperative两套语法CHANGELOG 中两者的特性交替落地elif 链0.2.24 在命令式语法中引入elif链[#427]0.2.36 将elif链扩展到函数式语法[#596]。解析实现见 src/fun/parser.rs 中try_parse_keyword(elif)循环。列表推导0.2.11 加入列表推导List comprehension。mapper 语句0.2.28 支持 mapper 语句[#465]用于对容器内所有元素并行应用函数测试见 tests/golden_tests/desugar_file/mapper_syntax.bend。局部定义0.2.36 同时为命令式与函数式语法加入局部定义[#562]其去糖与作用域处理涉及 src/fun/transform/lift_local_defs.rs。Record 类型与解构0.2.2 加入记录类型与解构0.2.6 加入简单的元组tuple读回readback0.2.37 放宽元组语法部分场景不再强制要求括号[#554]。分支语句收尾0.2.37 允许分支branch以 ask 语句结尾[#629]并改进分支语句的错误消息[#464]。fold 的显式状态传递0.2.2 起要求 fold 显式传递状态配合 0.2.36 对bend/fold语法提取出的函数保留 builtin 属性保证内建函数经去糖后依然被识别。命令式语法的细节约束还包括0.2.1 要求return后必须换行0.2.6 要求 list 类内建字面量使用逗号分隔0.2.36 禁止使用 Tab 进行缩进或对齐[#463]。里程碑0.2.37 的类型系统与 import 系统0.2.372024-10-18是整份 CHANGELOG 中分量最重的一个版本它同时引入了两个改变工程形态的能力类型系统新增 Bend 的类型系统[#615]、[#679]对应文档为 docs/type-checking.md修复类型检查器未正确统一 match 表达式各分支类型的问题[#734]于 0.2.38 完成新增模式匹配函数中规则不可达时发出警告[#736]0.2.38。类型检查在源码中的落点是 src/fun/check/type_check.rs 的type_check方法配套的 src/fun/check 目录还包含unbound_refs.rs、unbound_vars.rs、shared_names.rs、set_entrypoint.rs等语义检查模块。CLI 层面对应 src/main.rs 的-O TypeCheck/-O NoTypeCheck编译选项测试用例见 tests/golden_tests/check_file 目录下的fail_type_bad_rec_fn_adt.bend、type_err_match_arm.bend等。import 系统新增 import 系统[#544]支持跨文件复用定义修复导入的构造器未更新为 Constructor 表达式的问题[#674]新增输入文件不存在的错误消息[#513]。import 系统在源码中的实现位于 src/imports 目录book.rs负责递归加载与合并、loader.rs与packages.rs负责按路径加载包入口为DefaultLoader。0.2.38 又修复了 import 与类型检查相关的若干问题例如float_combinatorspass 生成的函数引用在 main 函数中的展开[#642]、main 函数内构造器中的引用展开[#643]。IO 与内建函数库的扩张IO 能力是 Bend 从纯计算语言走向可实用语言的关键CHANGELOG 记录了三条扩张主线全部可在 src/fun/builtins.bend 中找到现行实现。0.2.16首批 IO builtins0.2.16 引入首批IObuiltins。由于彼时数量有限这奠定了IO/命名空间的组织方式。0.2.36文件系统、终端与数学库0.2.36 是 IO 大规模落地的一版原始文件 IOIO/FS/{read, write, seek, open, close}[#573]以及工具函数IO/FS/{read_file, write_file, read_line, read_to_end}[#578]与IO/FS/flush[#598]终端 IOIO/print输出到 stdout、IO/input从 stdin 读取一行[#579]睡眠IO/sleep按秒f24睡眠[#581]并将旧 builtinsleep重命名为IO/nanosleep编码解码Bytes/{decode_utf8, decode_ascii}、String/{encode_ascii, decode_ascii}、Utf8/{decode_character, REPLACEMENT_CHARACTER}[#580]其中Bytes/decode_utf8与Bytes/decode_ascii后续被重命名为String/decode_utf8与String/decode_ascii数学库新增Mathbuiltins[#570]并将log、atan2重命名为Math/log、Math/atan2避免顶层命名冲突数字转换to_f24、to_u24、to_i24[#582]列表工具List/{length, reverse, flatten, concat}HVM 原生定义新增一类用于书写原生 HVM 定义的顶层定义[#586]即 builtins 文件中hvm前缀定义如hvm f24/to_u24 - (f24 - u24):。0.2.37Result 化与动态库IO 函数全部改为返回Result[#657]当前 src/fun/builtins.bend 中IO/FS/open、IO/FS/read、IO/input等签名均为IO(Result(...))形态是这次 API 变更的直接证据新增动态库加载三件套IO/DyLib/open、IO/DyLib/call、IO/DyLib/close[#621]让 Bend 程序可以按路径打开共享库并按函数名调用 C 符号新增List/filter与String/{equals, filter}builtinsList/filter与String/equals的定义见 src/fun/builtins.bend 顶部。0.2.38行尾 EOF 修复0.2.38 修复了 IO/FS/read_line 在行尾遇到 EOF 时的行为[#638]保证最后一行无换行符也能正确读回。编译管线与后端集成CHANGELOG 中大量条目指向编译管线与 HVM 后端的演进这部分与 src/main.rs 的 CLI 结构一一对应。内部表示HVM 语法树0.2.21 起编译器内部改用 HVM 语法树表示 inets[#475]0.2.23 修复了迁移到 HVM 语法树后gen-cu与gen-c命令的问题。对应 CLIgen-c/gen-cu/gen-hvm分别输出 C、Cuda、HVM 代码到 stdout内部流程是先经compile_book产出 HVM book再调用hvm_bin的gen-c/gen-cu子命令生成目标代码见 src/main.rs 的gen_cmd逻辑。编译优化 pass 的增删改0.2.33实现expand_mainpass在入口函数中展开引用[#424]同时float_combinatorspass 不再在入口函数中提取组合子。对应源码 src/fun/transform/expand_main.rs 与 src/fun/transform/float_combinators.rs。0.2.30不再展开生成的递归定义[#502]。0.2.14net 层的 eta-reduction pass 不再归约数字节点源码见 src/hvm/eta_reduce.rs。0.2.16修复 definition pruning 变换源码 src/fun/transform/definition_pruning.rs。0.2.20/0.2.18修复 map getters 的生成嵌套场景与 setter 内场景相关实现见 src/imp/gen_map_get.rs。CLI 中-O选项可逐一开关这些 passEta/NoEta、Prune/NoPrune、FloatCombinators/NoFloatCombinators、Merge/NoMerge、Inline/NoInline、LinearizeMatches系列、AdtScott/AdtNumScott等src/main.rs 的OptArgsgolden 测试 tests/golden_tests/cli 中的compile_all.args、desugar_float_combinators.args、desugar_linearize_matches.args等即是这些开关的回归验证。net-size 检查的演变0.2.8提高最大 net sizecheck-net-size变为可选0.2.10默认禁用 net-size 检查。当前对应-O CheckNetSize/-O NoCheckNetSize选项与 src/hvm/check_net_size.rs 实现测试用例 tests/golden_tests/cli/net_size_too_large.args 与no_check_net_size.args验证了两种开关的行为差异。命令体系run-rs / run-c / run-cu0.2.36 做了 CLI 语义调整bend run改为指向bend run-rs的旧命令让位bend run默认使用 C 实现的 HVMRust 实现则通过bend run-rs显式调用[#620]。这在 src/main.rs 中可直接验证RunRs注释为用 Rust HVM 实现编译运行RunC声明了#[command(alias run)]即bend run是run-c的别名另有RunCu对应 Cuda 实现内部run_cmd分别映射为runRS、run-cC、run-cuCuda。自定义 HVM 二进制0.2.29 支持自定义 HVM 二进制[#479]。当前 CLI 提供--hvm-bin参数指定 HVM 命令或路径解析优先级为CLI 选项 环境变量HVM_BIN 默认命令hvm见 src/main.rs 的hvm_bin解析逻辑。工具链基础0.2.22 将 Rust 工具链从 nightly 迁移到 stable[#486]大幅降低构建门槛当前仓库的 Cargo.toml 即为 stable Rust 工程。名称与规范约束CHANGELOG 记录了几条命名约束体现编译器对可混淆名称的防御0.2.17顶层名称不允许以//开头[#443]测试见 tests/golden_tests/compile_file/top_level_name_slashslash.bend0.2.19变量名不允许包含__[#478]0.2.36改进类型与对象重定义时的错误消息[#485]新增重复字段名错误消息0.2.37不再对未使用的生成定义发出警告[#514]修复不可反驳模式优化时的变量绑定问题[#618]修复局部定义去糖[#623]0.2.38为不可达的模式匹配规则增加告警[#736]。这些约束与告警共同服务于诊断系统0.2.37 对诊断系统与解析器进行了一次重构[#673]使其能输出更多错误与警告并引入-W/-D/-A三类告警控制WarningArgs枚举支持UnreachableMatch、RedundantMatch、IrrefutableMatch、UnusedDefinition等类别见 src/main.rs。其他值得关注的细节0.2.32实现内建Tree数据类型与![]、!字面量语法[#528]。当前解析器在 src/fun/parser.rs 中将![a b]解析为Tree/Node调用仅允许两个子节点Tree/Node名称常量定义于 src/fun/builtins.rsTree上还提供Tree/Node与Tree/Leaf的配套操作见 src/fun/builtins.bend 中case Tree/Node分支。0.2.25支持生成构造器标签[#512]即由编译器为 ADT 构造器自动生成 tag配合 src/fun/transform/encode_adts.rs 等 ADT 编码 pass 使用。0.2.29让带自由变量的 continuation 延迟执行使单子块monadic blocks惰性化[#526]。0.2.2新增字符串读回String readback0.2.3新增列表读回List readback0.2.6新增元组读回。三者共同构成 readback 阶段的类型化输出能力。0.2.35带 bind 模式的 lambda 项显示为let项[#466]这是展示层src/fun/display.rs的可读性改进。0.2.38不可达规则警告[#736]与 match 分支类型统一修复[#734]补全了类型系统最后一块拼图。结语从 CHANGELOG 看 Bend 的设计取舍纵览 0.2.0 至 0.2.38Bend 的演进呈现出清晰的三个阶段语法定型期0.2.00.2.15关键词更名、运算符补齐、parser 打磨、能力扩张期0.2.160.2.36IO、文件系统、数学库、动态库、Tree、mapper 等 builtins 与语法糖大量落地、工程化完备期0.2.370.2.38类型系统、import 系统、诊断系统重构与告警机制。与之配套的编译管线从直接生成 HVM演进为HVM 语法树中间表示 可逐项开关的优化 pass 多后端C/Cuda/Rust代码生成最终形成了 src/main.rs 中check、desugar、gen-hvm、gen-c、gen-cu、run-rs、runC、run-cu的完整命令矩阵。对于正在阅读源码的开发者这份 CHANGELOG 既是功能索引也是调试线索遇到某条语法或内建函数时先在 CHANGELOG 中找到引入它的版本再循着 issue 编号与本节给出的源码路径src/fun、src/imp、src/imports、src/hvm、tests/golden_tests深入对应实现即可快速建立变更 → 代码 → 测试的完整认知链。【免费下载链接】BendA massively parallel, high-level programming language项目地址: https://gitcode.com/GitHub_Trending/be/Bend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考