写点什么

给 JVM 加上长程跳转、尾调用和元组

  • 2007-09-26
  • 本文字数:1189 字

    阅读完需:约 4 分钟

John Rose 在今年夏季撰写了一系列文章,Charles Nutter称这些是“与JVM 未来发展方向以及一系列新版Java 潜在变化相关的令人兴奋的文章。”虽然John 确实谈到对Java 语言的影响,但文中的重点是虚拟机。这些改进对于在JVM 中为其他语言提供支持来说都是非常重要的,包括函数性语言和动态语言在内。

在文章的开头,John Rose描述了长程跳转(longjump)特性(或称为非本地退出,non-local exit),这项特性使在Java 语言中实现闭包成为可能。如果给异常处理机制加上预分配(如克隆)的跟踪栈,就有可能实现非本地退出,而不必为了流程控制支付高昂的异常处理的代价。如果实现得好,非本地退出的代价可以低于本地退出/ 返回(return)的3 倍,并能够被优化成机器级的goto 指令。在Java 7 的一个版本中,就用了这种方法来优化Object.clone() 的执行成本

接下来,John 阐述了 JVM 中的尾调用(tail call):即以一种明确的方式来来压缩尾递归的能力(“硬尾调用”),或仅作为一种编译器最优化(“软尾调用”)。这篇文章引起了对实现方法和用途的热烈讨论,不过尾调用对 JVM 上的函数性语言(或具备某些函数性特征的语言)肯定有所帮助,也会有利于从 invokedynamic (JSR-292) 得益的动态语言:

尾调用也会影响到 invokedynamic。硬尾调用让你在实现动态调用上有更多的选择:你可以转向到一段负责派发的分支例程,该例程随后会以尾调用返回到正常的例程上。(实际上,这就是 java.lang.reflect.Method.invoke 目前的工作原理,至少在返回值没有被装箱的情况下是如此。)因为 Scheme 是一种动态语言,所以尾调用与 JSR 292 有一点关系。

最后,John 谈到了元组(Tuple)。他翻出了早在 2004 年就提出的一个提议,里面描述了“纯粹的”元组类型(简单元组)和具备元组语义的值类(value class),这种值类不需要记得它的类型身份(即成为标记元组,tagged tuples)。元组也意味着支持具有多个返回值的方法。再一次,重点在于 JVM 而不是 Java 语言是很清楚的:

加上了元组特性的语言,很可能会在一组具有类型的值,以及指向这些值所在堆对象的引用之间提供规范的翻译。比方说,每个值类很可能都有一个构造器,其参数签名就是相应的标记元组。元组很可能被实现成堆中的固定长度的对象数组,或者是不可变的泛型工具类(generic immutable utility class),里面包含着装箱后的基本类型值成员(就像 varargs 中一样)。

这篇文章的讨论也一样很热烈,John 在讨论中回应说:

实际上在 Java 语言中加入值类会遇到困难的设计问题,正如你清楚指出的那样。我写此文的意图是指出,在 JVM 中添加元组是非常简单的,并且不需要解决语言设计方面的问题。

你对这些提议有没有共鸣呢?你是更想看到 JVM 增加对其他语言的支持,还是 Java 语言的演进?还是说这两个目标并没有冲突? InfoQ 会继续跟踪这些主题的最新发展。

看英文原文: Longjumps, Tailcalls, Tuples for the JVM

2007-09-26 20:05868
用户头像

发布了 74 篇内容, 共 12.6 次阅读, 收获喜欢 3 次。

关注

评论

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

数据可视化界的小公主:cutecharts,入门+实战应用

老表

Python 数据可视化 11月日更 实战案例 cutecharts

几个高效做事的法则,让你的一天有 25 小时

程序员鱼皮

Java c++ 效率 大前端 高效

微帧Film Grain编码技术,致敬电影胶片颗粒的独特魅力

微帧Visionular

视频编解码

Apache ShardingSphere 企业行|走进转转

SphereEx

ShardingSphere SphereEx Apache ShardingSphere 转转

Linux一学就会之Linux环境搭建并安装VMware虚拟机

学神来啦

Linux centos 运维 vmware

Python代码阅读(第62篇):列表是否包含相同元素判断

Felix

Python 编程 列表 阅读代码 Python初学者

CRM与ERP之争,谁能在“企业数字化转型”的趋势中胜出?

优秀

低代码 CRM ERP

安全稳定高效节约的云运维软件哪个好?咨询电话多少?

行云管家

云计算 公有云 混合云 云管平台 云运维

Hadoop 生态里,为什么 Hive 活下来了?

大数据技术指南

11月日更

Apollo生产环境整合springboot

小鲍侃java

11月日更

百度Q3财报:百度智能云同比增长73%,稳居中国四朵云之一

百度大脑

人工智能

驴行千里不洗沙尘,尚硅谷Spark性能调优教程发布

编程江湖

大数据 spark

微服务的灾难:拆的很爽,但服务太小...

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

Aeron是如何实现的?—— Ipc Publication

BUG侦探

Aeron Ipc Publication

恒源云(GPUSHARE)_云GPU服务器如何使用VSCode?

恒源云

人工智能 深度学习

用户增速与体验质量并存,博睿数据携阿里云发布双十一电商网站用户体验报告

博睿数据

带你了解AKG正反向算子注册+关联流程

华为云开发者联盟

算子 AKG 正向算子 反向算子 算子注册

论文解读丨无参数的注意力模块SimAm

华为云开发者联盟

卷积神经网络 视觉 注意力模块 SimAm 神经元

智能云分支(Cloud Intelligent Branch)方案正式发布!

阿里云 云网络 智能化 发布会

阿里云发布云原生加速器,携手生态企业拥抱数字时代

阿里巴巴云原生

阿里云 云原生 企业 合作伙伴 创投

3分钟搞定 web人脸识别登录,这样式爱了

程序员小富

Java 编程 人脸识别 springboot 毕业设计

微信和QQ这么多群,该如何管理好友关系?

Tom弹架构

Java 架构 设计模式

Redis为什么需要强一致?技术揭秘秒杀活动如何限流

华为云开发者联盟

redis 开源 华为云 强一致 MySQL组件

“低代码”是什么?低代码平台如何助力企业实现数字化转型?

优秀

低代码

解决 Serverless 落地困难的关键,是给开发者足够的“安全感”

阿里巴巴中间件

阿里云 Serverless 技术 云原生 中间件

HBase 的预分区及 rowkey 设计技巧

五分钟学大数据

11月日更

群雄“逐鹿”风采显露:2021信创“大比武”鲲鹏赛道总决赛火热来袭

科技热闻

LifseaOS 悄然来袭,一款为云原生而生的 OS

阿里巴巴云原生

阿里云 云原生 操作系统 LifseaOS

青海西宁市正规等保测评公司名单汇总-行云管家

行云管家

网络安全 等级保护 等保测评 过等保

JAVA应用生产问题排查步骤

热爱java的分享家

Java 架构 程序人生 编程语言 经验分享

The Data Way Vol.6|我不是开发者,但我依然向往开源

SphereEx

开源 开发者 播客 ShardingSphere SphereEx

给JVM加上长程跳转、尾调用和元组_Java_Geoffrey Wiseman_InfoQ精选文章