LLVM尽管带有“VM”的字样,但实际上却是一个用于构建编译器后端的框架。简言之,它提供一个指令集(中间代码)和一个后端,用于优化代码和为某一宿主平台(x86、ARM、…)生成原生代码。现实中用到它的实例之一便是Apple的OpenGL JIT。
Llvmruby(llvmruby的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的实例:
Llvmruby可以让你不接触任何C++就能够试用LLVM,还允许你通过irb增量进行尝试。这是一项很有用的特性,比如Rubinius(此项目正计划使用LLVM)的贡献者就利用其构建原型系统,以原型化自己的某些主张。Rubinius团队正忙于使用C++重写虚拟机和清理一些内部问题。这个目前已经在Rubinius在Git的代码库的CPP分支中出现,而且还将LLVM作为外部的程序库。C++分支很快就会转入主干。根据最近在Twitter上发布的消息显示,Rubinius已经在全新的C++虚拟机上重新获得了运行大量Ruby代码的能力。Eric Hodel本周在Twitter上说道: Rubinius全新的虚拟机目前已经可以运行核心规格而不会挂掉 万岁!IRB又能在新的Rubinius C++虚拟机下面工作了! 你打算如何在Ruby中使用LLVM呢? |
|