Elixir v1.20:现在是一门渐进类型语言
Elixir 1.20 的渐进类型概览
- 渐进类型系统基于“强箭头”和集合论类型(并集、交集、否定)。
- 目前还没有新的表面语法;它从现有构造(模式匹配、守卫)中推断类型。
- 设计目标是在有类型/无类型边界上保持健全性,而不引入运行时转换。生成的字节码在语义上与未加类型的代码相同,因此渐进复杂度不变。
- 未来计划加入注解;类型信息可以通过“强”函数传播,至少在模块内部如此。
性能、Dialyzer 与现有工具
- 多个人表示,升级后真实项目中的编译速度明显更快。
- Dialyzer 的 success typing 被认为在实践中较为有限,尤其是在循环依赖和 protocol 场景下;一些人预计新系统会更有用。
- 仍有人主要把 typespecs 当作文档使用;而且编译器如今往往已经在 Dialyzer 之前发现问题。
动态类型与静态类型之争
- 许多人很兴奋:类型可以“免费”发现真实 bug,提升大型代码库的信心,并且通过更好的约束和错误反馈帮助 AI agent。
- 也有人认为 Elixir/BEAM 的容错能力(“let it crash”、监督树)已经缓解了许多运行时错误;他们很少看到类型错误导致服务中断。
- 有些人认为类型对 Elixir 来说是“不错但小众”的特性;另一些人则说,之前缺乏静态类型让他们一直没认真采用它。
学习曲线、易用性与安全性
- 新手普遍认为 Elixir/Phoenix 很强大,但学习起来很难:大量使用宏、编译期魔法、可选括号以及 keyword-list 语法,经常成为障碍。
- BEAM 概念(进程、监督、重启策略)对一些人来说令人不知所措;也有人分享文章和书籍来弥补这一差距。
- Phoenix LiveView 的安全性存在争论:有人担心被劫持的 websocket 上可以调用任意 handler;也有人强调任何客户端都能发送任意消息,授权必须通过状态和守卫来强制执行,这与 HTTP 类似。
比较与生态
- Gleam 经常被提及:它是完全静态类型、语法类似 Rust,可编译到 BEAM 和 JS,但缺少宏以及 Phoenix/Ecto 的成熟度。
- 有些人更喜欢 Rust/Go/OCaml 提供的“真正”的静态类型和更简单的部署;也有人更看重 BEAM 的并发和容错能力。
- Elixir 的长期稳定性和极少的破坏性变更受到广泛赞赏,不过在某些地区,工作机会被认为有限。