官方说明:

GraalVM是一个生态系统和共享运行时,不仅提供基于JVM的语言(如Java,Scala,Groovy和Kotlin)的性能优势,还提供其他编程语言(如JavaScript,Ruby,Python和R)的性能优势。此外,它还支持通过LLVM前端在JVM上执行本机代码。GraalVM 1.0基于JDK 8。

上图说明了GraalVM作为开放式生态系统的体系结构。

虚拟化层代表GraalVM提供的编程语言。客户编程语言(即JavaScript,Ruby,R,Python和LLVM bitcode)在与基于主机JVM的应用程序相同的运行时中的执行现在是脚踏实地的。宿主语言和客户语言可以直接相互操作,并在同一存储空间中来回传递数据。

底部展示了适用范围。GraalVM既可以独立运行,也可以作为OpenJDK或node.js平台的一部分进行嵌入,甚至可以嵌入MySQL或Oracle RDBMS等数据库中。

GraalVM 1.0版本包含语言解释器:

  • 基于JVM的语言,如Java,Scala,Groovy或Kotlin
  • JavaScript(包括node.js)
  • 编译为LLVM bitcode的语言,如C,C ++或Rust
  • Ruby,R和Python的实验版本

GraalVM包括以下组件:

  • Graal:一种动态即时(JIT)编译器,通过独特的代码分析和优化方法提高应用程序的效率和速度。
  • Graal Polyglot API:用于在共享运行时中组合编程语言的API。这些API允许您根据需要匹配编程语言,并使用更少的资源为您提供更好的性能。
  • Graal SDK:一组用于嵌入Graal语言和配置本机映像的API。
  • Oracle HotSpot Java虚拟机(JVM):基于JVM的语言和支持的客户编程语言的运行时环境。

ShowTime:

  配置篇:

  看完了激动人心的介绍之后,我果断选择了前去尝试。作为一个重度java患者,对于Oracle的东西还是比较有兴趣的。下面是他的官网,长这个样子,总体来说,UI设计师还是不错的。至少我喜欢这个风格。

  我们继续顺着首页向下看。官网以一段Node代码,向我们展示了,GraalVM的优越性,我们可以很明显的发现,在这段代码中我们兼容了3种不同的语言。为我们提供了极大的便利性。

  接下来,我们介绍下,java方面的优化,GraalVM允许您提前将程序编译为本机可执行文件。生成的程序不在Java HotSpot VM上运行,而是使用必要的组件,如内存管理,来自虚拟机的不同实现的线程调度,称为Substrate VM。Substrate VM是用Java编写的,并编译成本机可执行文件。与Java VM相比,生成的程序具有更快的启动时间和更低的运行时内存开销。

  这张图中我们,很明显的看到,java的编译时间被缩短了,14倍。当然这是它官方提供的数据。一切以我之后的测试数据为准。

  说了这么多,越说越激动,我迫不及待的下载了,这个东西了。去了趟官网。这家伙提供了社区版和企业版,我第一次尝试的是社区版,然后很不负众望的失败了。后面我果断百度了下,度娘也不是万能了,大多数“玩家”用的都是Mac这让我很头疼。不过索性我在官方的文档上面找到了解决方法。

  

  在官网注册账号成功之后,会自动下载,然后我把它拖到了,我的虚拟机中。

  然后执行如下操作:

  1.随意选择一个文件夹,执行解压命令,会看到一堆解压的数据。如果桌面上出现图三的文件夹则标志着成功。

     

                                       图三

  2.接下来为这个虚拟机配置运行环境,因为我是linux的系统,所以我就选择了第一行的配置项目。格式如下:

export PATH=/path/to/graalvm/bin:$PATH

 在我的机器上配置出来的效果是:

其中:/home/gjt/Desktop/graalvm-ee-1.0.0-rc4/bin是我的安装路径。

export PATH=/home/gjt/Desktop/graalvm-ee-1.0.-rc4/bin:$PATH

出现如下界面,即为配置成功。

  操作篇:

  做完了,虚拟机的配置,接下来就是针对基础代码的测试了。

  java代码:

  执行新增命令,打开一个文件。

  

  这是我编写的基础代码

  

  然后用javac编译,然后java编译执行:

  

  之后我们尝试官网的native-image方式运行,发现了错误,

  

  无奈,鉴于网上的参考资料很少,我选择了去官方的git上issue寻找答案。

  果然还是有同道中人的,这是Oracle官方人员给出的修复答案。

  

  我决定抱着试一试的心态,开始了尝试。

  

  再次执行编译。

  

  最终我还是成功的编译了这个HelloWord文件,

  接下来最激动人心的时刻到了。

  图一是经过native-image过后的启动时间。

  

                                                图一

  图二是传统java启动时间。

  

                                            图二

  

  速度得到了明显的提升。

  我们可以看到经过镜像加速之后的代码速度得到了明显提升。

  官方的解释是:GraalVM可以将Java字节码编译为本机映像,以实现更快的启动速度和更小的应用程序占用空间。所以,本机映像比直接在JVM上运行相同代码要快得多:

  最后的操作:

    测试完java代码之后我们测试一波js代码,很明显基本的js语法都已经支持了。

                  

    再来一波Node代码,

    测试代码:

var http = require('http');

http.createServer(function (request, response) {
// 发送 HTTP 头部
// HTTP 状态值: 200 : OK
// 内容类型: text/plain
response.writeHead(200, {'Content-Type': 'text/plain'}); // 发送响应数据 "Hello World"
response.end('Hello World\n');
}).listen(8080); // 终端打印如下信息
console.log('Server running at http://127.0.0.1:8080/');

    

    最后,我们尝试一下它的其他特性:

    在下面这段代码中,我同时使用了js的语法。

    

    这就不得不提一下Polyglot。

    Polyglot工作原理

    GraalVM允许您使用无缝方式编写多语言应用程序,以便将值从一种语言传递到另一种语言。使用GraalVM时,不需要像其他多语言系统一样进行复制或编组。这使您可以在跨越语言边界时实现高性能。大多数情况下,完全没有语言边界的额外费用。

开发人员通常不得不做出令人不舒服的妥协,要求他们用其他语言重写他们的软件。例如:

  • “那个图书馆没有我的语言版本。我需要改写它。“
  • “这种语言非常适合我的问题,但我们无法在我们的环境中运行它。”
  • “这个问题已经用我的语言解决了,但语言太慢了。”

    使用GraalVM,我们的目标是允许开发人员自由选择适合手头任务的语言而不会妥协。

    为了提供外语多语言值,我们开发了所谓的多语言互操作性协议。该互操作性协议由一组标准化消息组成,每个Graal语言实现并用于外部多语言值。该协议允许GraalVM支持任何语言组合之间的互操作性,而无需彼此了解。我们计划逐步改进协议,以便随着时间的推移支持越来越多的功能。

有关详细信息,我们建议您阅读:

    详情参考:https://www.graalvm.org/docs/reference-manual/polyglot/   

    弱化主语言

    GraalVM开发了一个实验性的启动器「polyglot」。在polyglot里面不存在主语言的概念,每种语言都是平等的,可以使用polyglot运行任意语言编写的程序,而不需要前面的每种语言单独一个启动器。polyglot会通过文件的扩展名来自动分类语言。

    

   结束语:

    从开始学习,到环境搭建和测试,确实遇到了很多坑,但是,也正因为这些坑,让我有所收获,确实学到了很多。这个东西,总体来说,还是不错的。后续我会尝试将项目打包上去进行测试。

    

  参考资料:

  https://github.com/oracle/graal/issues/343    GraalVM官方github issues

  https://www.graalvm.org/docs/        GraalVm官方文档

  https://juejin.im/post/5ad7372f6fb9a045e511b0a4     全栈虚拟机GraalVM初体验

初探Oracle全栈虚拟机---GraalVM的更多相关文章

  1. 屌炸天,Oracle 发布了一个全栈虚拟机 GraalVM,支持 Python!

    前阵子,Oracle 发布了一个黑科技 "GraalVM",号称是一个全新的通用全栈虚拟机,并具有高性能.跨语言交互等逆天特性,真有这么神奇? GraalVM 简介 GraalVM ...

  2. 无意苦争春,一任群芳妒!M1 Mac book(Apple Silicon)能否支撑全栈工程师的日常?(Python3/虚拟机/Docker/Redis)

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_187 就像大航海时代里突然诞生的航空母舰一样,苹果把玩着手心里远超时代的M1芯片,微笑着对Intel说:"不好意思,虽然 ...

  3. .NET全栈开发工程师学习路径

    PS:最近一直反复地看博客园以前发布的一条.NET全栈开发工程师的招聘启事,觉得这是我看过最有创意也最朴实的一个招聘启事,更为重要的是它更像是一个技术提纲,能够指引我们的学习和提升,现在转载过来与各位 ...

  4. 洗礼灵魂,修炼python(73)--全栈项目实战篇(1)——【转载】前提准备之学习ubuntu

    本篇是为项目实战做准备,学习Linux是必备的,不然都不好意思叫全栈对吧?下面是一位资深大神写的文章,够详细,我也不用浪费时间再写了 原文链接:Ubuntu学习——第一篇 内容: 一. Ubuntu简 ...

  5. Java全栈工程师知识体系介绍

    Java全栈工程师,是指掌握多种技能,并能利用多种技能独立完成产品的人,也叫全端工程师(同时具备前端和后台能力),英文Full Stack developer. 那么想要成为一名合格的Java全栈工程 ...

  6. duang~免费的学习视频来啦:学霸君之全栈测试

    学霸君向童鞋们推荐一款 同名学霸学习 视频教程 重点是完全免费收看学习噢!!! 今天 学霸君推荐腾讯课堂的学霸君之全栈测试 复制下方链接至腾讯课堂中报名学习 https://ke.qq.com/cou ...

  7. 怎样成为全栈工程师(Full Stack Developer)?

    "Facebook 工程师说 Facebook 只招 full stack engineer,那么 Facebook engineer 都是怎样的人啦."? 具体经验不重要,重要的 ...

  8. [虚拟化/云][全栈demo] 为qemu增加一个PCI的watchdog外设(一)

    目的: 结合现在比较流行的技术,通过一个demo 展示一个全栈式设计的各种技能. 一个全栈式的工程师,应该能设计通过verilog/VHDL做logical设计.能写内核驱动,能架站. 要熟悉veri ...

  9. 全栈必备 JavaScript基础

    1995年,诞生了JavaScript语言,那一年,我刚刚从大学毕业.在今年RedMonk 推出的2017 年第一季度编程语言排行榜中,JavaScript 排第一,Java 第二,Python 反超 ...

随机推荐

  1. python算法与数据结构-什么是数据结构

    一.什么是数据结构 数据结构,直白地理解,就是研究数据的存储方式. 我们知道,数据存储只有一个目的,即为了方便后期对数据的再利用,就如同我们使用数组存储 {1,2,3,4,5} 是为了后期取得它们的值 ...

  2. SQL Server 2012设置某用户对某些表的记录限制其删除操作

    第一步:用sa用户进入SSMS: 第二步:在安全性---用户上面点击右键---"属性": 第三步:在选择页中选择”安全对象“,点击”搜索“,弹出添加对象页面,这里默认为特定对象不用 ...

  3. java源码解析之String类(三)

    上一节我们主要讲了String类的一些不是很常用的方法,其中需要掌握的如下,我就不再赘述了 public int length() public boolean isEmpty() public by ...

  4. esxi开启SSH

  5. EXPLAIN说明

    列名 类型 解释 id   SELECT语句的ID编号,优先执行编号较大的查询,如果编号相同,则从上向下执行 select_type SIMPLE 一条没有UNION或子查询部分的SELECT语句 P ...

  6. 并发编程-concurrent指南-ConcurrentMap

    ConcurrentMap 是个接口,你想要使用它的话就得使用它的实现类之一. ConcurrentMap,它是一个接口,是一个能够支持并发访问的java.util.map集合: 在原有java.ut ...

  7. 终于有人说清楚了--XGBoost算法

    1. 什么是XGBoost XGBoost是陈天奇等人开发的一个开源机器学习项目,高效地实现了GBDT算法并进行了算法和工程上的许多改进,被广泛应用在Kaggle竞赛及其他许多机器学习竞赛中并取得了不 ...

  8. HDU 1811:Rank of Tetris(并查集+拓扑排序)

    http://acm.hdu.edu.cn/showproblem.php?pid=1811 Rank of Tetris Problem Description   自从Lele开发了Rating系 ...

  9. Azkaban Flow 2.0 使用简介

    官方建议使用Flow 2.0来创建Azkaban工作流,且Flow 1.0将被弃用 目录 目录 一.简单的Flow 1. 新建 flow20.project 文件 2. 新建 .flow 文件 3. ...

  10. django基础知识之验证码:

    验证码 在用户注册.登录页面,为了防止暴力请求,可以加入验证码功能,如果验证码错误,则不需要继续处理,可以减轻一些服务器的压力 使用验证码也是一种有效的防止crsf的方法 验证码效果如下图: 验证码视 ...