阿里云「飞天发布时刻」2024来啦!新产品、新特性、新能力、新方案,等你来探~ 了解详情
写点什么

GE Energy 利用 InvokeDynamic 指令将 Magik 移向 JVM

  • 2012-12-25
  • 本文字数:2740 字

    阅读完需:约 9 分钟

今年 7 月,GE 能源管理业务(GE Energy Management)从 GE 能源集团分离出来。同月,其数字能源部门(Digital Energy)透露,他们正在将Magik(一种受Smalltalk 启发而设计的编程语言)从其专有的虚拟机MagikSF 移植向JVM。

Magik 是一种动态类型的面向对象语言,支持多重继承和多态。它最初出现于 1990 年,比 Java 还要早。Magik 已用于 GE 能源集团的 Smallworld 技术平台,而且该语言就是为实现面向企业设施(如配电)和电信的复杂应用而设计的。比如在电信领域,GE 能源管理业务有一款名为 Physical Network Inventory 的产品,支持电信公司规划和管理其铜线、光纤和电缆的电信网络。在企业设施方面,其产品 Electric Office 为配电公司提供了类似功能。

Magik 看起来非常像 Ruby。下面是一个简单的“hello world”例子程序:

复制代码
Magik> _for i _over 1.upto(3)
_loop
write("Hello world ", i)
_endloop

在 Ruby 中写法如下:

复制代码
1. upto(3) do |i|
puts("Hello world #{i}")
end

这两段代码的输出相同,如下:

复制代码
Hello world 1
Hello world 2
Hello world 3

虽然移植工作今年 7 月份才向外界透露,但 GE 能源集团的团队在一年之前——也就是 2011 年 7 月——就开始了概念验证工作,有一个小团队在工作中使用了 Java 7 的早期发布版本。 团队主管、架构师 George Marrows 向 InfoQ 说到,

这非常成功,从那时起我们就为产品发布版本而努力了。我们编写了 Magik 语言的解析器、编译器和运行时,集成了我们的大多数 C 库,并且使用 Java2D 编写了一个全新的图形子系统,所有新设计的组件都与现有系统高度兼容。

移植尚不彻底,不过移植版本已经能够运行完整的应用程序。最关键的是,考虑到 GE 能源集团的合作伙伴与客户所编写的数百万行 Magik 代码,移植版本的目标是完全兼容 MagikSF 版本,开发者只需要简单地在 JVM 移植版本上重新编译 Magik 源代码。Marrows 对我们说,“我们确信,我们的语言实现与 MagikSF 非常非常接近,我们的库支持也做得非常好,而且随着运行的 Magik 代码越来越多以及不断修复不兼容的地方,改进也在持续进行。”

正如你所预料的那样,考虑到 Magik 的动态类型系统,移植版本大量使用了 Java 7 的 invokedynamic 字节码指令。Marrows 说到,

我们大量使用了 invokedynamic,不仅是在明显的方法分派(method dispatch)中,在将复杂字面量绑定到其使用位置以及解析全局变量时也有所应用。Duncan MacGregor 在团队中负责这项工作——使用 invokedynamic,他一度发现几乎每周都有性能改进。

invokeDynamic 和 java.lang.invoke 的使用体验非常好。我们可以将其看做 JVM JIT 编译器方法内联功能的一个 API,就这一点而言,它非常出色。我们惊喜地看到,自从去年 Java 7 的第一个版本发布以来,几乎每次更新都能带来一些性能改进;而且看起来我们还可以从 Java 8 的“lambda form”工作中继续获得改进。

从技术角度看,JVM 的很多功能 MagikSF 是不支持的,比如

  • MagikSF 是解释型的,而 JVM 支持 JIT 编译。
  • MagikSF 使用的是绿色线程,而 JVM 使用原生线程。
  • MagikSF 只支持 32 位,而 JVM 也支持 64 位。
  • MagikSF 有自己的垃圾收集器,其垃圾收集器是分代的,但并非并发垃圾收集器;而在 Hotspot 虚拟机中,Java 支持多种垃圾收集器,大多是并发收集器。

当然,像 Oracle 和 IBM 等大型软件厂商所贡献的大量资源和专家经验也让 JVM 获益良多。

Marrows 的团队看到的性能改进结果令人印象深刻:在他们运行的大多数基准测试中,Java 移植版本的速度已经有所超越,有些情况下性能改进高达 30 倍。就像 Marrows 所指出的那样,随着时间的推移,invokeDynamic 和 JVM 的性能不断改进,他们的项目也相应获益,诸如在 Java 7 update 9 上要比在 Java 7 update 2 上执行得更好。更重要的是,作为 Java 8 Lambda 项目的一部分,Oracle 重新设计了 invokeDynamic;而且这一版本正在被向后移植到 Java 7 中(按照计划,该特性将包含在即将发布的 update 12 中)。尽管 Marrows 告诉我们,有些代码实例表明,相对于 update 9,在 update 12 上运行当前测试构建时性能有些劣化,但是在很多情况下新版本会快得多;这点他们会与 Oracle 的团队讨论。到目前为止,Marrows 的团队从 Oracle,特别是 JSR 292 专家组的 Rémi Forax 那里得到了极大的支持,Rémi Forax “帮助我们开始使用 JSR 292,而且在 MLVM(multi-language virtual machine)邮件列表中,他是一位不知疲倦的贡献者”。

虽然最初没有相应计划,但团队现在还是通过混用 JNI 和 Java 2D 的方式移植了图形系统——“将 JNI 与 C 库继承,可以访问我们的数据库并执行优化的几何与其他计算。Java 2D 渲染贴图和 UI。”

该团队最终实现的从 Java 到 Magik 的内置的互操作还相当不错,Java 2D 所支持的图形系统中大量使用了这一特性。比如:

复制代码
def_slotted_exemplar(
:line_style,
{ { :colour, colour } },
{ :simple_style_mixin},
{:|com.gesmallworld.magik.commons.drawingsurface.LineStyle|})
$
_private _method line_style.|getColour|()
>> .colour
_endmethod

|getColour|中的竖线用于保留 Java 代码里的大小写,因为 Magik 是不区分大小写的。

而从 Magik 到 Java 的互操作就不是那么方便了,需要开发者编写包装代码。

复制代码
public class Char16Vector {
@MagikInitialiser
public static void exposeThisClass() {
//Expose an instance of this class to Magik
}
@MagikMethod(name="nth()")
public Char16Vector nth( Integer index ) {
return new Char16Vector(value.substring(index-1, index));
}
}

Nashorn 是 Oracle 的新 JavaScript 实现。利用 Dynalink 库,它能够更清晰地实现该功能。Jim Laskey 在其博客上提供了一个很好的例子,通过 Twitter4J 库,使用 Nashorn 与 Twitter 交互,可以很好地实现上述功能。Marrows 告诉我们,Dynalink 就是他和团队想要看到的东西。

除了能够使用 Java 虚拟机之外,该团队发现跑在 Java 平台上还有其他的优点。Marrows 在 JavaOne Brazil 大会上提到,能够接近 Java 开发者并使用 Java 类库,这也是优势。此外他告诉我们,

…我们非常欣赏 JVM 带来的力量和灵活性,这能够支持我们未来所要进行的任何改进。

更一般的意义是,我们趁此机会简化并替换了我们迄今为止所开发的 MagikSF 环境的某些部分,如图形支持和文件 I/O 等。我们认为这种事情以后做的话,工作量只会多不会少。

JVM 上的语言越来越多,Magik 就是其中之一,其他还包括 Groovy、Jruby 和 Nashorn 等,这些语言都用到了 invokeDynamic 指令。JSR 292 真正帮助 JVM 成为一种通用的编程语言环境。

参考英文原文 GE Energy Uses InvokeDynamic to Bring Magik to the JVM

2012-12-25 02:061307
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 130.2 次阅读, 收获喜欢 34 次。

关注

评论

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

朋友乔迁住新房 禧大福酒竟成为宴席最大赢家

Geek_50a546

公安情指勤合成作战系统搭建,情报指挥系统搭建

项目进度管理 | 如何为项目制定里程碑?

万事ONES

项目管理 研发管理 研发管理工具 ONES

警惕商标到付快递的骗局

石云升

商标 诈骗 6月日更

网络研讨会|想弄明白应用安全?我们为你准备了5个锦囊!

鉴释

DevSecOps 安全编码规范 应用安全 静态分析

全面赋能泛娱乐社交场景

anyRTC开发者

音视频 WebRTC 泛娱乐社交

一文讲全了Python类和对象内容

华为云开发者联盟

Python

线上程序cpu占用过高、程序死锁,该如何定位问题?

码农架构

重塑价值:新一代ITSM平台的建设、咨询与实施

云智慧AIOps社区

ITSM 智能运维

为什么服务实例在隔离之后还在继续处理请求?

BUG侦探

TCP 半关闭连接 接收缓存

初探Deno.js

★忆先★

deno

校友会小程序开发笔记五:找校友功能模块设计与实现

CC同学

校友录小程序

专访关涛:阿里EB级大数据体系,背后的计算平台竟是这样(采访提纲)

花花

试用期 签约计划

使用 Python 对数据进行压缩

★忆先★

Python3.10中的结构化模式匹配语法

★忆先★

Python

保姆级教学,22张图揭开ThreadLocal

程序猿阿星

内存泄露 ThreadLocal 线程安全 弱引用 ThreadLocalMap

Linux 中实用但很小众的 11 个炫酷终端命令

学神来啦

云计算 Linux 运维 linux运维 网络运维

Python——字典的遍历

在即

6月日更

JAVA笔记(四)--三大结构语句

加百利

Java 后端 6月日更 结构语句

智慧水务|大坝水利可视化管理,综合态势一屏掌握

一只数据鲸鱼

数据可视化 智慧水务 三维可视化 水利 水力发电

向996宣战!快乐工作,健康生活的互联网要来了吗?

架构精进之路

话题讨论 话题 996 6月日更

Android客户端网络预连接优化机制探究

vivo互联网技术

android TCP HTTP

使用poetry进行Python项目开发

★忆先★

Python

Keepalived+Nginx 搭建高可用集群

逸少

nginx 高可用 keepalive

算法导论的道与术、工程师思维奠定能走多远-John 易筋 ARTS 打卡 Week 51

John(易筋)

ARTS 打卡计划

技术实践 | 如何基于 Flink 实现通用的聚合指标计算框架

网易云信

框架 flink 执行

一文介绍备机重建各种方法的实现机制

华为云开发者联盟

主机 集群 GaussDB(DWS) 备机重建 备机

HarmonyOS Connect伙伴峰会于厦门举办 硬件生态快速发展

科技汇

用 Go struct 不能犯的一个低级错误!

煎鱼

Go 语言

Java 连接操作 MySQL 数据库(增删查改操作)

若尘

MySQL 数据库 java编程 驱动 6月日更

第一次见家长送禧大福酒好吗?

Geek_50a546

GE Energy利用InvokeDynamic指令将Magik移向JVM_Java_Charles Humble_InfoQ精选文章