IBM的 Eclipse OMR 是一个开源的虚拟机工具集,用于创建任意语言的运行时环境。它的意图在于让实现语言的人能够重用IBM在Java运行时方面所投入的数百开发人年所取得的成果,能够受益的包含已有的语言如Ruby、Python、Javascript等等,它还能加快新语言的创建过程。
该项目真正意识到了在开发人员中,存在语言多样性这一客观现实。语言运行时可以从重用其他语言的组件方面受益。它的理念在于,尽管每种语言都有自己的定位,但是它们实际上会有相同或类似的组件。比如说,一个全新的语言可以使用来自Java的分代垃圾收集器,不必再重复造轮子,完全不用关心这个语言的语法和表现形式与Java的语法完全不同。
InfoQ采访到了该提议的架构师Mark Stoodley。
Mark Stoodley:并非如此,IBM在Java生态系统中投入了很多,而且将会持续投入。但是,我们希望这么巨大的投入也能为其他的语言社区带来红利。
随着像IBM Bluemix这样的云平台的流行以及微服务架构的发展,相比于几年前,我们需要更广泛地关注语言多样性的问题。我们的客户关注很多不同的语言,因此我们也必须要关注这些不同的语言。对于IBM来说,以跨语言社区的方式,高效利用投资是非常重要的,我认为并不是只有IBM面临这样挑战,这就是我们致力于构建Eclipse OMR社区的原因。
因为几乎所有的现代语言都是开源的,所以对于我们来说参与进来并发挥差异性的最佳方式就是将自身开放出来。实际上,Eclipse OMR就是IBM加入已有的开放社区,用来构建语言运行时,而不是关起门来自己进行研究。
Mark Stoodley:实际上,两方面都可以!
Eclipse OMR组件在与某个语言的运行时集成时,需要实现我们所谓的“语言胶水层(language glue layer)”。基本上来讲,这些代码就是帮助OMR组件实现特定语言的语法和行为。我们努力让这个胶水层尽可能简单和直接地描述该语言对Eclipse OMR组件的需求。
例如,某个语言的运行时需要告诉OMR GC如何循环访问内存区域中的值(也就是对象)来查找指向其他内存区域(对象)的指针。这个过程是与语言运行时所采用的对象模型密切相关的,所以它需要作为该语言胶水层的一部分,用来支持OMR GC组件。返回的指针将会被OMR GC组件所使用,保证这些对象处于存活的状态。至于在任意机型,任意数量的内核上高效地遍历完整的对象图,OMR GC就知道该怎么做了。
搭建一个简单的标记-清除(mark-sweep)收集器并使其运行起来相对来讲比较简单,只需要实现几项内容即可。更为复杂的收集器如分代的GC技术,则需要编写内存屏障(barrier),这需要的工作会更多一些。但是我们正在努力寻找使其更加简单的方法,也欢迎任何有志于使它变得更好的人参与进来。对于构成Eclipse OMR项目的每一个组件,都有类似的来历。
填充语言的胶水层通常会涉及到重构已有运行时的一些代码,或者为新的运行时从头进行编写。但是,如果你要编写自己的运行时的话,这些代码很可能也是必须要编写的。通过使用OMR的组件,你能够编写更少的代码,获得更好的功能。
Mark Stoodley:IBM已经贡献了20万行的代码,其中包含了多个现在就可以使用的不同组件:
我们只是为GC组件添加了通用的支持,这样的话,就将我们主要的Java GC技术开放了出去,可以供其他语言来使用。我们正在做一个诊断工具,帮助运行时的开发人员编写和调试语言运行时相关的问题。我们正在努力地让即时编译(Just In Time,JIT)技术能够开源,预计今年晚些时候就能完成了。编写JIT编译器是一项艰巨的任务,我们也在为JIT做一个更简单的接口,这样人们就能更快地准备就绪并使其运行起来,不用再去担心编译器开发人员日常所关心的所有细节。
Mark Stoodley:这个过程其实就是确保每个人都可以访问我们的项目并且自由地使用这项技术,不管你是完成班级项目的学生、尝试一些酷炫事物的hacker、与开源社区协作或者在社区内工作的公司,甚至是想构建自己的业务,也没有意愿为社区做出什么回馈的人,都可以使用这些技术(但是,我们希望这些人都能够看到回馈社区所带来的价值!)。
Eclipse基金会提供了我们所需的可信环境和基础设施,确保我们的知识产权(intellectual property,IP)在得到保护同时,还能保证它们的自由访问。这个环境能够让我们非常舒服地进行开放开发,知道我们的IP是安全的,我认为其他人也能感受到同等程度的舒适。随着时间的推移,我们也希望能够从Eclipse项目中收益,它们具备构建平台的实际经验,其他人能够使用、扩展这些平台,并为其做出贡献,这完全匹配Eclipse OMR项目的初衷。
Eclipse基金会对我们来说,是完全适合的。
Mark Stoodley:绝对会这样的。 Eclipse OMR项目是用来共享运行时方面的技术投资的,这些技术能够跨多种不同的语言,其中也包括Java,它想围绕实现语言运行时的人群构建一个社区。具有共享、可重用的组件对社区来讲是很棒的一种方式,不管人们来自何处都能分享他们的最佳实践。IBM通过贡献其Java平台的一些技术来帮助培育这个社区。Eclipse OMR是一个开放的项目,具有开放的贡献规则:任何人都可以为其做出贡献,项目的提交者欢迎各种类型的贡献提交,我们致力于扩大提交者的数量,鼓励社区为OMR组件贡献内容,包括为已有的组件进行功能增强,或者贡献/构建OMR尚未包含的全新组件。
我们期望其他的语言能够影响OMR的众多组件,例如,我们认为比Java更加动态的语言将会帮助Java本身更好地适应动态语言。
所以,我坚定地认为Java将会在这里有所收获,就像其他的语言在这里会有所收获一样:没有人能够垄断伟大的创意。但是当我们通过可重用的运行时技术组件共享这些伟大的创意时,整个开发社区都能从中受益。
Mark Stoodley:我们已经进行了一些探索性的工作,以此来证明Eclipse OMR组件不仅能够用在一种语言上:目前是Java、Ruby、Python以及一个Smalltalk运行时,名为SOM++,它是用来教授学生如何构建运行时的。我们知道它是可以运行的:我们已经设法将方法profiling、垃圾收集以及即时编译器技术从Java迁移到到了Ruby、Python以及SOM++,如果大家感兴趣的话,都会将其贡献给社区。
不过,现在的工作还没有完成。我们的目标就是想证明Eclipse OMR理念从开始就是可行的。事实上,我们的工作完成得要超过该目标:即便开始的需求是不能破坏已有运行时的兼容性,我们依然做了许多很酷的事情。通过使用IBM Health Center工具,为我们的Ruby和Python实现集成了方法profiling功能,确定了工具API能够引入到OMR中,然后可以非常容易地用于多种语言运行时,从而提供内置的监控功能。我们将自己的Java GC技术用在了Ruby所有的非堆数据上,使其变成了受托管(可垃圾回收)的堆,这样的话,在内存占用方面会有更好的控制,并且带来了性能提升,因为受托管的内存会比原生内存分配和释放得更快。最后,我们实现了相对简单的即时编译(JIT)器,只用了几千行代码,尽管我们对其没有报太大的希望,它还是将性能提升了两倍。这些JIT编译器可以进一步完善,从而提供更好的性能,但是我们认为这些工作可以在社区内部或围绕社区来做,随着Eclipse OMR项目的成熟,我们希望在这种类型的事情上能够做更多的工作。
Ruby+OMR Technology Preview能够运行Rails应用,即便将Ruby+OMR JIT功能开启也可以,这证明了它的兼容性,其GitHub地址是 https://github.com/rubyomr-preview/ruby 。我们欢迎大家的反馈,所以尽可以下载并尝试一下!
另外一个明显的样例是IBM JDK本身。J9开发团队已经开始从IBM JDK中提取Eclipse OMR组件,在这个过程中,推出了IBM JDK的Java 8版本。我们并没有在其他的分支上开展这项工作,在进行这项工作的同时,大的开发团队在持续开发和发布IBM JDK 8,带来了令人印象深刻的新特性和全面的性能提升。我们正在构建下一个版本的IBM JDK,同时还要顾及到Eclipse OMR项目所带来的变化。这对于我们来说,并不是学术练习:这关系到我们是如何构建自己的运行时的。
如果其他的语言社区对Eclipse OMR组件能够给它们的运行时带来什么变化感兴趣的话,我们也期待针对其他的语言社区开展工作。
Mark Stoodley:目前,Eclipse OMR项目主要还是活跃在IBM的开发人员之间,这并不是因为我们不想让别人和我们一起工作!该项目依然处于初期阶段,这就意味着它还缺少好的文档和对新人的培训。这些也是我们非常想进行提升的领域。除了核心技术相关的提升并将所有相关的内容全部开放出来以外,我们也在构建文档和接触其他人。我们欢迎任何对它感兴趣的人下载该项目,地址是https:// github.com/eclipse/omr,即便只是告诉我们你想做什么都可以。
我们目前正在为Ruby社区提交一些pull request,从而让社区考虑将OMR组件接受到下一个Ruby的主版本中。我们目前基于Ruby 2.2.5版本,可以参考 https://github.com/rubyomr-preview/ruby ,我们正在努力将这些补丁添加到Ruby的主分支中,同时还在将其重构为更小、更易管理的提交内容,这些提交内容会通过OMR实现特定的功能。
但是,这只是已有的团队成员正在做的事情。我们欢迎任何想参与该技术的人,不管你是在做语言平台、与语言进行交互的工具、语言所运行的平台还是其他的框架(通过与不同的语言进行紧密集成,这些框架可能会从中受益)。我们目前确实处于先有鸡还是先有蛋的初始阶段,但是借助你们和其他人的帮助,我们将会进行扩展,并且会在越来越多的语言社区上开展工作,从而兑现承诺,交付可共享、可重用的组件来构建运行时环境。
我期待在Eclipse OMR社区能够看到你们!
在 InfoQ之前的一篇文章中 ,我们曾经介绍过该项目的发布。
查看英文原文: Q&A with Mark Stoodley, Architect of Eclipse OMR Toolkit for Creating Language Runtimes