由 naruse 发表于 2022-04-03
翻译: GAO Jun
我们很高兴地宣布 Ruby 3.2.0-preview1 已发布。Ruby 3.2 增加了很多新功能和性能改进。
基于 WASI 的 WebAssembly 支持
这是首次基于 WASI 的 WebAssembly 支持。使得 CRuby 二进制内容可用于浏览器、Serverless Edge、以及其他 WebAssebly/WASI 嵌入环境。目前,此功能已通过除 Thread API 之外的 basic 和 bootstrap 测试套件。
背景
WebAssembly (WASM) 希望能够在浏览器中提供安全快速的运行程序的方式。但其目标,也就是在不同环境中安全高效的运行程序,不仅是 web 应用长期以来的目标,也是其他一般程序所需要的。
WASI (The WebAssembly System Interface) 被设计用于此类应用场景。尽管此类应用需要与操作系统进行通信,WebAssembly 却运行在一个没有系统接口的虚拟机之上。WASI 使之标准化。
Ruby 的 WebAssembly/WASI 支持,希望利用这些项目,使 Ruby 开发者可以编写能运行于兼容此类功能的平台上。
应用场景
这种支持鼓励开发人员可以在 WebAssembly 环境中使用 CRuby。一个此类应用场景的案例是 TryRuby playground 的 CRuby 支持。现在您可以在您的浏览器中尝试原生的 CRuby。
技术要点
目前,WASI 和 WebAssembly 仍在不断演进,同时基于安全原因,还缺少一些功能来实现纤程、异常和垃圾回收。 所以,CRuby 使用了一种可以控制用户空间中执行的二进制转换技术 Asyncify 来填补这一鸿沟。
此外,我们创建了 WASI 之上的虚拟文件系统,于是就可以很容易地将 Ruby 应用打包成单个 .wasm 文件,进而简化分发 Ruby 应用的过程。
相关链接
Regexp 超时设置
新增正则表达式匹配的超时设置。
Regexp.timeout = 1.0
/^a*b?a*$/ =~ "a" * 50000 + "x" #=> 1秒后 Regexp::TimeoutError
众所周知,正则表达式匹配的耗时长度可能出乎意料之外。如果您的代码尝试从一个不可信输入中匹配一个低效的正则表达式,攻击者可以借此发起有效的拒绝服务攻击(所谓的正则表达式 DoS,或 ReDoS)。
根据您的 Ruby 程序的需要,可以通过设置 Regexp.timeout
来避免或减轻这种 DoS 风险。请在您的程序中进行尝试,我们欢迎您的反馈。
请注意,Regexp.timeout
是全局性的配置。如果您希望对于某些特殊的正则表达式使用不同的超时设置,您可以使用 Regexp.new
中的 timeout
关键词。
Regexp.timeout = 1.0
# 这个 Regexp 没有超时设置
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)
long_time_re =~ "a" * 50000 + "x" # 不会被中断
最初提议: https://bugs.ruby-lang.org/issues/17837
其他值得注意的新功能
不再捆绑第三方源代码
-
我们不再捆绑第三方源代码,例如
libyaml
,libffi
。-
psych 中已经移除了 libyaml 的代码。您可能需要在 Ubuntu/Debian 平台中安装
libyaml-dev
。软件包的名称可能因平台不同而各异。 -
在 preview2 中,
fiddle
将移除 libffi。
-
语言
- 查找模式不再是实验性功能。
性能改进
自 3.1 以来其他值得注意的变更
- Hash
- 当 hash 为空时,Hash#shift 现在总是返回 nil,此前行为是返回默认值或调用默认 proc。 [[Bug #16908]]
- MatchData
- 新增 MatchData#byteoffset 。 [[Feature #13110]]
- Module
- 新增 Module.used_refinements 。 [[Feature #14332]]
- 新增 Module#refinements 。 [[Feature #12737]]
- 新增 Module#const_added 。 [[Feature #17881]]
- Proc
- Proc#dup 返回子类的一个实例。 [[Bug #17545]]
- Proc#parameters 现在接受 lambda 关键字。 [[Feature #15357]]
- Refinement
- 新增 Refinement#refined_class 。 [[Feature #12737]]
- Set
- Set 现在可以直接使用,不需要调用
require "set"
。 [[Feature #16989]] 目前其通过Set
常量或对Enumerable#to_set
调用自动载入。
- Set 现在可以直接使用,不需要调用
- String
- 新增 String#byteindex 和 String#byterindex 。 [[Feature #13110]]
- 更新 Unicode 至 Version 14.0.0,Emoji Version 14.0. [[Feature #18037]] (同样适用于 Regexp)
- 新增 String#bytesplice 。 [[Feature #18598]]
- Struct
- 即使在
Struct.new
中不设置keyword_init: true
,Struct 类也可以通过关键词参数进行初始化。 [[Feature #16806]]
- 即使在
标准库更新
-
下列默认 gems 被更新。
- 待定
-
下列 bundled gems 被更新。
- 待定
-
下列默认 gems 现在是 bundled gems。您需要在 bundler 环境中,将其加入
Gemfile
文件。- 待定
自 Ruby 3.1.0 以来,伴随这些变更, 1058 个文件被更改, 新增 34946 行(+),删除 29962 行(-)!
下载
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz
SIZE: 20728782 SHA1: 7c4197e67f230b0c5d011f4efb9b9158743a61c8 SHA256: 6946b966c561d5dfc2a662b88e8211be30bfffc7bb2f37ce3cc62d6c46a0b818 SHA512: d24e77161996c2085f613a86d1ed5ef5c5bf0e18eb459f6a93a0014a5d2ce41079283b4283d24cb96448a0986c8c6c52a04584abd4e73911ea59cefeb786836e
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.xz
SIZE: 15011400 SHA1: 6bcc30ac670ab391997e0d68ba97b451db078934 SHA256: 6d28477f7fa626b63bf139afd37bcfeb28fce6847b203fa10f37cb3615d0c35d SHA512: 0eca2c346b995d265df2659b4215ff96e515c29926c2a6256caad99db9c4c51fec1a2d899ca63a00010d4111060dc0fdd4f591be84c0a2c43b6303879de3c5de
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.zip
SIZE: 25370458 SHA1: 3c93c2e775366eec6e93cf670fc8677934cb4e48 SHA256: 24f8ae73d56366453defb0654de624bd1c063921a1d7ac780e4da56bb8fbf7e4 SHA512: 9754f11aa167df167d1b336e5c660aab1bd9e12421c093e0fe96e9a2da4ffb9859b7ea5263473bbc7b57ac8b5568cf7ac3116c0abdc647e1ff97a8d060ff7eae
Ruby是什么
Ruby 最初由 Matz (松本行弘,Yukihiro Matsumoto) 于 1993 年开发,现在以开源软件的形式开发。它可以在多个平台上运行,并在全球得到广泛使用,尤其是Web开发领域。