潜在的不兼容性
- gen_* 行为:如果服务器通过 sys:log/2,3 记录最后 N 条消息的功能处于激活状态,则此日志将包含在终止报告中。
- reltool:现在可以在 reltool 发布特定配置格式的 rel 元组中包含一个新元素 Opts:{rel, Name, Vsn, RelApps, Opts}。
- 所有由 erlang:list_to_pid 和类似函数创建的外部 pid/端口/引用现在与来自同一节点的具有相同编号的任何其他 pid/端口/引用进行比较时相等。
- 旧的遗留 erl_interface 库从 OTP 22 开始已被弃用,并将在 OTP 23 中删除。这不适用于 ei 库。
- VxWorks 从 OTP 22 开始已被弃用,并将在 OTP 23 中删除。
有关完整列表,请参阅 OTP 22.0 - 潜在的不兼容性。
亮点
Erts
- 支持 Erlang 分布协议,将大型信号的有效负载拆分为多个片段。
- ETS 选项 write_concurrency 现在也影响并提高了 ordered_set 表的可扩展性。
- length/1 BIF 过去会一次性计算列表的长度,而不会屈服,即使列表非常长。现在,当使用长列表调用时,它会屈服。
- 引入了一个新的(仍处于实验阶段的)模块 socket。它被实现为 NIF,其想法是它应尽可能“接近”操作系统级别的套接字接口。
- 添加了 NIF 函数 enif_term_type,它通过返回给定术语的类型,帮助避免冗长的 enif_is_xyz 序列。这对于序列化术语的 NIF(如 JSON 编码器)尤其有用,它可以提高性能和可读性。
编译器
- 编译器已重写为在内部使用基于静态单赋值 (SSA) 的中间表示。新的中间表示使得更多的优化成为可能。
- 二进制匹配优化现在比以前适用于更多情况。
- 类型优化现在应用于本地函数调用,并且将删除比以前更多的冗余类型测试。
- 可以在源文件中给出的所有编译器选项现在都可以在 erlc 命令行上的选项列表中给出。
- 在 OTP 22 中,HiPE(本机代码编译器)未完全正常工作。其原因是 HiPE 本机代码编译器不支持新的用于二进制匹配的 BEAM 指令。如果使用 +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 OS(当前)、少量术语泄漏。此功能在 OTP 22 中将被归类为实验性功能。 - SSL:现在使用新的 logger API,包括日志级别和详细的调试日志。
- SSL:基本支持 TLS 1.3 服务器以供实验使用。
- Crypto:新的 hash_info/1 和 cipher_info/1 函数返回包含有关参数中哈希或密码信息的映射。
- 实现 uri_string:resolve/{2,3},可用于解析相对于基本 URI 的 URI 引用。(22.3)