The Flix 编程语言
一种新的、以函数式为先的语言 Flix 正因其先进的效应系统、基于区域的局部变异以及内嵌 Datalog 而受到关注,目标是在 Haskell 式纯度、低层性能和 JVM 部署之间取得平衡。评论者赞赏其安全保证、强大的类型与效应特性,以及积极的研究路线图(例如代数效应、基于能力的供应链安全),同时也质疑一些有争议的设计选择,例如在语法中使用 `\`、将除以零视为零,以及把未使用代码当作编译期错误。更广泛的讨论重新回到了关于纯函数式编程的实用性、受控变异,以及复杂的研究型语言能否获得主流采用的长期争论。
效应系统与受控变异
- 许多人对 Flix 的代数效应系统和“基于区域的局部变异”印象深刻。
- 这种方式被视为一种在对外保持纯函数、而在内部为了性能或命令式清晰性(例如排序)使用可变状态的手段。
- 常被拿来与 Haskell 的 ST 单子和 F* 的区域分析比较;也有人提到 Koka 和可变值语义是相关想法。
- 一位 Flix 开发者强调,效应系统是核心,必须尽早学习,但它带来了强保证以及未来的安全特性(例如供应链/能力控制)。
函数式编程的吸引力与实用性
- 争论焦点在于 FP 主要是吸引语言爱好者,还是能够解决现实世界的复杂性。
- 支持者认为,纯度和显式效应使推理、重构和测试更容易,尤其是在大规模场景下。
- 批评者认为,严格的纯度和不熟悉的语法限制了 FP 的主流采用;他们更青睐 FP 与命令式/OOP 风格的务实混合。
- 有人认为缺少 GC 会损害系统语言中具备良好可用性的 FP,例如 Rust;也有人反驳说 Rust 仍然通过引用计数类型支持函数式风格。
语法与可用性
- 对
\ IO效应注解的反应不一;有人觉得它难看或像“token 汤”,并建议使用pure/mut之类的关键字。 - 也有人不喜欢
forA和forM这样的命名。 - 关于显著空白的争论:有人希望新语言像 Python 那样;另一些人则强烈偏好显式大括号和对空白不敏感的语法。
除零语义
- 一个有争议的设计选择是:除以零时返回零,而不是报错或返回
Option。 - 支持者指出,这简化了一些代码,并且不会导致形式上的矛盾。
- 批评者担心这会掩盖 bug,并更希望采用显式的
Option/部分运算。
未使用代码作为错误
- 对将未使用的定义/变量视为编译期错误的做法反弹很强,这与 Go/Zig 引发的挫折感相呼应。
- 批评者说,这会妨碍快速原型开发,并在调试期间造成“递归式”的清理工作。
- Flix 的做法是:用前导下划线标记未使用项以消除错误,其理由是未使用代码与 bug 之间存在相关性。
- 有人建议在开发构建中只发出警告,而只在生产环境中报错。
实现、工具与路线图
- 编译器用 Scala 编写;标准库和运行时(包括 Datalog JIT)用 Flix 编写。
- 目标是 Java 11,并在 Java 21 和 Loom 普及后迁移过去。
- 正在积极推进:完全并行且增量式的编译器、可容错的 LSP、代数效应/处理器、将效应与类型类集成,以及包管理(未来带有基于效应的安全性)。
Datalog 与潜在用例
- 内嵌 Datalog 因其对关系建模的声明式能力(前向/后向链式推理)而广受好评。
- 人们认为 Flix 在电子表格、逻辑密集型系统,以及对高级 PL 特性的实验等任务上很有前景。
元话题:新语言 vs. AI 与复杂性
- 有人质疑在以 AI 为中心的未来里开发新语言的价值,认为“英语会成为主语言”。
- 另一些人认为这不现实,强调需要确定性、安全的语言以及持续的 PL 研究。