Ruby 3.0.0发布

2020-12-25 14:32:29

我们很高兴宣布Ruby的发布。从2015年开始,我们朝着Ruby 3进行了艰苦的开发,其目标是性能,并发性和键入。 Matz表示,特别是在性能方面,“ Ruby3将比Ruby2快3倍”,也就是Ruby 3x3。

Optcarrot基准测试可以根据NES的游戏仿真工作负载来衡量单线程性能,因此其性能比Ruby 2.0快3倍!这些是在https://benchmark-driver.github.io/hardware.html中编写的环境下测量的。 8c510e4095被用作Ruby 3.0。根据您的环境或基准,它可能不会快3倍。

当我在会议主题演讲中首次声明“ Ruby3x3”时,包括核心团队成员在内的许多人都感到“ Matz是个助推器”。实际上,我也是如此。但是我们做到了。我很高兴看到核心团队在将Ruby3.0的速度比Ruby2.0快三倍的情况下(在某些基准测试中)确实取得了成就。 –马茨

从Ruby 3.0开始,JIT可以在有限的工作负载(例如游戏(Optcarrot),AI(Rubykon)或花费大量时间多次调用几种方法的应用程序)中提高性能。

尽管Ruby 3.0大大减少了JIT版本的代码的大小,但它仍未准备好优化诸如Rails之类的工作负载,因为它们经常花很多时间在许多方法上,因此遭受了JIT加剧的i-cache丢失的困扰。请继续关注Ruby 3.1,以进一步解决此问题。

今天是多核时代。并发非常重要。有了Ractor,再加上Async Fiber,Ruby将成为真正的并发语言。 — Matz

Ractor是类似于并发抽象的Actor模型,旨在提供并行执行功能而无需担心线程安全。

您可以制造多个拖拉机,也可以并行运行它们。 Ractor使您可以制作线程安全的并行程序,因为ractors无法共享普通对象。拖拉机之间的交流是通过交流信息来支持的。

为了限制对象共享,Ractor对Ruby的语法引入了一些限制(没有多个Ractor,没有限制)。

规格和实现尚不成熟,将来可能会更改,因此此功能被标记为实验性功能,并在首次Ractor.new时显示“实验性功能”警告。

以下小程序通过顺序执行4次或与拖拉机并行执行4次来测量著名的基准tak函数(Tak(函数)-Wikipedia)的执行时间。

def tarai(x,y,z)= x< = y? y:tarai(tarai(x-1,y,z),tarai(y-1,z,x),tarai(z-1,x,y))需要&benchmark基准测试。 bm做| x | #顺序版本x。报告(&seq'){4。 times {tarai(14,7,0)}}#并行版本x。报告(' par'){4。时代。贴图做Ractor。新{tarai(14,7,0)}结束。每个(&:take)}结尾

基准测试结果:用户系统总计realseq 64.560736 0.001101 64.561837(64.562194)par 66.422010 0.015999 66.438009(16.685797)

结果是在Ubuntu 20.04,Intel®Core™i7-6700(4核,8个硬件线程)上测量的。它表明并行版本比顺序版本快3.87倍。

引入了Fiber#scheduler来拦截阻塞操作。这允许轻量级的并发,而无需更改现有代码。观看“别等我,Ruby 3的可扩展并发性”,以了解它的工作原理。

需要' async'需要' net / http'需要' uri'异步执行[" ruby​​" ," rails" ," async" ]。每个做|话题异步网络:: HTTP。得到(URI" https://www.google.com/search?q =#{topic}")结束结束结束

它使用提供事件循环的异步。此事件循环使用Fiber#scheduler挂钩使Net :: HTTP成为非阻塞的。其他gem可以使用此接口为Ruby提供非阻塞执行,并且这些gem可以与支持相同非阻塞钩子的Ruby其他实现(例如JRuby,TruffleRuby)兼容。

2010年代是静态类型编程语言的时代。 Ruby通过使用抽象解释的无类型声明的静态类型检查来寻求未来。苏格兰皇家银行TypeProf是未来的第一步。更多步骤。 — Matz

类型检查器(包括TypeProf和其他支持RBS的工具)将通过RBS定义更好地理解Ruby程序。

您可以写下类和模块的定义:类中定义的方法,实例变量及其类型以及继承/混合关系。

RBS的目标是支持Ruby程序中常见的模式,它允许编写高级类型,包括联合类型,方法重载和泛型。它还支持带有接口类型的鸭子输入。

Ruby 3.0附带了rbs gem,它允许解析和处理用RBS编写的类型定义。以下是带有类,模块和常量定义的RBS的一个小示例。

模块ChatApp版本:字符串类通道attr_reader名称:字符串attr_reader消息:Array [Message] attr_reader用户:Array [User | Bot]#`|`表示联合类型,`User`或`Bot`。 def initialize:(String)-> void def post :(字符串,来自:用户| Bot)->消息#支持方法重载。 | (文件,来自:用户| Bot)->消息结束

它读取普通的(无类型注释的)Ruby代码,分析定义了哪些方法以及如何使用它们,并生成RBS格式的类型签名的原型。

#test.rb类用户def初始化(name:,age :) @name,@age = name,年龄终止attr_reader:name,:age最终用户。新建(姓名:" John"年龄:20)

$ typeprof test.rb#类class用户attr_reader名称:字符串attr_reader年龄:整数def初始化:(名称:字符串,年龄:整数)-> [String,Integer]结束

您可以通过将输入另存为“ test.rb”并调用名为“ typeprof test.rb”的命令来运行TypeProf。

您也可以在线尝试TypeProf。 (它在服务器端运行TypeProf,因此很抱歉!)

TypeProf尚处于实验阶段,尚未成熟。仅支持一部分Ruby语言,并且类型错误的检测受到限制。但是,改善语言功能,分析性能和可用性的范围仍在迅速增长。任何反馈都非常欢迎。

案例[" a" ,1," b" ," c" ,2," d" ," e" ," f" ,3] in [* pre,String => x,字符串=> y,* post] p pre#=> [" a",1] p x#=> " b" p y#=> " c" p帖子#=> [2," d&#34 ;," e&#34 ;," f&#34 ;, 3]结尾

这是一个新的C-API集,用于在扩展库之间交换原始内存区域,例如数字数组和位图图像。扩展库还可以共享由形状,元素格式等组成的存储区域的元数据。使用这些类型的元数据,扩展库甚至可以适当地共享多维数组。此功能是通过参考Python的缓冲区协议来设计的。

将长代码粘贴到IRB的速度比Ruby 2.7.0捆绑的速度快53倍。例如,粘贴此示例代码所需的时间从11.7秒变为0.22秒。

irb(main):001:0> 3 => 3irb(main):002:0> = measuregt已添加。 nilirb(main):003:0> 3处理时间:0.000058s => 3irb(main):004:0>测量:off => nilirb(main):005:0> 3 => 3

关键字参数与其他参数分开。原则上,在Ruby 2.7上显示警告的代码将不起作用。详细信息请参见文档。

在Ruby 2.5中,回溯的顺序已被颠倒,并且被恢复。现在,它的行为类似于Ruby 2.4;首先打印错误消息和发生异常的行号,然后再打印其调用方。

以下库不再是捆绑的gem或标准库。请安装相应的gem以使用这些功能。 Ruby3.0是一个里程碑。 语言不断发展,保持了兼容性。 但这还没有结束。 Ruby将不断发展,并变得更加强大。 敬请关注! — Matz Ruby最初由Matz(Yukihiro Matsumoto)于1993年开发,现在已作为开源开发。 它运行在多个平台上,并在全世界范围内广泛用于Web开发。