写点什么

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

  • 2008-10-21
  • 本文字数:1475 字

    阅读完需:约 5 分钟

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 的实例:

  • 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 呢?

2008-10-21 01:381881
用户头像

发布了 80 篇内容, 共 21.3 次阅读, 收获喜欢 5 次。

关注

评论

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

产品思维助力研发管理工具建设

研发管理Jojo

产品思维 研发管理工具 用户旅程 协同共创

Qt播放音视频文件报错DirectShowPlayerService::doRender: Unresolved error code 0x80040266

小肉球

qt 7月月更

100 条 Linux vim 命令备忘单,收藏起来随时备用!

wljslmz

vim Linux 运维、 7月月更

zookeeper-zookeeper的应用场景

zarmnosaj

7月月更

【MySql项目实战优化】复杂触发器案例分享

安逸的咸鱼

MySQL 实战 7月月更

Docker安装Redis!!!(含每一步详细图解)实战

宁在春

redis Docker 7月月更

云原生指南之什么是云原生基础架构

宇宙之一粟

云原生 7月月更

分享5个Vue开发小技巧

程序员海军

Vue 7月月更

iOS 内存管理(基本概念及引用计数)

NewBoy

ios 前端 移动端 iOS 知识体系 7月月更

在线随机抛硬币正反面统计工具

入门小站

工具

linux中的内部命令和外部命令

工程师日月

Linux 7月月更

Spring全家通之SpringMVC如何传递参数以及返回值的类型

Java学术趴

7月月更

使用pytorch自己构建网络模型实战

秃头小苏

PyTorch 7月月更

现实世界的快与慢

耳东@Erdong

随笔杂谈 7月月更

前端值得一看的ArkUI框架进度指示器

坚果

开源 HarmonyOS OpenHarmony Open Harmony 7月月更

Qt|使用Http通讯下载页面实时显示

中国好公民st

qt 7月月更

数据要素

奔向架构师

数据资产 7月月更

使用 PixCap 和 ReadyPlayerMe 快速制作3D 模型动画

devpoint

3D 7月月更 pixcap readyplayerme

Unity实战问题-WebGL问题集锦-下篇

芝麻粒儿

android Unity 7月月更

C# 基于MessageBox类的消息对话框讲解

IC00

C# 7月月更

【愚公系列】2022年07月 Java教学课程 06-常量

愚公搬代码

7月月更

【深度】新派LaaS协议Elephant:重振DeFi赛道发展的关键

股市老人

DeFi 2.0的LaaS协议Elephant,重振DeFi赛道发展的关键

鳄鱼视界

SDL键盘事件

柒号华仔

7月月更

在线XML转JSON工具

入门小站

工具

如何设计自动化测试case?

老张

自动化测试

C#入门系列(二十四) -- 密封类和静态类

陈言必行

7月月更

jQuery 基础动画

Jason199

js JQuery框架 7月月更

在 IDEA 里下个五子棋不过分吧?

沉默王二

Java Netty IDEA idea插件 idea plugin

LLVM和Ruby近况:llvmruby、yarv2llvm以及regexpllvm、Rubinius_Ruby_Werner Schuster_InfoQ精选文章