亮点
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/1
和maps:next/1
返回的方式。新的顺序是不可预测的,并且可能在 Erlang VM 的不同调用之间发生变化。 -
引入新函数
maps:iterator/2
以创建迭代器,该迭代器以确定性的顺序返回映射元素。io:format()
中的格式字符串也有新的修饰符k
和K
来支持按顺序打印映射元素。
Dialyzer
-
添加了 EEP 61 中引入的新内置类型
dynamic()
,引入 EEP 61 的 PR 改进了对渐进式类型检查器的支持。 -
Dialyzer 有一个新的增量模式,可以通过在运行 Dialyzer 时提供
--incremental
选项来调用。这种新的增量模式很可能在未来的版本中成为默认模式。
其他 ERTS、Stdlib、Kernel、编译器
-
支持 NIF 接口中的 UTF-8 原子和字符串,包括新函数
enif_make_new_atom
、enif_make_new_atom_len
和enif_get_string_length
。 -
现在允许在保护和匹配规范中使用 BIF
min/2
和max/2
。 -
改进了选择性接收优化,现在可以为从其他函数返回的引用启用该优化。这大大提高了
gen_server:send_request/3
、gen_server:wait_response/2
和类似函数的性能。 -
新的跟踪功能
call_memory
。类似于call_time
跟踪,但不是测量跟踪函数中的累积时间,而是测量跟踪函数消耗的累积堆空间。它可用于比较不同的函数对触发垃圾回收的贡献程度。 -
不再需要在运行时系统中启用某项功能才能加载正在使用它的模块。只需在编译时在编译器中启用该功能就足够了。
-
inet:setopts/2
有 3 个新选项:reuseport
、reuseport_lb
和exclusiveaddruse
。 -
修复了当使用 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 1.3 之前的 TLS 版本中定义的所谓匿名测试密码套件时,也适用这种情况。 - 已将对内核 TLS (kTLS) 的支持添加到 SSL 应用程序,用于 TLS 分发 (
-proto_dist
inet_tls
) 和 SSL 选项{ktls, true}
。 - 改进了 ssl 选项的错误检查和处理。
-
通过降低最大握手大小来缓解来自大型证书链的内存使用。这不应影响常见情况,如果需要,可以将其配置为更高的值。
-
出于安全原因,
SHA1
和DSA
算法不再是默认值之一。 - 添加了
use_srtp
hello 扩展的编码和解码,以方便DTLS
用户实现SRTP
功能。
非常感谢所有贡献者!