Erlang/OTP 25

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

Erlang/OTP 25 亮点 博客文章

docker run -it erlang:25

亮点

stdlib

  • 新函数 filelib:ensure_path/1 将确保给定路径的所有目录都存在
  • maps 模块中的新函数 groups_from_list/2groups_from_list/3
  • lists 模块中的新函数 uniq/1 uniq/2
  • rand 模块中添加了新的 PRNG,用于快速伪随机数。

compiler, kernel, stdlib, syntax_tools

  • 增加了对可选择功能的支持,如 EEP-60 中所述。功能可以在编译期间使用选项(普通和 +term)启用/禁用到 erlc,以及使用文件中的指令启用/禁用。类似的选项可用于 erl 以启用/禁用运行时允许的功能。新的 maybe 表达式 EEP-49 作为 maybe_expr 功能得到完全支持。

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 安装目录现在可以在文件系统中重新定位。
  • 函数 erlang:float_to_list/2erlang:float_to_binary/2 中添加了一个名为 short 的新选项。此选项创建给定浮点数的最短正确舍入字符串表示形式,该表示形式可以再次转换为相同的浮点数。
  • uri_string 模块中引入了 quote/1unquote/1 函数 - 替换已弃用的函数 http_uri:encodehttp_uri:decode
  • 新的模块 peer 取代了 slave 模块。slave 模块现在已弃用,将在 OTP 27 中删除。
  • global 现在默认情况下会阻止因网络问题导致的重叠分区。这是通过主动断开与报告已失去与其他节点连接的节点的连接来实现的。这将导致形成完全连接的分区,而不是使网络处于具有重叠分区的状态。
    通过将 kernel 配置参数 prevent_overlapping_partitions 设置为 false,可以关闭这种新行为。这样做将保留与 OTP 24 及更早版本相同的行为。
  • gen_servergen_statemgen_eventformat_status/2 回调已弃用,取而代之的是新的 format_status/1 回调。
    新的回调增加了限制和更改比仅限状态更多内容的可能性。
  • timer 模块已现代化并变得更高效,这使得计时器服务器不易过载。timer:sleep/1 函数现在接受任意大的整数。

compiler

  • 已实现 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
  • 更改功能选项和指令的格式以实现更好的一致性。erlc 的选项和 -compile(..) 指令现在具有格式 {feature, feature-name, enable | disable}-feature(..) 现在具有格式 -feature(feature-name, enable | disable)

crypto

  • 添加 crypto:hash_equals/2,这是一个对哈希值的常数时间比较。

ssl

  • 引入一个新的(仍然是实验性的)选项 {certs_keys,[cert_key_conf()]}。有了它,一个证书及其关联密钥的列表可以用于对客户端或服务器进行身份验证。将选择被认为最佳且与连接协商的参数匹配的证书密钥对。

public_key

  • 添加了用于检索操作系统提供的 CA 证书的函数。

dialyzer

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

其他

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