GraalVM上的多语言混合开发

上篇文件我们介绍了GraalVM强大的静态编译功能,能够让Java应用程序摆脱虚拟机的束缚,像其它本地编译的应用一样直接运行。那么GraalVM的神奇之处仅限于此吗?今天我们再来看看它的另一个重要特性—多语言混合开发

多语言平台

Java并不是唯一运行在JVM上的语言,这个我们都应该比较清楚了,比如Kotlin,Scala,Groovy这些其实都是运行在JVM之上的。这样语言不管上层语法千差万别,但最终都会被编译器(javac,kotlinc等)编译成符合JVM规范的字节码,所以它们能跑在JVM上,并且可以相互调用其实并不让人意外。

理论上任何上层语言都能够通过一定的转换,变成符合标准JVM规范的字节码,从而运行在JVM平台之上,但编写这样的编译器的成本非常高,而且受限于JVM字节码的结构何规范,有些语言特性可能也没办法很好的支持。因此GraalVM实现多语言平台采用了另一种方式,绕开了JVM字节码的限制,我们先来看一下官方给的架构图:
在这里插入图片描述
在这张图上,不但GraalVM不但能跑Kotlin,Scala这类传统的JVM语言,还有JS, Python, Ruby这样的脚本语言,甚至还有C和C++ 。初看起来确实很让人惊讶,不过先别急,我们慢慢来分析一下其中的原理。这张图底层的部分,Graal编译器,JVMCI,Hotspot JVM上一篇文章都讲过了,不理解的同学可以再翻一下之前的文章。我们重点来看一下Truffle这个新出现的框架。

这个东西显然是实现多语言平台的关键,官方对它的定义有点拗口,简单的说它是一个用于开发某种语言(比如JavaScript)的解释器的一套工具和框架,让不同的语言能够方便的实现自己的解释器,从而将各语言的源代码都能够解析成一种统一的数据格式,而这种数据格式是一种self-modifying Abstract Syntax Trees(AST,抽象语法树)。为了便于理解,你可以简单的认为它就是其它语言编译后的字节码(都是某种中间格式),Truffle框架还提供运行层面的支持,可以直接解释执行这样的AST,从而实现多语言运行在JVM之上。因此要将一门现有语言搬到GraalVM上来运行,你只需要使用Truffle框架为该门语言编写一个Interpreter(解释器),是不是看起来很简单?GraalVM官方目前也已经实现了包括JavaScript,Python等在内的多个Truffle解释器(GraalJS,GraalPython等),可以直接供开发者使用。

在这里插入图片描述
如果仅仅是这样,那么大家可能觉得这仅仅只是一个小玩具而已,毕竟通过解释器来执行脚本语言性能肯定很拉跨,完全无法和原生平台的执行效率相提并论。但不要小看GraalVM的雄心壮志,我们都知道JVM经过这么多年的发展,在编译优化,内存管理(垃圾回收)这些方面都有着非常强悍的积累(go的垃圾回收器的性能表现就长期不如Java),这才是运行在JVM之上的语言的真正的优势所在。但怎么让这些解释执行的脚本语言也享受JVM的优化呢?答案是JIT,JIT的概念这里就不多介绍了,我们再来看一张图,以Javascript和Java为例,看看它们在GraalVM上的执行细节

运行细节

先来看Java的执行路径,首先由javac编译成字节码,然后JVM的解释器一边解释执行,一边收集运行时信息,当部分代码达到阙值的时候(调用次数等统计指标)就会触发JIT编译,JVM将此部分代码通过Graal编译器编译成本地机器码,然后替换自身缓存中的此部分字节码,从而提升该部分代码的执行效率。JVM和JIT编译器之间通过JVMCI规范的接口进行交互,所以这里的Graal编译器也可以替换成传统的C1或者C2编译器。Kotlin,Scala等语言的执行方式也基本是这样。

再看一下Javascript,源码首先会被基于Truffle实现的JS解释器转换成内存中的AST格式,然后就可以被Truffle内部的解释器解释执行了,而Truffle也会像JVM一样,统计收集运行时信息,并将热点代码发送给Graal编译器去编译成本地机器码,最终将编译好的机器码替换AST中的相同部分,所以现在明白为什么叫做self-modifying Abstract Syntax Trees吧,这个AST树是能够自修改的。所以基于Truffle框架执行的三方脚本语言,也能享受到JIT编译器的各种优化,性能比纯解释执行要高出很多。而且Truffle是一个完全用Java编写的框架,所以它可以直接运行于底层的JVM之上。

上面的图还有一个Graal IR的东西,这个是个什么东西呢?这个主要是为了让Graal编译器能够实现语言无关的特性而使用的一种中间表示形式,不管是JAVA的字节码还是Javascript的AST,在Graal编译器内部都会被表示为Graal IR,然后对这种格式进行编译优化,最终形成机器码。

通过精心的设计和优化,在GraalVM上执行三方语言,性能已经非常接近原生平台了,部分场景下甚至会超过原生的平台。下图就是GraalVM官方对于Javascript执行性能与V8(公认最强的JS执行引擎)的对比:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/782729.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

仿qq音乐播放微信小程序模板源码

手机qq音乐应用小程序,在线音乐播放器微信小程序网页模板。包含:音乐歌曲主页、推荐、排行榜、搜索、音乐播放器、歌单详情等。 仿qq音乐播放微信小程序模板源码

【前端界面分享】

实现效果:html源码来自b站up主:【CSSJS】甲方:啊?没叫你做那么超前啊_哔哩哔哩_bilibili 本人仅实现了将html格式改为vue3 html版: 对于前端连入门可能都没摸到,学了半天也就改成vue3了,对于输…

PCB阻抗控制为何如此重要?

或许你在各个厂商打PCB板的时候,会遇到询问你是否需要阻抗的的下单需求? 在当今的应用中,设计通常变得越来越快,控制布局参数比以往任何时候都更加重要。 在PCB设计和生产过程中,有几种方法可以进行阻抗控制。最常见的…

介绍一款Java开发的商业开源MES系统

介绍一款Java开发的开源MES系统,万界星空科技开源的MES系统。该系统基于Java开发,具有广泛的适用性和高度的可定制性,能够满足不同行业、不同规模企业的智能制造需求。 一、系统概述 万界星空科技开源的MES系统是一款面向制造企业车间执行层…

限流实现-小工具

需求描述 写一个1秒两个的限流工具类,2r/s public class LimitHelper {private int maxLimit;private Semaphore semaphore;private int timeoutSeconds;public LimitHelper(int maxLimit, int timeoutSeconds) {this.maxLimit maxLimit;semaphore new Semaphore…

产品经理-的职业发展(9)

找一份好工作,就是为了获得更好的职业发展,下面分别给大家介绍下大、中、小型公司的职业发展路径 中小型公司 中小型公司的规模往往相对不大,又处于飞速发展过程中,培养体系和晋升标准都不够成熟,所以实际的职业发展路…

如何大幅减少 Vue.js 中的包大小和加载时间,提升用户体验!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 你知道吗,根据Google 的一项研究,如果网站加载时间超过 3 秒,53% 的移动用户会离开该网站? 性能优化是一个经常讨论的话题,但很多开发人员并不关心提高应用的速度。 在前端开发中,优化包大小和加载时间对于提升用户体…

电力设备巡检管理系统

电力设备巡检管理系统是一种基于计算机技术和网络通信技术的智能化管理系统,旨在提高电力设备巡检的效率、准确性和安全性。以下是对该系统的详细介绍: 一、系统概述 电力设备巡检管理系统通过实时采集、传输和分析电力设备的数据,帮助电力企…

基于java+springboot+vue实现的在线课程管理系统(文末源码+Lw)236

摘要 本文首先介绍了在线课程管理系统的现状及开发背景,然后论述了系统的设计目标、系统需求、总体设计方案以及系统的详细设计和实现,最后对在线课程管理系统进行了系统检测并提出了还需要改进的问题。本系统能够实现教师管理,科目管理&…

哪款护眼大路灯比较值得入手?五款值得入手的护眼大路灯推荐

哪款护眼大路灯比较值得入手?选择一款优质的大路灯很重要!而对于市面上五花八门的大路灯型号,这给刚了解大路灯的萌新们增加了难度,为了帮助大家准确的寻找到一款合适的大路灯,我也是花费多个月实测了市面上比较热门的…

@金融安全专业人士和风险管理决策者,必读白皮书现开放免费下载!

加快建设金融强国,是中国经济长远发展的战略抉择,更是在经济全球化进程中维护国际金融安全的重要举措,而防控金融风险是建设金融强国的重要保障。 本月最新发布物,聚焦「安全」主题,尤其为金融行业的安全专家&#xff…

【计算机毕业设计】018基于weixin小程序实习记录

🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板&#xff…

elasticSearch快速了解

elasticSearch:经常用于搜索引擎,我们用的百度搜索和github上的搜索都是用的搜索引擎,它是对输入内容进行分析,然后查询,不像数据库模糊搜索的like一样必须含用你输入的全部内容。 elasticSearch优势:支持…

ideaSSM校医院管理系统-计算机毕业设计源码82325

基于ideaSSM校医院管理系统设计 摘 要 随着信息技术的快速发展和广泛应用,传统的校医院管理模式已经难以满足日益增长的管理需求和服务质量要求。为了提升校医院管理效率和服务水平,本文提出了一种基于IDEASSM的校医院管理系统设计方案。该系统以先进的…

SQL 创建一个actor表,包含如下列信息

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享给你的码吧。 描述 创建一个acto…

CentOS 安装 annie/lux,以及 annie/lux 的使用

annie 介绍 如果第一次听到 annie 想必都会觉得陌生,annie 被大家称为视频下载神器,annie 作者介绍说可以下载抖音、哔哩哔哩、优酷、爱奇艺、芒果TV、YouTube、Tumblr、Vimeo 等平台的视频。 githup:https://github.com/pingf/annie 支持…

『C++成长记』string模拟实现

🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ ​ 目录 一、存储结构 二、默认成员函数 📒2.1构造函数 📒2.…

认证资讯|Bluetooth SIG认证

在当今高度互联的世界中,无线技术的普及已经成为我们生活和工作中不可或缺的一部分。作为领先的无线通信技术之一,Bluetooth技术以其稳定性、便捷性和广泛的应用场景而备受青睐。然而,要想在激烈的市场竞争中脱颖而出,获得Bluetoo…

景联文科技打造高质量图文推理问答数据集,赋能大语言模型提升推理能力

大语言模型在处理推理任务时,不同于人类能够反思错误并修正思维路径,当它遇到自身知识盲区时,缺乏自我校正机制,往往导致输出结果不仅无法改善,反而可能变得更不准确。 需要依赖外部的知识库和推理能力来克服其在理解和…

Java锁升级:无锁 → 偏向锁 → 轻量级锁 → 重量级锁

说明 JDK1.6为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在JDK1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以…