写点什么

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

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

关注

评论

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

PingCode 第四届开发者大会成功举办

爱吃小舅的鱼

软件开发 开发 PingCode

文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题

福大大架构师每日一题

福大大架构师每日一题

校园物业报修小程序开发笔记一

CC同学

CQ 社区版 V2.5.0 发布 | 开放在线试用、自定义高危操作、新增数据源Phoenix、Trino等

BinTools图尔兹

oceanbase 数据库管控 polarDB trino CloudQuery

Mac电脑轻级思维导图软件 iMap Builder免激活中文版

mac大玩家j

思维导图 Mac软件 mac思维导图 思维导图软件

Premiere Pro 2024 for Mac(pr 2024视频编辑软件)v24.0完美激活版

mac

苹果mac Windows软件 视频编辑软件 Premiere Pro 2024 pr2024

盘点帮助系统的需求,提升用户的体验

AlexLei

帮助中心 帮助系统 帮助体系

FabFilter Total Bundle 2023 for Mac(音频插件合集)修复版 v2023.06.29完整激活版

mac

苹果mac Windows软件 FabFilter 2023 Total FabFilter 插件

云游长江大桥,3DCAT实时云渲染助力打造沉浸化数字文旅平台

3DCAT实时渲染

元宇宙 实时渲染 元宇宙解决方案

创建CI/CD流水线中的IaC前,需要考虑哪些事项?

SEAL安全

DevOps CI/CD IaC 企业号10月PK榜

华为云CCE产品文档优化升级

华为云原生团队

云计算 容器 微服务 云原生

某头部证券公司决策:为什么首选 CloudQuery 数据库管控平台?

BinTools图尔兹

案例 数据库安全 客户体验

三维可视化神器带来无限可能,原来三维场景也可以如此轻松实现

袁袁袁袁满

人工智能 三维城市建模

开源合规标准实践-“心寄源”法律沙龙(2023第六期 | 总第十一期)成功召开

开放原子开源基金会

惊艳,根本停不下来!GPT-4 全工具模式开始测试

豆哥

多模态 openai ChatGPT GPT-4

一文读懂多云CDN

火山引擎边缘云

CDN CDN加速 CDN技术 CDN带宽

Python 日期和时间处理教程:datetime 模块的使用

小万哥

Python 程序员 软件 后端 开发

mac电脑温度和风扇速度控制工具 TG Pro最新激活版

胖墩儿不胖y

Mac软件 系统监控软件

人工智能之从零理解人工神经网络

珲少

Nacos注册中心有几种调用方式?

王磊

Java 面试

非线性中国式报表引擎NopReport源码解析

canonical

低代码 中国式报表 可逆计算 Nop平台 报表引擎

Linux rm命令:删除文件或目录

芯动大师

【新产品】DPEasy 一款高效的数据库安全风险扫描工具,即将上线!

BinTools图尔兹

数据库 数据库安全

聚合支付重构

xzy

不同版本OpenJDK 源码调试方案

AiDaddy

Openjdk 远程调试 源码调试 openjdk 源码调试

EVE-NG的环境导入QEMU组件了解一下

小魏写代码

ES6新特性(五)

阡陌r

JavaScript class ES6

Linux cp命令:复制文件和目录

芯动大师

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