写点什么

JRuby 新 IR 奠定未来性能提升之路

  • 2009-11-29
  • 本文字数:2007 字

    阅读完需:约 7 分钟

JRuby 在——性能方面已经取得了重大进步。早在一年前,它就是最快的Ruby 1.8 实现了。每次发布JRuby 的性能都会得到提升,有了Subbu Sastry 开发的新中间表示(Intermediate Representation,IR),可以预见到其性能将有更进一步的改善。

InfoQ 采访了 Subbu,希望了解新的 IR 是什么样的,它将为 JRuby 带来什么好处。在讨论新的中间表示前,编译器目前是如何在没有 IR 的情况下工作的?

严格说来,AST(抽象语法树)也是一种 IR——因为它既不是源代码,也不是目标语言。理论上来讲,IR 是一种表示方法(内存数据结构,输出“汇编”等),它不但可以用于捕获源语言的语义,还能够让语言的实现更为顺畅。 鉴于 JRuby 是从解释器起家的(这是获得语言的参考 / 原型实现的最好方法,也是最简单的方法),并且它必须完全兼容 C MRI 实现,由于 MRI 实现是以 AST 为基础的(或者存在其他原因),JRuby 在起初选择 IR 时使用了 AST。

JRuby AST 是解析器的输出结果,仅仅是源代码的树形表示,包含不同种类的节点,例如有类、方法和变量。工具还能用它来分析代码,例如,可以提供自动化重构。)

在过去的几年里,出于对性能的考虑,开发了将 AST 转换为本地字节码的编译器,这样一来,既可以降低解释的成本,HotSpot 又能进行优化(内联等),还可以编译为硬件级本地代码。虽然我认为可以将编译器部署为 AOT(ahead-of-time)编译器,但它其实并不会盲目地编译所有东西,只有当方法执行计数器超过某个阈值时它才会生效。

Tom Enebo 补充道“JIT 阈值只是一个方法调用计数器。可以用下面的设置来配置(现在的默认值是 50)该计数器:

复制代码
-J-D jruby.jit.threshold=<invocation count>

我们还有几个其他的可调整的 JIT 参数,例如控制 JIT 多少个方法”。相比 AST,新的表示方法是什么样的呢?

AST 对解释而言还不错,但如果要用它来实现“传统的”(和其他 Ruby 特定的)编译器“优化”,AST 可能就不是 IR 的最佳选择了。新的 IR 会将 AST 翻译成一系列指令,它们有点类似高级汇编。一条指令就是一个简单的操作(分支、调用、接收参数、返回等等),它会操作一组操作数(可以是变量、整数、浮点数、数组、闭包等等)。起初,很多操作都以调用方法结束,但我们期望以后一些操作能被优化(内联等)成本地(本地 JVM 等)操作。

(如果想要知道 IR 是什么样的,请参见 JRuby 邮件列表中的文章。)

IR 中还会包含一组其他的数据结构,例如控制流程图(用于表示控制流程)、类及方法层次,以后可能还会有静态单赋值形式(Static Single Assignment,SSA)这样的更好的优化。自始至终,IR 的目标就是用正规的形式来表示源代码,同时还要保留尽可能多的来自前端的信息。在编译器运行之时,较高层次的 IR 指令可能会被拆分成较低层次的 IR(调用会被拆成查询、方法表加载和分派),或者将其他隐式信息会变为显式的(堆帧分配、堆帧加载和存储),这样它们才能得到进一步优化。 作为一组“汇编”指令,新 IR 在表现上也更线性——不是树形的——但正如上面所说的,其中还有其他辅助的数据结构(图)用于显式地表示控制流,偶尔还有数据流。

新的 IR 还能带来什么好处吗?

新 IR 更适合用来实现传统编译器优化。此外,我们还打算试验一些技术——(a) 内联闭包 (b) 内联方法调用©在拆箱时将整数 / 浮点数调用转换为原生的整型 / 长整型 / 单精度浮点型 / 双精度浮点型运算 (d) 对于非内联闭包,降低其堆加载 / 存储开销……可能还有一些别的内容。这些东西用 AST 做起来会相对困难一些。 我们还希望这个 IR 消耗更少内存(如果实现得当的话,这是理所应当的)——只有在优化阶段才出现内存峰值。作为操作的正规表示形式,它也许能提供简单的解释器实现(基于 IR 指令)。相对于 100 多个 AST 节点类型而言,基于 IR 的解释器只需要几十种指令即可。

对于何时 IR 会被用于 JRuby 中,目前是否已经有计划?

我们预计能够从新 IR 中获得收益还要花上一段时间。我不想胡乱说个时间点,免得将来自己打自己的嘴巴,这应该是水到渠成的事情。对我而言,这是个有趣的项目 :-) 我们计划第一步要构建一个基于新 IR 指令操作而非 AST 节点的解释器。这能帮助我们建立信心,告诉我们已经捕获了所有需要捕获的信息,验证我们的关于提升解释器性能的假定(毕竟,我们有可能完全弄错了),为实现性能分析提供基础(相应的,这会告诉编译系统应该关注哪些地方)。

新 IR 已经部分完成了(还有一些 AST 节点尚未处理),其中包括控制流程图、一些本地优化、数据流框架、一些数据流分析和审查和闭包堆加载 / 存储优化,未来几个月里还会加入更多内容。

简而言之,我不认为有什么别的选择能在 JVM 上构建分层的 Ruby 实现,原因很简单,Ruby 和 JVM 之间在语义上并不匹配。我们不能期望 JVM 优化所有 Ruby 的动态语义,这是另一个很长的话题了。

GitHub 上能找到新 IR 的代码。

查看英文原文: JRuby’s New IR Paves the Way for Future Performance Improvements

2009-11-29 08:211808
用户头像

发布了 135 篇内容, 共 64.4 次阅读, 收获喜欢 43 次。

关注

评论

发布
暂无评论
发现更多内容

基于 Flink 打造的伴鱼实时计算平台 Palink 的设计与实现

Apache Flink

flink

浪潮云说丨数据工场助力行业数据发挥生产要素新价值

云计算

6月18日华为云携手中科院上海药物所,深度解读AI药物研发技术

华为云开发者联盟

AI 华为云 药物 TechWave EIHealth

淘宝“618”双11系统架构是如何设计的呢?这份Java千亿级并发系统架构设计笔记告诉你答案

Java 程序员 架构 计算机

奇亚矿机系统,Bzz分币系统,云算力APP开发

一文你带快速认识Vue-Router路由

华为云开发者联盟

html Vue vue-router 路由 路由管理器

竞赛|数据竞赛Top解决方案开源整理

不脱发的程序猿

开源 数据竞赛

汽车之家:基于 Flink + Iceberg 的湖仓一体架构实践

Apache Flink

flink

Hi,HarmonyOS!融云全系产品已成功适配鸿蒙 OS 2.0

融云 RongCloud

网络攻防学习笔记 Day40

穿过生命散发芬芳

网络攻防 6月日更

【布道API】API端点/资源命名最佳实践

devpoint

RESTful Rest API 6月日更

都啥年代了,求你别再说Redis是单线程了!

Java redis 编程 程序员

一文回顾 Java 入门知识(下)

逆锋起笔

Java 面向对象 JAVA开发 java基础 javase

工厂管理没有头绪?那是你还没有可视化操控设备

一只数据鲸鱼

数据可视化 工业互联网 工业4.0 智慧工厂

我的编辑器能玩贪吃蛇,一起玩不?

华为云开发者联盟

大前端 编辑器 贪吃蛇 Blot Quill

并发王者课-青铜10:千锤百炼-如何解决生产者与消费者经典问题

MetaThoughts

Java 多线程 并发

如何用Python快速的搜索邮件

IT蜗壳-Tango

6月日更

【LeetCode】零钱兑换 IIJava题解

Albert

算法 LeetCode 6月日更

「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之EXCEL数据导入(九)

crudapi

Vue crud crudapi qusar 数据导入

2021年马士兵老师1000道Java大厂面试真题视频解析+笔记+源码

Java架构追梦

Java 架构 面试 马士兵

对话吴军:人工智能如何推动金融行业的数字化转型

索信达控股

人工智能 大数据 金融科技 数字化转型 金融

CloudQuery 的数据安全技术运用

BinTools图尔兹

Java 数据库 sql 数据安全

并发王者课-青铜9:防患未然-如何处理线程中的异常

MetaThoughts

Java 多线程 并发

Scrum为何倡导固定迭代周期?

万事ONES

项目管理 Scrum 敏捷开发 Agile ONES

WebRTC 用例和性能

anyRTC开发者

音视频 WebRTC RTC sdk

5分钟带你玩转国内首款研发自动化工具PingCode Flow

PingCode研发中心

研发管理 研发效能 自动化管理 研发工具

百度大规模Service Mesh落地实践

百度Geek说

Service Mesh 软件架构

PHP ppa 不再支持过时的 Ubuntu 16.04,请立即升级 20.04

大龄程序员老羊

php ubuntu 架构 DevOps

液体测量技术:从水到血液

不脱发的程序猿

物联网 液体测量技术 测量技术 ADI

JRuby新IR奠定未来性能提升之路_Ruby_Mirko Stocker_InfoQ精选文章