Erlang/OTP 28 亮点 - Erlang/OTP

Erlang/OTP 28 已发布,主要新特性如下:

  • Priority Messages:引入优先级消息机制,允许接收进程让某些消息获得优先级状态,默认消息插入进程消息队列末尾,紧急消息可提前插入,接收进程可通过alias/1创建进程别名并发送优先级消息,也可停止接收优先级消息,该特性不影响信号发送顺序,性能无损失,更多详情见文档EEP-76
  • Improvements of Comprehensions

    • Strict Generators:如EEP 70所述,严格生成器旨在提高列表推导式的表达性和安全性,在 OTP 27 及更早版本中,模式匹配失败时右侧表达式的项会被忽略,而使用严格生成器在模式匹配失败时会导致推导式崩溃,严格生成器可用于列表、二进制和映射生成,与之前的生成器相比,可传达不同的程序员意图,推荐在可使用的情况下使用严格生成器,以符合 Erlang 的“让它崩溃”哲学,更多示例见List Comprehensions
    • Zip Generators:如EEP 73所述,拉链生成器可更轻松地并行迭代多个列表、二进制或映射,默认情况下 Erlang 的列表推导式以嵌套或笛卡尔方式提取元素,使用&&可改变默认行为,拉链生成器可与列表、二进制和映射一起使用,并可与所有现有生成器和过滤器自由混合,编译器避免创建中间元组,保留与lists:zip/2lists:zip/3相同的错误行为。
  • Smarter Error Suggestions:Erlang/OTP 28 编译器在发现拼写错误方面有所提升,可为常见错误类型(如undefined_nifunbound_varundefined_functionundefined_record等)提供修复建议,对于错误的参数数量也会建议可用的参数数量,使编译错误更易理解,错误修复更快。
  • Improvements to the Shell

    • Lazy Reads from stdin:[PR-8962]改变了 Erlang 的stdin读取方式,现在从stdin读取需请求时进行,如调用io:get_line/2时,解决了特殊字符问题,无需使用-noinput标志,解决了[Issue-8113]等问题。
    • Raw and Cooked Modes for noshellnoshell模式现在支持cooked(默认行为)和raw(新选项,可绕过原生终端的行编辑支持)两种“子模式”,在raw模式下可构建更交互式的应用,如读取按键并立即输出,无需用户按下 Enter,custom shell文档展示了如何创建自定义 shell,terminal interface文档展示了如何实现井字棋游戏。
    • Using fun Name/Arity to create funs in shell:[PR-8987]使得在 shell 中可使用fun Name/Arity创建函数,函数可从自动导入的 BIF(如is_atom/1)创建,也可从 shell 中定义的本地函数创建。
  • New erlang:hibernate/0:引入新的erlang:hibernate/0函数,将调用进程置于等待状态,减少内存占用,接收下一个消息时唤醒,不丢弃调用栈,对于预期长时间空闲但希望简化休眠的进程很有用,通过内存使用实验表明,当有 100 万大多空闲的进程时,使用erlang:hibernate/0可减少 75%以上的内存使用。
  • Warnings for Use of Old-Style Catch:引入对使用旧样式catch Expr的警告,更简单的catch Expr可能会隐藏错误,应使用try...catch...end,在未来版本中,旧的catch构造使用将默认生成警告,可在项目或模块级别启用warn_deprecated_catch来防止新的使用,同时展示了如何将旧样式的catch Expr替换为try...catch...end
  • Based Floating Point Literals:扩展浮点数语法,支持使用任何进制的浮点数字面量,类似 Ada 和 C99/C++17,基于EEP-75,在代码生成工具中很有用,可保留位级精度。
  • PCRE2:将re模块升级为使用 PCRE2,大部分与 PCRE 正则表达式语法向后兼容,但也有一些不同行为,如更严格的语法验证(\i\B\8等会导致错误)、Unicode 属性更新、re:split/3与分支重置组的不同结果等,内部格式已更改,不能在节点或 OTP 版本之间重用,升级可提高长期可维护性,但需测试现有正则表达式代码。
  • Optimizations to TLS 1.3:对 SSL 与 TLS 1.3 的性能进行了优化,减少了应用数据传输的一般开销,通过小消息回显基准测试表明,使用 TLS 1.3 时 Erlang/OTP 28 可提速 15%-25%,无需更改代码。
  • Nominal Types:如EEP 69所述,名义类型检查为 Dialyzer 添加了另一种类型系统,可使用-nominal声明名义类型,防止意外误用结构相同的类型,Dialyzer 会对函数的输入和输出类型进行名义类型检查,也有一些例外情况,更多细节见参考手册中的 Nominals
  • New Emacs Erlang Mode:OTP 团队正在开发新的 Emacs Erlang 模式,使用 treesitter 处理字符串和文档更好,可从GithubMelpa获取并尝试,欢迎贡献。
阅读 28
0 条评论