Erlang/OTP 27

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

Erlang/OTP 27 特性博客文章

docker run -it erlang:27

文档

EEP-59 已实现。现在可以使用源文件中的文档属性来记录函数、类型、回调和模块。

整个 Erlang/OTP 文档现在都使用新的文档系统。

新语言特性

  • 根据 EEP 64 实现了三引号字符串,允许一个字符串包含完整段落。

  • 现在,没有空格分隔的相邻字符串文字是语法错误,以避免可能与三引号字符串混淆。

  • 根据 EEP 66,在字符串文字(普通和三引号)上实现了 Sigil。例如,~"Björn"~b"Björn" 现在等同于 <<"Björn"/utf8>>

编译器和 JIT 改进

  • 编译器现在将合并对同一记录的连续更新。

  • 在编译器和运行时系统中实现了元组的安全破坏性更新。这允许虚拟机在安全的情况下就地更新元组,从而通过减少复制和产生更少的垃圾来提高性能。

  • maybe 表达式现在默认启用,无需启用 maybe_expr 功能。

  • JIT 中实现了本机覆盖率支持。它将由 cover 工具自动使用,以减少运行覆盖编译代码时的执行开销。还有新的 API 支持在不使用 cover 工具的情况下进行本机覆盖。

  • 现在,当更新记录/映射字面量以捕获常见错误时,编译器将引发警告。例如,编译器现在将为 #r{a=1}#r{b=2} 发出警告。

  • 编译器查找选项的顺序已更改。

    当在 -compile() 属性中给出的编译器选项与给编译器的选项之间存在冲突时,-compile() 属性中给出的选项会覆盖给编译器的选项,而给编译器的选项又会覆盖 ERL_COMPILER_OPTIONS 环境变量中给出的选项。

    示例

    如果 some_module.erl 具有以下属性

    -compile([nowarn_missing_spec]).
    

    并且编译器像这样调用

    % erlc +warn_missing_spec some_module.erl
    

    对于没有任何规范的函数,不会发出警告。

ERTS

  • erl 命令现在支持 -S 标志,该标志类似于 -run 标志,但修复了一些粗糙的边缘。

  • 默认情况下,escript 现在将被编译而不是解释。这意味着必须安装 compiler 应用程序。

  • 未来版本中将更改对存档文件的现有实验性支持。在 escript 中支持存档将保留,但在版本中使用存档的支持将变得更加有限或完全删除。

    从 Erlang/OTP 27 开始,函数 code:lib_dir/2-code_path_choice 标志以及使用 erl_prim_loader 读取存档成员的功能已被弃用。

    为了与 Erlang/OTP 的未来版本保持兼容,需要从其存档中检索数据文件的 escript 脚本应使用 escript:extract/2 而不是 erl_prim_loadercode:lib_dir/2

  • 默认进程限制已提高到 1048576 个进程。

  • erlang:system_monitor/2 功能现在能够监控系统中的长消息队列。

  • 已删除通过将原子(或字符串)作为 open_port() 的第一个参数传递,由 vanilla 驱动程序实现的打开到外部资源的端口的过时且未记录的支持。自 OTP 26 发布以来,此功能已计划在 OTP 27 中删除。

  • pid 字段已从 erlang:fun_info/1,2 中删除。

  • 现在支持多个跟踪会话。

  • configure 现在会自动启用对 2038 年安全时间戳的支持。

    默认情况下,构建 OTP 时使用的 configure 脚本现在将尝试启用在 2038 年 1 月中旬之后仍能正常工作的时间戳支持。这通常只在 32 位平台上是一个问题。如果 configure 无法弄清楚如何启用此类时间戳,它将中止并显示错误消息。如果您仍然希望构建系统,并且知道该系统在 2038 年 1 月中旬之后将无法正常工作,您可以将 --disable-year2038 选项传递给 configure,这将使 configure 能够在没有 2038 年 1 月中旬之后的时间戳支持的情况下继续运行。”

STDLIB

  • 有一个用于编码和解码 JSON 的新模块 json。

    编码和解码都可以自定义。解码可以以类似于 SAX 的方式完成,并处理多个文档和数据流。

    新的 json 模块被用于 ASN.1 的 jer (JSON 编码规则),用于编码和解码 JSON。因此,不再需要提供外部 JSON 库。

  • 已向模块 timer 添加了几个接受 funs 的新函数。

  • 函数 is_equal/2map/2filtermap/2 已添加到模块 setsordsetsgb_sets

  • 有新的高效 ets 遍历函数,具有保证的原子性。例如,现在的 ets:next/2 之后紧跟着 ets:lookup/2 可以替换为 ets:next_lookup/1

  • 新函数 ets:update_element/4 类似于 ets:update_element/3,但将默认元组作为第四个参数,如果不存在具有该键的先前记录,则会插入该元组。

  • binary:replace/3,4 现在支持使用 fun 来提供替换二进制文件。

  • 新函数 proc_lib:set_label/1 可用于向任何没有注册名称的进程添加描述性术语。该名称将由诸如 c:i/0observer 等工具显示,并且将包含在使用 gen_servergen_statemgen_eventgen_fsm 的进程生成的崩溃报告中。

  • 添加了从 gb_treesgb_sets 中检索下一个更高或更低的键/元素的函数,以及返回从给定键/元素开始的迭代器。

common_test

  • ct:capture_start/0ct:capture_stop/0 的调用现在是同步的,以确保捕获所有输出。

  • 如果浏览器首选,默认 CSS 现在将包含基本的暗模式处理。

crypto

  • 在 Erlang/OTP 25 中标记为已弃用的函数 crypto_dyn_iv_init/3crypto_dyn_iv_update/3 已被删除。

dialyzer

  • 已删除 Dialyzer 的 --gui 选项。

ssl

  • ssl 客户端可以协商和处理证书状态请求(客户端上的 OCSP 绑定支持)。

tools

  • 有一个新的工具 tprof,它在一个接口下结合了 eprofcprof 的功能。它还增加了堆分析。

xmerl

  • 作为 xmerl_xml 的替代方案,添加了一个新的导出模块 xmerl_xml_indent,它提供了开箱即用的缩进输出。