2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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:381939
用户头像

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

关注

评论

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

喜欢回忆过去的人,没有未来

小天同学

成长 自我思考 个人感悟 突破瓶颈 4月日更

Python OpenCV 图像处理之直方图的应用,取经之旅第 26 天

梦想橡皮擦

Python OpenCV 4月日更

区块链特色农产品溯源平台解决方案

13828808769

溯源 #区块链#

【LeetCode】打家劫舍 II Java题解

Albert

算法 LeetCode 4月日更

Windows 下 搭建 Flutter 环境

U2647

flutter 4月日更

第一个 Go 程序

escray

学习 极客时间 Go 语言 4月日更 Go100

GaussDB(for openGauss)让数据“存得下、算得快、算得准”

华为云开发者联盟

GaussDB(for openGauss) 华为云数据库 数据分布方式 计算下推 数据强一致

修电脑、脱发、格子衫?程序员拒绝标签化,这才是真正的他们

华为云开发者联盟

程序员 女朋友 标签 格子衫 单身狗

一加9pro联名哈苏了!这可能是你能买的平替哈苏

Geek_4a453c

超详细 PowerDesigner 入门教学(项目数据库设计标准)

若尘

数据库 数据库设计

被应用商店下架的应用,该如何下载?

彭宏豪95

效率 App 苹果 4月日更

算法突击营毕业总结

韩儿

计算机原理学习笔记 Day5

穿过生命散发芬芳

计算机原理 4月日更

一直做着行业最“新”的尝试:NA(Nirvana)Chain受邀出席共为·创新大会并办展

区块链第一资讯

Github Star 11.5K项目再发版:AAAI 2021 顶会论文开源,80+多语言模型全新升级

百度大脑

飞桨

Spring Boot 启动时,让方法自动执行的 4 种方法!

Java小咖秀

springboot 启动方式

初识GaussDB(for Cassandra)

华为云开发者联盟

数据安全 GaussDB 华为云数据库 GaussDB(for Cassandra) 分布式云数据库

openLooKeng V1.2.0 发布

LooK

大数据 数据 Bigdata

SQL 性能优化的几条建议

U2647

sql 4月日更

算法思考:红包金额生成

程序员架构进阶

Java 28天写作 算法解析 4月日更 微信红包

他人方寸间,山海几千重

清秋

随笔 4月日更 1 周年盛典 我和写作平台的故事

智慧公安重点人员管控系统搭建,实现重点人员动态管控

13828808769

智慧公安

Linux pwd 命令

一个大红包

Linux linux命令 4月日更

Zabbix Linux 下源码安装

耳东@Erdong

zabbix 4月日更

VueRouter源码解读:三大核心模块构成

梁龙先森

源码分析 大前端 vue-router

数据库存取策略对比

小舰

4月日更

ES9的新特性:异步遍历Async iteration

程序那些事

JavaScript ecmascript 程序那些事 es9

分页场景慢?MySQL迷惑行为解读~

Java架构师迁哥

C++系列:Visual Studio(VS)2019登录不上?

Bob

c++ 踩坑经历 编程经验 4月日更

中寰卫星导航卜钢采访:IT年轻人怎么工作、学习和生活(采访提纲)

老猿Python

学习 采访 IT年轻人

直播 | 如何使用Ranger增强权限管理?

LooK

大数据 数据分析 数据 Bigdata

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