Erlang/OTP 26

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

Erlang/OTP 26 亮点 博客文章

docker run -it erlang:26

亮点

Parsetools

  • Leex 已扩展,支持可选的列号。

Stdlib

  • 模块 lists 中的枚举函数系列已扩展,其中包含 enumerate/3,它允许提供步长值。
  • 将 Unicode 更新到版本 15.0.0。
  • proc_lib:start*/* 在启动进程失败时变为同步。这要求失败的进程使用新的函数 proc_lib:init_fail/2,3 或退出以指示失败。所有 OTP 行为都已修复为执行此操作。

Shell

Erlang shell 中有很多新功能和改进

  • 自动完成变量、记录名称、记录字段名称、映射键、函数参数类型和文件名。
  • 在 shell 中打开外部编辑器以编辑当前表达式。
  • 在 shell 中定义记录(带有类型)、函数、规范和类型。

新终端

  • TTY/终端子系统已重写。Windows 用户会注意到 erl.exe 具有与普通 Unix shell 相同的功能,并且 werl.exe 只是 erl.exe 的符号链接。这使得 Windows Erlang 终端体验与 Unix 相同。

编译器和 JIT 优化

  • 已优化创建和匹配具有固定大小段的二进制文件。

  • 已优化创建和匹配 UTF-8 段。

  • 已优化追加到二进制文件。

  • 编译器和 JIT 现在为创建小映射生成更好的代码,其中所有键都是编译时已知的文字。

  • 由于上述优化,base64 模块的性能已得到显着提高。例如,在带有 JIT 的 x86_64 系统上,编码和解码的速度几乎是 Erlang/OTP 25 的三倍。

映射

  • 现在已实现 EEP 58 中建议的映射推导。

  • 通过更改原子键的内部排序顺序,已优化了一些映射操作。这会改变小映射中原子键的(未记录的)打印顺序以及 maps:to_list/1maps:next/1 返回的顺序。新顺序是不可预测的,并且可能在 Erlang VM 的不同调用之间发生变化。

  • 引入新的函数 maps:iterator/2 用于创建迭代器,该迭代器以确定性顺序返回映射元素。io:format() 格式字符串中也有新的修饰符 kK 来支持以排序方式打印映射元素。

Dialyzer

  • 添加了新的内置类型 dynamic(),该类型在 EEP 61引入 EEP 61 的 PR 中引入,改进了对逐步类型检查器的支持。

  • Dialyzer 具有新的增量模式,可以通过在运行 Dialyzer 时给出 --incremental 选项来调用它。这种新的增量模式很可能会在将来的版本中成为默认模式。

Misc ERTS、Stdlib、内核、编译器

  • 现在默认情况下启用多 时间扭曲模式。这假设系统上执行的所有代码都是 时间扭曲安全的

  • 支持 NIF 接口中的 UTF-8 原子和字符串,包括新的函数 enif_make_new_atomenif_make_new_atom_lenenif_get_string_length

  • BIF min/2max/2 现在允许在保护和匹配规范中使用。

  • 改进了选择性接收优化,现在可以为从其他函数返回的引用启用它。这极大地提高了 gen_server:send_request/3gen_server:wait_response/2 和类似函数的性能。

  • 新的跟踪功能 call_memory。类似于 call_time 跟踪,但不是测量跟踪函数中累积的时间,而是测量跟踪函数消耗的累积堆空间。它可以用来比较不同的函数对触发垃圾收集的贡献程度。

  • 不再需要在运行时系统中启用功能才能加载使用它的模块。在编译时在编译器中启用该功能就足够了。

  • inet:setopts/2 有 3 个新选项:reuseportreuseport_lbexclusiveaddruse

  • 修复了在使用 JIT 时将 -fno-omit-frame-pointer 应用于所有 Erlang VM 的问题,以便诸如 perf 之类的工具可以爬取进程堆栈。

  • lists 模块中,zip 函数系列现在接受选项以允许处理不同长度的列表。

  • 添加了 zip:zip_get_crc32/2 函数以从打开的 ZIP 存档中检索 CRC32 校验和。gen_server 通过缓存回调函数进行了优化

  • Erlang DNS 解析器 inet_res 模块和辅助模块已更新为 RFC6891;以处理带有 DNSSEC OK (DO) 位的 OPT RR。

  • 引入 application:get_supervisor/1

  • 缓存 OTP 启动代码路径,以限制在模块查找期间访问的文件夹数量。可以使用 -cache_boot_path false 禁用。

SSL

  • 将客户端默认 verify 选项更改为 verify_peer注意,这使得必须同时提供受信任的 CA 证书或显式将 verify 设置为 verify_none。这在使用在 TLS 版本前 TLS-1.3 中定义的所谓匿名测试密码套件时也适用。

  • SSL 应用程序已添加对内核 TLS (kTLS) 的支持,用于 TLS 分发 (-proto_dist inet_tls),SSL 选项 {ktls, true}
  • 改进了 ssl 选项的错误检查和处理。
  • 通过降低最大握手大小来减轻来自大型证书链的内存使用。这不会影响常见情况,如果需要,可以将其配置为更高的值。

  • 出于安全原因,SHA1DSA 算法不再是默认值中的算法。

  • 添加 use_srtp hello 扩展的编码和解码以方便 DTLS 用户实现 SRTP 功能。

感谢所有贡献者!