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 的长期稳定性和极少的破坏性变更受到广泛赞赏,不过在某些地区,工作机会被认为有限。