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

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

关注

评论

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

GitHub上连夜被下架!阿里巴巴2021版JDK源码笔记(2月第三版)

Java架构追梦

Java 阿里巴巴 面试 jdk源码 金三银四

涨薪50%,从小厂逆袭快手 - 附面经

haxianhe

面试

公链,区块链的未来和归宿

CECBC

区块链

紧急寻人,还缺75万!区块链产业为何“一才难求”?

CECBC

区块链人才

基于matlab的控制系统与仿真6-PID控制模型

AXYZdong

matlab 2月春节不断更

双指针高频面试题:「三数之和」的姐妹篇 ...

宫水三叶的刷题日记

面试 LeetCode 数据结构与算法

第十二周 学习总结

简简单单

2021突击金三银四必备:BAT1000Java面试真题合集!

比伯

Java 编程 架构 面试 计算机

金融数字化转型浪潮呼啸而来 大数据区块链落地场景全面开花

CECBC

金融

日记 2021年2月27日(周六)

Changing Lin

2月春节不断更

普本毕业,阿里五面成功斩下offer,名校出身的我究竟输在哪?

Java架构之路

Java 程序员 架构 面试 编程语言

我看JAVA 之 Annotation

awen

Java 源码 jdk 注解 annotation

Enterprise Tech30(2021)

行人23

Tech ET30

最新“美团+字节+腾讯”三面面经,你能撑到哪一面?

Java架构之路

Java 程序员 架构 面试 编程语言

《经济学人》2021年2月27日刊精彩文章导读及资源下载

wbliu85

深入解读华为云细粒度文本情感分析及其应用

华为云开发者联盟

AI 华为云 情感分析 语言语义 文本情感分析

程序员成长第十四篇:做好时间管理(二)

石云升

程序员 时间管理 28天写作 2月春节不断更

智能客服+智能助手,这波“数字员工”的业务能力太强了!

华为云开发者联盟

华为 AI 数字 智能客服 智能助手

Linux入门篇 —— Linux 用户与组管理详解(system-config-users && 命令行)

若尘

Linux 命令行 用户

观点 | 破解云管理平台在数据中心管理体系中定位模糊的困局

BoCloud博云

云计算 PaaS 服务目录 多云管理平台 数据中心管理

我看JAVA 之 枚举类型

awen

Java 源码 jdk 枚举

如何学习一项技能

不在调上

探索图神经网络的网络架构和训练方法

华为云开发者联盟

神经网络 AI 图神经网络 网络架构 GNNs

多年阅读《经济学人》是一种什么体验?

wbliu85

推荐程序员平时使用最多的绘图软件!!!

秦怀杂货店

软件 流程图 绘图

我看JAVA 之 Class

awen

Java 源码 jdk class

第十二周 作业

简简单单

我看JAVA 之 基本数据类型与封装类型

awen

Java 源码 基本数据类型

神操:凭借“阿里Java脑图”,成功斩获腾讯、蚂蚁、B站、字节、滴滴等5个Offer

Java架构师迁哥

三年Java开发,年底跳槽挂了阿里和字节,却收获美团offer,分享大厂面试心得

Java架构之路

Java 程序员 架构 面试 编程语言

我看JAVA 之 Thread & ThreadLocal

awen

Java 源码 多线程

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