分享

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

 guitarhua 2013-11-03
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呢?

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多