Python 还能承担下一个时代的发展重任吗?Mojo 语言的横空出世对 AI 研发生态有什么影响? 了解详情
写点什么

使用 JRuby 生成 JVM 代码

  • 2008-03-28
  • 本文字数:1753 字

    阅读完需:约 6 分钟

尽管 JRuby 的性能已经接近 CRuby 了,但有时它仍然不够快。CRuby 的用户可以使用 Ryan Davis 的 RubyInline 库,它提供了对 C/C++ 的内建支持以便更容易的产生 Ruby 的 C 扩展。来自 JRuby 阵营的 Charles Nutter 现在已经为 JRuby实现了一个RubyInline builder ,它可以即时编译嵌入的Java 代码。

下面是 Ryan Davis 提供的使用 C 编写的一个阶乘计算方法的示例

<pre id="g.ip">class MyTest<br id="gg56"></br> inline do |builder|<br id="a5to"></br> builder.c "<br id="o7i9"></br>  long factorial_c(int max) {<br id="dj:h"></br>  int i=max, result=1; <br id="rnt4"></br> while (i >= 2) { result *= i--; } <br id="j64w"></br> return result; <br id="xb.3"></br> }<br id="vq68"></br> "<br id="b7z2"></br> end<br id="d2ex"></br>end下面是 Charles 提供的相应的 JRuby 实现

<pre id="lj9x">class FastMath<br id="eg5a"></br> inline :Java do |builder|<br id="tt6-"></br>   builder.package "org.jruby.test" <br id="ewoj"></br> builder.java "<br id="s-qc"></br>  public static long factorial_java(int max) {<br id="k56e"></br>  int i=max, result=1;<br id="kbyq"></br>  while (i >= 2) { result *= i--; } <br id="fj21"></br> return result; <br id="wt2c"></br> }<br id="a3:d"></br>  "<br id="uf-w"></br> end<br id="fu0o"></br>endRubyInline for JRuby 的一个缺点在于其需要 Java 6 JDK(对于编译器),它可能还无法在所有系统上都可使用。

另一个可产生快速执行代码的方法就是直接产生 JVM 字节码。对于正常的应用来说,这听起来有些过激了,像编译器这样的字节码生成工具会从一个简单的字节码生成DSL 中获益,就像早前Charles Nutter 的博客中提到的那样。然而即便通过DSL 来生成字节码也并非易事。以下是 Charles 的博客中的一个例子:一个名为 bar 的方法将小写的 String 参数加到传进来的 ArrayList 中,下面就是产生的代码:

<pre id="fp3l">def test_class_builder<br id="e2jl"></br> cb = Compiler::ClassBuilder.build("MyClass", "MyClass.java") do<br id="d0-g"></br> [...] <br id="q2k4"></br> method(:bar, ArrayList, String, ArrayList) do<br id="jifn"></br>  aload 1 <br id="w:4j"></br> invokevirtual(String, :toLowerCase, String) <br id="psay"></br> aload 2 <br id="a-lu"></br> swap<br id="qomp"></br>  invokevirtual(ArrayList, :add, [Boolean::TYPE, Object]) <br id="n5w8"></br> aload 2 <br id="h.os"></br> areturn<br id="xg21"></br>end<br id="vw.6"></br>[...]Charles Nutter 还提供了一个新方案,这就是叫做 Duby 的新语言,它实现了 Ruby 语法的一个子集,增强了一些类型推断逻辑(请访问 Charles 的博客来了解更多信息),以此来生成快速的字节码。下面同样是计算阶乘的方法,这次是针对 Duby 编译器而写的。

<pre id="ggl8">class Fac<br id="wnkw"></br> def self.fac(max)<br id="t858"></br>  {max => :int, :return => :int}<br id="vd8-"></br>  i = max<br id="cknn"></br>  result = 1<br id="f1k-"></br>  while i > 1<br id="ioqm"></br>  result *= i<br id="upkk"></br>  i -= 1 <br id="pg:2"></br> end<br id="iho3"></br>  result<br id="yd-t"></br> end<br id="pn6r"></br>end这是一个原型,用来展现以一种类 Ruby 语言而不是一种新语言来实现类型推断的可能性。它还可被 JRuby 程序员所用,以避免因为性能问题而回退到 Java,或者用来实现 JRuby 本身的一些部分功能,这与 Squeak Smalltalk 的 Slang 很像,它是 Smalltalk 语言的一个子集,可以很轻易的转化为 C。Rubinius 计划使用叫做 Garnet(InfoQ已经就Cuby/Garnet 采访了Evan Phoenix )的类似方法。

现在,对于JRuby 来说,你想使用何种代码生成方式呢?

查看英文原文: Using JRuby to generate Code for the JVM - - - - - -

译者简介:张龙,同济大学软件工程硕士,现就职于理光软件研究所。主要从事文档工作流和办公自动化解决方案的研发工作。热衷于 Java 轻量级框架的研究,对敏捷方法很感兴趣。曾有若干年的 J2EE 培训讲师经历。参与 InfoQ 中文站内容建设,请邮件至 china-editorial[at]infoq.com

2008-03-28 01:29330
用户头像

发布了 88 篇内容, 共 254.3 次阅读, 收获喜欢 6 次。

关注

评论

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

数据分析与可视化在企业中的日常应用

夏日星河

玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具

Baidu AICLOUD

玖章算术与百度智能云达成合作,「NineData SQL 开发」成为百度智能云主推的数据库工具

NineData

数据库 百度智能云 云市场 玖章算术 NineData

车联网 CAN Bus 协议介绍与数据实时流处理

EMQ映云科技

物联网 mqtt canbus

互联网大厂2700道Java高频面试题(2023年最新版)不管你工作几年,都可以看看!

采菊东篱下

java面试

直播系统聊天技术(九):千万级实时直播弹幕的技术实践

JackJiang

网络编程 即时通讯 IM

Android SDK安全加固问题与分析

百度Geek说

android 安全加固 企业号 6 月 PK 榜 6 月 优质更文活动

一年省七位数,得物自建HFDS在 Flink Checkpoint 场景下的应用实践

得物技术

大数据 阿里云 成本优化

k8s实战案例之部署redis单机和redis cluster

不在线第一只蜗牛

k8s

AIGC+办公|大厂争先抢占高位的AI,开始“卷”打工人了吗?

TE产服

人工智能 办公 打工人 AIGC 生成式AI

如何使用 Terraform 和 Git 分支有效管理多环境?

SEAL安全

git Terraform

AIGC+设计|AI卖画,卖的是创意还是生意?

TE产服

人工智能 AIGC 生成式AI 平面设计

BI商业智能工具成宠儿,企业降本增效优质工具

夜雨微澜

鲸鸿动能荣获2023 TopDigital 3项大奖

最新动态

AI药物研发大赛培训来啦!清华博导讲解,高分基线等你来Fork!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨 百度飞桨

使用堡垒机的意义你知道吗?能解决哪些问题?

行云管家

网络安全 信息安全 堡垒机 数据泄露

从“云原生”到“比Flink快十倍”:RisingWave的寻找自我认知之旅

吴英骏

数据库 sql 流处理

解读 RocketMQ 5.0 全新的高可用设计

阿里巴巴云原生

阿里云 RocketMQ 高可用 云原生

低代码会是开发者的可选项

这我可不懂

开发者 软件开发 低代码 传统开发

vivo 自研鲁班分布式 ID 服务实践

vivo互联网技术

雪花算法 分布式ID UidGenerator Tinyid Leaf

SpringBoot 2 种方式快速实现分库分表,轻松拿捏!

程序员小富

分库分表 springboot ShardingSphere

一名中级程序员应该具备的技能

树上有只程序猿

编程 程序员 低代码 职业生涯 JNPF

香港云主机为你的业务注入强大的云端动力!

一只扑棱蛾子

香港云主机

华为云CodeArts TestPlan测试设计:守护产品开发质量之魂

华为云PaaS服务小智

云计算 软件开发 华为云 产品测试

svn提交规范,与Git相得益彰

互联网工科生

git svn

通过腾讯云SES服务发送邮件

排骨虾

腾讯云 #go 邮件通知

行云管家- 积极探索“AI+信息安全”的创新融合

行云管家

网络安全 信息安全 智能 AI智能

一定要看的前端codeReview规范指南

快乐非自愿限量之名

前端 技术框架

这些面试技巧,助你升职加薪、迎娶白富美

伤感汤姆布利柏

全球NDR市场“客户之声”首次发布:那些最挑剔的用户都选了谁?

Geek_2d6073

一次搞懂线性稳压器/LDO的工作原理

元器件秋姐

物理 电路 元器件 PCB 稳压器

  • 扫码加入 InfoQ 开发者交流群
使用JRuby生成JVM代码_Java_Mirko Stocker_InfoQ精选文章