BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

LLVM和Ruby近况:llvmruby、yarv2llvm以及regexpllvm、Rubinius

| 作者 Werner Schuster 关注 9 他的粉丝 ,译者 李明(nasi) 关注 0 他的粉丝 发布于 2008年10月22日. 估计阅读时间: 7 分钟 | ArchSummit北京2018 共同探讨机器学习、信息安全、微服务治理的关键点
LLVM尽管带有“VM”的字样,但实际上却是一个用于构建编译器后端的框架。简言之,它提供一个指令集(中间代码)和一个后端,用于优化代码和为某一宿主平台(x86、ARM、…)生成原生代码。现实中用到它的实例之一便是Apple的OpenGL JIT

Llvmrubyllvmruby的GitHub代码库)是由Tom Bagby开发的项目。它提供Ruby对LLVM的绑定。Llvmruby与Ruby可以良好的集成。例如,下面的代码可以添加一个add指令(codeblock是指令构造器)。

codeblock.bin_op(Instruction::Add, 41.llvm, 1.llvm)

Llvmruby重新打开了Object并将llvm添加进去,以便可以将其转换成LLVM可以处理的值。

在按照README的使用说明做完以后(包括获取和编译LLVM以及编译llvmruby),就可以开始进行实验了,例如使用irb。这有一个示例会话(其中一些示例代码是取自于llvmruby项目):

# Set up LLVM
>> require 'llvm'
=> true
>> include LLVM
=> Object
>> m = LLVM::Module.new("test_module")
=> ; ModuleID = 'test_module'
# Create a function type - the second argument is the method signature,
# ie. the return type and the types of the arguments
# In this case, there are no return values or arguments
>> type = Type::function(MACHINE_WORD, [])
=> #
>> f = m.get_or_insert_function("test", type)
=> 
declare i32 @test()
# Create an LLVMBuilder object which allows to call methods and
# generate instructions
>> builder = f.create_block.builder
=> #
# Create an Add instruction - note how it's possible to pass regular Ruby Fixnums
>> ret = builder.bin_op(Instruction::Add, 41.llvm, 1.llvm)
=> #
>> fcode = builder.return(ret)
=> #
>> ExecutionEngine.get(m);
=> true
# Finally: execute the generated code
>> ExecutionEngine.run_autoconvert(f)
=> 42

关于LLVM的更多信息,请看LLVM关于如何为一门简洁的语言实现JIT的教程

Miura Hidek给出了两个更大一点儿的使用llvmruby的实例:

  • regexpllvm:将正则表达式转换为LLVM代码。
  • yarv2llvm:将Ruby 1.9的操作码(1.9虚拟机在没有成为官方1.9虚拟机之前被称为YARV)转换成LLVM代码。它跟随着相似项目前行的脚步,例如_why的Unholy(将Ruby 1.9的操作码转换为Python虚拟机的操作码)或者HotRuby(一个用于Ruby 1.9操作码的Javascript解析器)。和这些项目不同的是,llvmruby和Ruby 1.9虚拟机紧密集成,可以做的事情更加有趣。Regexpllvm展示了一种加速代码执行的可能,比如将DSL编译成LLVM操作码。其他系统使用过这种方法,比如Java的XSLT实现将XSLT样式表编译成JVM字节码
    另 一种可能:编译Ruby代码的热点。此事,如果某段Ruby代码遇到性能瓶颈,通常的解决方案是用C重写(最理想化的解决方案是等待Ruby虚拟机的性能 提升)。通过llvmruby,有了另一个选择:将Ruby代码编译成LLVM,例如使用yarv2llvm来加速。当然,能否可以提供必要的性能加速还 要取决于代码本身。

Llvmruby可以让你不接触任何C++就能够试用LLVM,还允许你通过irb增量进行尝试。这是一项很有用的特性,比如Rubinius(此项目正计划使用LLVM)的贡献者就利用其构建原型系统,以原型化自己的某些主张。Rubinius团队正忙于使用C++重写虚拟机和清理一些内部问题。这个目前已经在Rubinius在Git的代码库的CPP分支中出现,而且还将LLVM作为外部的程序库。C++分支很快就会转入主干。根据最近在Twitter上发布的消息显示,Rubinius已经在全新的C++虚拟机上重新获得了运行大量Ruby代码的能力。Eric Hodel本周在Twitter上说道

Rubinius全新的虚拟机目前已经可以运行核心规格而不会挂掉

Evan Phoenix最近报告

万岁!IRB又能在新的Rubinius C++虚拟机下面工作了!

你打算如何在Ruby中使用LLVM呢?

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT