AICon 北京站 Keynote 亮点揭秘,想了解 Agent 智能体来就对了! 了解详情
写点什么

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

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

关注

评论

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

实践总结:在 Java 中调用 Go 代码

写代码的西瓜

Maven的爱恨情仇

xcbeyond

Java maven

网站改版神秘公式,教你躲避改版陷阱

北柯

创业 网站 网站搭建 网站改版

分苹果

书旅

算法 LeetCode

SpringBoot系列(五):SpringBoot 日志配置(logback)

xcbeyond

Java 微服务 springboot logback

Junit执行单元测试用例成功,mvn test却失败的问题和解决方法

陈磊@Criss

libuv 异步模型之设计概览

Huayra

libuv 异步模型

守护进程

书旅

php 进程 守护进程

SpringBoot系列(六):SpringBoot 数据库操作(集成MyBatis)

xcbeyond

Java 微服务 mybatis springboot

如何从红蓝墨水中分离出红墨水?回声消除算法介绍

拍乐云Pano

音视频 WebRTC 回声消除 3A算法 音频技术

面试官:说下对cookie,session,Token的理解

Java小咖秀

Java 面试

MySQL explain 中的 rows 究竟是如何计算的?

架构精进之路

MySQL

应用研发平台特惠专场,助力企业加速数智化发展

移动研发平台EMAS

统一软件开发过程(RUP)的概念和方法

雯雯写代码

MySQL备份脚本,应该这么写

Simon

MySQL

一瓶可乐的自动售货机指令“旅程”

华为云开发者联盟

物联网 嵌入式 华为云 数据传输 无线通信

如何正确认识区块链?

CECBC

区块链价值 区块链应用

JavaScript中的正则表达式详解

华为云开发者联盟

Java 正则表达式 程序员 字符串 语法

终于知道Kafka为什么这么快了!

大头星

kafka 消息队列

MySQL中timestamp和datetime,你用的对么?

xcbeyond

MySQL 数据库 后端

Phalcon注解学习

Geek_4z9ami

php phalcon

智“营”时代,众盟科技荣膺“2020毕马威中国领先消费科技TOP50企业榜单”

人称T客

AI能写浙江高考满分作文了!在线满分作文生成器,一键圆你满分梦

程序员生活志

AI

如何写出完美的接口:接口规范定义、接口管理工具推荐

xcbeyond

Java 架构 接口规范

面试造火箭,看下这些大厂原题

前端有的玩

Java 面试 大前端

PHP之闭包函数

书旅

面向对象 闭包 函数

英特尔首席架构师Raja:一个“百亿亿次级计算能力惠及每个人”的时代正在到来

最新动态

免费DDoS攻击测试工具大合集

陈磊@Criss

年近而立,Java何去何从?

华为云开发者联盟

Java 开源 程序员 编程语言 Bugayenko Yegor

腾讯人均月薪7.5w,我这是又被平均了?

程序员生活志

腾讯 职场 薪资

分布式链路追踪Skywalking 存储模型设计

胡弦(关注公众号架构随笔录)

分布式 Skywalking 高性能 分布链路追踪

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