OTP 25 候选版本 1

2022年2月16日 · 作者 Kenneth Lundin

OTP 25-rc1 #

Erlang/OTP 25-rc1 是 OTP 25.0 发布之前的三个候选版本中的第一个。

此版本的目标是从用户那里获得反馈。我们欢迎所有反馈,即使只是说它对您有效。我们鼓励用户试用并向我们提供反馈,可以通过在此处创建问题 https://github.com/erlang/otp/issues,或发布到 Erlangforums 或邮件列表 [email protected]

此版本的所有工件都可以从 Erlang/OTP Github 版本下载,您可以在 https://erlang.ac.cn/documentation/doc-13.0-rc1/doc/ 查看新文档。您也可以使用 kerl 安装最新版本,如下所示:kerl build 25.0-rc1 25.0-rc1

Erlang/OTP 25 是一个包含新功能、改进以及一些不兼容性的新主要版本。以下突出显示了一些新功能。

非常感谢所有贡献者!

以下是此版本的一些亮点

亮点 #

erts & jit #

  • JIT 现在适用于 64 位 ARM 处理器。
  • JIT 现在基于 BEAM 文件中的类型信息进行基于类型的优化。
  • 改进了 JIT 对 perfgdb 等外部工具的支持,允许它们显示行号,甚至在可以找到时显示原始 Erlang 源代码。

erts, stdlib, kernel #

  • 用户现在可以使用 {write_concurrency, auto} 选项配置 ETS 表。此选项强制表根据检测到的并发程度在运行时自动更改所使用的锁的数量。当 {write_concurrency, auto} 处于活动状态时,默认启用 {decentralized_counters, true} 选项。

    此处提供了将此选项与其他 ETS 优化选项进行比较的基准测试结果:基准测试

  • 为了启用更多优化,在 OTP 21 及更早版本中编译的 BEAM 文件无法在 OTP 25 中加载。
  • 具有进程标志 message_queue_data=off_heap 的进程的信号队列已得到优化,允许从多个进程并行接收信号。当多个进程并行向一个进程发送时,这可以提高性能。 查看基准测试
  • 鉴于安装的 RELEASES 文件中的路径是相对于安装根目录的路径,Erlang 安装目录现在可以在文件系统上重新定位。
  • 一个名为 short 的新选项已添加到函数 erlang:float_to_list/2erlang:float_to_binary/2 中。此选项创建给定浮点数的尽可能短的正确舍入的字符串表示形式,该字符串可以再次转换回相同的浮点数。
  • uri_string 模块中引入 quote/1unquote/1 函数 - 替代已弃用的函数 http_uri:encodehttp_uri:decode
  • 新模块 peer 取代了 slave 模块。slave 模块现在已弃用,将在 OTP 27 中删除。
  • global 现在默认会阻止由于网络问题导致的重叠分区。这是通过主动断开与报告已失去与其他节点连接的节点的连接来实现的。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。

    可以通过将 kernel 配置参数 prevent_overlapping_partitions 设置为 false 来关闭新行为。这样做将保留与 OTP 24 及更早版本相同的行为。

  • 为了支持新的 format_status/1 回调,gen_servergen_statemgen_eventformat_status/2 回调已被弃用。

    新的回调增加了限制和更改许多超出状态本身的能力。

  • timer 模块已实现现代化并提高了效率,这使得定时器服务器不太容易过载。timer:sleep/1 函数现在接受任意大的整数。

编译器 #

  • 已实现 EEP-49 中提出的 maybe ... end 构造。它可以简化复杂的代码,否则必须使用深度嵌套的 case 语句。

    要启用 maybe,请向编译器提供选项 {enable_feature,maybe_expr}。确切的选项将在即将发布的候选版本中更改,届时也可以从正在编译的模块内部使用。

  • 当记录匹配或记录更新失败时,过去会引发 {badrecord, ExpectedRecordTag} 异常。在此版本中,该异常已更改为 {badrecord, ActualValue},其中 ActualValue 是找到的值,而不是预期的记录。
  • 添加编译属性 -nifs(),使编译器和加载器能够了解哪些函数可以被 erlang:load_nif/2 覆盖为 NIF。
  • 改进了二进制语法构造失败时更详细的错误消息。这适用于 shell 中的错误消息和 erl_error:format_exception/3,4

Crypto #

  • 添加 crypto:hash_equals/2,它是散列值的恒定时间比较。

Dialyzer #

  • 优化 erl_types 模块中的操作。并行化 Dialyzer pass remote。
  • 添加了 missing_returnextra_return 选项,以便在规范与推断的类型不同时引发警告。这些选项与 overspecs 和 underspecs 类似,但不如它们那么详细。
  • Dialyzer 现在更好地理解了 min/2max/2erlang:raise/3 的类型。因此,Dialyzer 可能会生成新的警告。特别是,使用 erlang:raise/3 的函数现在可能需要一个带有 no_return() 返回类型的 spec,以避免出现不需要的警告。

其他 #

  • 添加了一个新的 开发 HOWTO 指南,该指南描述了在修复错误或开发新功能时如何构建和测试 Erlang/OTP。
  • 测试已添加到为每个打开的 PR 运行的 Github 操作中,以便在提出错误修复和新功能时更早地捕获更多错误。

有关新功能和潜在不兼容性的更多详细信息,请参阅