官方说明:

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中的基本数据类型之 int bool str

    一.基本数据类型 1. int  ==>  整数.主要用来进行数学运算. 2.str  ==>  字符串.可以保存少量的数据,并进行相应的操作. 3.bool  =>  布尔值.判断 ...

  2. uint16,uint32是什么?

    记得之前在刷笔试题的时候就看见过这个问题,发现当时上网百度后又忘了. 最近在看CryEngine3引擎代码的时候又晕了,趁现在赶紧记下来~ 在查看CE3的代码时我发现了这个变量,TFlowNodeId ...

  3. window系统谷歌浏览器百度搜索框光标不能输入并且不显示光标----自制bug以及解决

    --------------------bug无处不在------------------------- 今天在搞代码的时候,保存文件无意中犯了个致命错误,文件名称写入非法字符,可能与Windows系 ...

  4. Go 程序是怎样跑起来的

    目录 引入 编译链接概述 编译过程 词法分析 语法分析 语义分析 中间代码生成 目标代码生成与优化 链接过程 Go 程序启动 GoRoot 和 GoPath Go 命令详解 go build go i ...

  5. 针对Linux 文件完整性监控的实现

    针对Linux 文件完整性监控的实现 摘要 计算机和互联网是20世纪以来最伟大的发明之一,随着计算机技术的不断发展,人们的生活方式发生了巨大的变化.计算机和互联网的发展给人们的生产生活带来了极大的便利 ...

  6. Analysis of requirement specification of parking management system

    Analysis of requirement specification of parking management system PURPOSE OF THE SYSTEM The parking ...

  7. try catch finally 用法 今天闲来没事就总结下

    try { 执行的代码,其中可能有异常.一旦发现异常,则立即跳到catch执行.否则不会执行catch里面的内容 } catch { 除非try里面执行代码发生了异常,否则这里的代码不会执行 } fi ...

  8. Presto 0.22.0 安装记录

    1. 下载 & 解压 # 下载 wget https://repo1.maven.org/maven2/com/facebook/presto/presto-server/0.220/pres ...

  9. 浅谈 JavaScript 中 Array 类型的方法使用

    前言:Array 类型是 JavaScript 中除了 Object 类型以外最常用的类型. 一.创建数组 JavaScript 中的数组与其他语言中的数组有着很大的区别.例如Java.PHP等语言中 ...

  10. 02(b)多元无约束优化问题-最速下降法

    此部分内容接02(a)多元无约束优化问题的内容! 第一类:最速下降法(Steepest descent method) \[f({{\mathbf{x}}_{k}}+\mathbf{\delta }) ...