Erlang/OTP 22

此版本的 Erlang/OTP 可以从 源代码 构建或使用 预构建包 为您的操作系统或第三方工具(如 kerlasdf)安装。

Erlang/OTP 22 亮点 博客文章

docker run -it erlang:22

潜在的不兼容性

  • gen_* 行为:如果服务器启用了通过 sys:log/2,3 记录最后 N 条消息的日志,则此日志将包含在终止报告中。
  • reltool:现在可以在 reltool 版本特定配置格式的 rel 元组中包含一个新元素 Opts:{rel, Name, Vsn, RelApps, Opts}。
  • 由 erlang:list_to_pid 和类似函数创建的所有外部 pid/port/ref 现在与来自该节点的具有相同数字的任何其他 pid/port/ref 相等。
  • 从 OTP 22 开始,旧的遗留 erl_interface 库已弃用,将在 OTP 23 中删除。这并不适用于 ei 库。
  • 从 OTP 22 开始,VxWorks 已弃用,将在 OTP 23 中删除。

有关完整列表,请参阅 OTP 22.0 - 潜在的不兼容性

亮点

Erts

  • 支持 Erlang 分布协议将大型信号的有效负载拆分为多个片段。
  • ETS 选项 write_concurrency 现在也影响并提高了有序集表的可扩展性。
  • length/1 BIF 用于一次性计算列表的长度,而不会产生收益,即使列表非常长。现在它在用长列表调用时会产生收益。
  • 引入了一个新的(仍处于实验阶段)模块 socket。它作为 NIF 实现,其理念是尽可能接近 OS 级别的套接字接口。
  • 添加了 NIF 函数 enif_term_type,它通过返回给定项的类型来帮助避免长时间的 enif_is_xyz 序列。这对于序列化项的 NIF(如 JSON 编码器)尤其有用,因为它可以提高性能和可读性。

编译器

  • 编译器已重写为在内部使用基于静态单赋值 (SSA) 的中间表示。新的中间表示使更多优化成为可能。
  • 二进制匹配优化现在适用于比以前更多的情况。
  • 类型优化现在应用于本地函数调用,并且将删除比以前更多的冗余类型测试。
  • 现在可以在 erlc 的命令行上提供所有可以在源文件中提供的编译器选项,并在选项列表中提供。
  • 在 OTP 22 中,HiPE(本机代码编译器)并非完全可用。造成这种情况的原因是二进制匹配的新 BEAM 指令,HiPE 本机代码编译器不支持这些指令。如果使用 +native 选项调用 erlc,并且使用了任何新的二进制匹配指令,编译器将发出警告并生成不包含本机代码的 BEAM 文件。
  • erlc 现在可以自动使用编译服务器,以避免在多文件项目中为要编译的每个文件启动 Erlang 系统。请参阅文档了解如何启用它。(22.1)

标准库

  • Cover 现在使用 counters 模块而不是 ets 来更新计数器。新函数 cover:local_only/0 允许 Cover 在受限制但更快的本地模式下运行。速度的提高将根据被覆盖编译的代码类型而异,例如,编译器测试套件使用新的 Cover 运行速度快两倍以上。
  • 通过 socket 模块提供了一个简单的套接字 API。这是一个低级 API,替换 gen_[tcp udp sctp]。它旨在最终替换 inet 驱动程序。它还提供了一个基本 API,便于实现 TCP、UDP 和 SCTP 之外的其他协议。已知问题是:不支持 Windows 操作系统(目前)、轻微的项泄漏。此功能将在 OTP 22 中被归类为实验性功能。
  • SSL:现在使用新的日志记录 API,包括日志级别和详细的调试日志记录。
  • SSL:对 TLS 1.3 服务器的基本支持,供实验性使用。
  • Crypto:新的 hash_info/1 和 cipher_info/1 函数返回包含有关参数中哈希或密码信息的映射。
  • 实现 uri_string:resolve/{2,3},可用于针对基本 URI 解析 URI 引用。(22.3)