学习使用Whally GraalVM!

介绍

在Truffle在神圣的Graal中服务:Graal和Truffle在JVM上进行多语种语言解释的帖子中,我们得到了简短的介绍,并对Graal,Truffle及其周围的一些概念进行了深入研究。 但是,如果不深入研究实用性,那么任何技术都不会很有趣,否则它就像理论物理学或纯数学一样-对某些人来说是抽象的,对其他人来说很无聊(对不起,最后一部分只是我的抱怨)。

在这篇文章中,我们将通过安装GraalVM ,比较SDK的差异以及一些示例来说明如何在GraalVM上编译和运行不同的语言,以及如何在GraalVM中运行它们,来研究GraalVM。相同的上下文,最后是本地语言(性能更高)。

GraalVM与我们从任何供应商处下载的任何Java SDK(JDK)相似,除了它具有JVMCI:Java级JVM编译器接口支持,并且Graal是默认的JIT编译器。 它不仅可以执行Java代码,还可以执行JS,Ruby,Python和R等语言。它还可以为Java程序和其他支持的语言构建提前(AOT)编译的可执行文件(本机映像)或共享库。 尽管我们不会遍历所有语言,但只会选择其中的几种。

只是让您知道,所有命令和操作都是在Ubuntu 16.04操作系统环境上执行的(应该在MacOSX上进行较小的改动,在Windows上需要更多的更改–很高兴收到有关差异的反馈,将与他们一起更新帖子)。

实际动手

我们可以通过多种方式使用GraalVM ,既可以自行构建它,也可以从供应商网站下载预构建的版本:

  • 建立在我们自己的基础上:一些克隆和其他魔术(我们稍后会看到)
  • 下载现成的JVM: OTN下载站点
  • 将自定义JIT连接到具有JVMCI支持的现有JDK(我们将在后面看到)

由于我们使用的是Linux环境,因此最好下载基于JDK8 (> 500MB文件,需要接受许可,需要在OTN 上登录)的GraalVM的Linux(预览版)版本。 https://login.oracle.com/mysso/signon.jsp )并安装。

解压缩档案后,按照下载页面上的安装信息进行操作,执行以下命令后,您将找到一个名为graalvm-0.30的文件夹(在撰写本文时)。

$ tar -xvzf graalvm-0.30-linux-amd64-jdk8.tar.gz

鹰眼:比较SDK

我们将快速检查SDK的内容以熟悉它们,因此让我们检查GraalVM SDK文件夹的内容:

$ cd graalvm-0.30
$ ls

与传统的Java SDK文件夹(即JDK 1.8.0_44)相比,它看起来很熟悉并且具有相似之处:

$ cd /usr/lib/jdk1.8.0_44
$ ls

除了我们还有很多其他要学习的工件,即VM上支持的语言的启动器,例如FastR,JS(GraalJS),NodeJS(GraalNodeJS),Python,RubySulong (C / C ++,Fortran)

比较GraalVM SDK和说JDK 1.8.0_44 SDK之间的bin文件夹我们可以看到那里有一些其他文件:

(使用诸如melddiff类的工具来比较目录)

同样,我们可以看到jre文件夹有一些有趣的差异,尽管其语义与传统的Java SDK相似。 列表中一些有趣的项目是Rscriptlliployglot

现在,我们还没有从字面上比较这两个SDK来标记彼此之间不同或缺失的元素,但是上面的内容使我们对预先使用其提供的功能提供了一个了解-该SDK具有他们将其放入了examples文件夹。

$ tree -L 1

(使用tree命令– sudo apt-get tree可以看到以上内容,在MacOSX和Windows上可用)

每个子文件夹都包含GraalVM支持的各种语言的示例,包括我们还将介绍的embednative-image

令人兴奋的部分:动手使用示例

让我们开始讨论,但是在执行任何代码并查看示例做什么之前,我们应该将graalvm-0.30移动到其他Java SDK所在的位置,在/ usr/lib/jvm/进行设置,并设置环境变量调用GRAAL_HOME指向它:

$ sudo mv -f graalvm-0.30 /usr/lib/jvm
$ export GRAAL_HOME=/usr/lib/jvm/graalvm-0.30
$ echo "export GRAAL_HOME=/usr/lib/jvm/graalvm-0.30" >> ~/.bashrc
$ cd examples

R语言

让我们选择R并运行一些R脚本文件:

$ cd R
$ $GRAAL_HOME/bin/Rscript --help    # to get to see the usage text

注意我们正在运行Rscript而不是R ,两者都可以运行R脚本,后面是R REPL。

使用Rscript运行hello_world.R

$ $GRAAL_HOME/bin/Rscript hello_world.R
[1] "Hello world!"

JavaScript

接下来,我们尝试一些Javascript

$ cd ../js/
$ $GRAAL_HOME/bin/js --help         # to get to see the usage

使用js运行hello_world.js

$ $GRAAL_HOME/bin/js hello_world.js
Hello world!

嵌入

现在让我们尝试一些不同的方法,如果您希望在JVM上运行用多种语言编写的代码,这些代码都驻留在同一个源文件中,这以前从未做过,这就是embed的意思。

$ cd ../embed

我们可以使用org.graalvm.polyglot.context类来实现。 这是HelloPolyglotWorld.java的代码片段:

import org.graalvm.polyglot.*;public class HelloPolyglotWorld {public static void main(String[] args) throws Exception {System.out.println("Hello polyglot world Java!");Context context = Context.create();context.eval("js", "print('Hello polyglot world JavaScript!');");context.eval("ruby", "puts 'Hello polyglot world Ruby!'");context.eval("R", "print('Hello polyglot world R!');");context.eval("python", "print('Hello polyglot world Python!');");}
}

使用下面的代码进行编译以创建一个.class文件:

$ $GRAAL_HOME/bin/javac HelloPolyglotWorld.java

并使用以下命令运行它以查看其工作原理:

$ $GRAAL_HOME/bin/java HelloPolyglotWorld 
Hello polyglot world Java!
Hello polyglot world JavaScript!
Hello polyglot world Ruby!
[1] "Hello polyglot world R!"
Hello polyglot world Python!

在语言之间进行切换并打印“ Hello多种语言世界……”时,您可能已经注意到执行过程有些迟钝 消息,希望我们能够了解为什么会发生这种情况,甚至可以解决它。

本机图像

GraalVM SDK的本机映像功能有助于缩短 Java应用程序的启动时间 ,并减小其占用空间 。 有效地将其在JVM(在任何平台上)上运行的字节码转换为特定OS /平台的本机代码-这就是性能的来源。 它使用积极的提前(aot)优化来获得良好的性能。

让我们看看它是如何工作的。

$ cd ../native-image

让我们从此文件夹中的HelloWorld.java中提取Java代码段:

public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

编译成字节码:

$ $GRAAL_HOME/bin/javac HelloWorld.java

将字节码(HelloWorld.class)编译为本机代码:

$ $GRAAL_HOME/bin/native-image HelloWorldclasslist: 740.68 ms(cap): 1,042.00 mssetup: 1,748.77 ms(typeflow): 3,350.82 ms(objects): 1,258.85 ms(features): 0.99 msanalysis: 4,702.01 msuniverse: 288.79 ms(parse): 741.91 ms(inline): 634.63 ms(compile): 6,155.80 mscompile: 7,847.51 msimage: 1,113.19 mswrite: 241.73 ms[total]: 16,746.19 ms

看一下文件夹,我们可以看到Hello World源代码和已编译的工件:

3.8M -rwxrwxr-x 1 xxxxx xxxxx 3.8M Dec 12 15:48 helloworld12K -rw-rw-r-- 1 xxxxx xxxxx     427 Dec 12  15:47 HelloWorld.class12K -rw-rw-r-- 1 xxxxx xxxxx     127 Dec 12  13:59 HelloWorld.java

第一个文件helloworld是本机二进制文件,它使用native-image命令在我们对其进行编译的平台上运行,该命令可以在JVM的帮助下直接执行:

$ helloworld
Hello, World!

即使我们获得了性能,但我们可能会失去在JVM上以字节码形式运行的其他功能-选择哪种路由完全取决于用例和重要性为了我们。

总结一下!

这需要进行总结,在命令行上有很多阅读和尝试的经验,但是值得花时间探索有趣的GraalVM。

总而言之,我们着手从Oracle Lab网站下载GraalVM,将其解压缩,查看各种文件夹,并将其与我们传统的Java SDK进行比较,并注意到并指出了差异。

我们进一步查看了为各种Graal支持的语言提供的示例,并挑选了一些功能,这些功能使我们对GraalVM可以提供的功能有所了解。 尽管我们可以在其上运行传统的Java应用程序,但现在我们也有机会在同一源文件或同一项目中编写以多种支持的语言表示的应用程序。 这也使我们能够在以不同语言编写的应用程序的不同方面之间进行无缝互操作 。 甚至可以针对本机环境重新编译我们现有的应用程序( native-image ),以提高性能并减少占用空间。

翻译自: https://www.javacodegeeks.com/2017/12/learning-use-wholly-graalvm.html

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android样式开发---shape

Thanks to:转载自Keegan小钢 原文链接:http://keeganlee.me/post/android/20150830 一个应用,应该保持一套统一的样式,包括Button、EditText、ProgressBar、Toast、Checkbox等各种控件的样式,还包括控件间隔、文字大小和颜色、阴影…

SwipeRefreshLayout官方推荐下拉刷新

SwipeRefreshLayoutpublic class SwipeRefreshLayout extends ViewGroup implements NestedScrollingParent, NestedScrollingChildjava.lang.Object↳android.view.View↳android.view.ViewGroup↳ android.support.v4.widget.SwipeRefreshLayout API doc:http://…

开源PagerSlidingTabStrip的使用Tab与ViewPager的完美结合

链接地址&#xff1a;https://github.com/astuetz/PagerSlidingTabStrip 下载PagerSlidingTabStrip-master 将com.astuetz包&#xff0c;res下的下的资源复制进工程 布局文件&#xff1a;activity_main.xml <RelativeLayout xmlns:android"http://schemas.android.co…

android动画详解

转自&#xff1a;工匠若水 http://blog.csdn.net/yanbober 1 背景 不能只分析源码呀&#xff0c;分析的同时也要整理归纳基础知识&#xff0c;刚好有人微博私信让全面说说Android的动画&#xff0c;所以今天来一发Android应用的各种Animation大集合。英文厉害的请直接移步参考…

凹数科技笔试

一、Java 1、成员变量作用域public/protected/defaultprivate/区别&#xff1f; public&#xff1a;该成员变量或其方法对当前类、同一包、子类、其他包都可见&#xff0c;所有类和对象都可以直接访问。 protected&#xff1a;该成员变量或其方法对当前类、同一包、子类都可…

上传至GitHub

在工作目录下&#xff1a; git init git status git add . git commit -m"IndoorLocation" git status git remote add origin githttps://github.com/HiSunny/HelloInLoc.git git pull https://github.com/HiSunny/HelloInLoc.git master git push https://…

Activity的LaunchMode和taskAffinity

Thanks to:http://www.cnblogs.com/SteveMing/archive/2012/04/24/2459575.html 【原】Activity的LaunchMode和taskAffinity 做项目到现在都一直没有理解LaunchMode有什么用&#xff0c;或许根本就没真正花心思去看&#xff0c;所以今天把这部分整理下。 设置Activity的Launc…

gradle spring_使用Gradle的简单Spring MVC Web应用程序

gradle spring除了我们现在将使用Spring MVC而不是原始servlet之外&#xff0c;该文章将与我们之前的文章Simple Gradle Web Application相似。 使用Gradle运行基本的Spring MVC应用程序确实很容易。 您可以在Github上下载本教程的源代码。 先决条件 安装Gradle 我们的基本项…

绘制Nine-Patch图片

Android sdk----->tools----->draw9patch.bat 打开draw9patch.bat文件 File--》open 0-patch将要绘制的.png图片加载进来 ctrl 图片边缘点击鼠标左键 绘制出线条&#xff0c;表示图片需要被拉伸的部分 File--save 9-patch 文件名pp.9.png。

jms spring_JMS和Spring:有时很重要的小事情

jms springJmsTemplate和DefaultMessageListenerContainer是用于访问JMS兼容MOM的Spring帮助器。 他们的主要目标是在JMS API之上形成一层&#xff0c;并处理诸如事务管理/消息确认之类的基础结构&#xff0c;并隐藏JMS API的某些重复和笨拙的部分&#xff08;保留在那里&#…

重温1 Android系统架构及版本

1、Linux内核层(Linux Kernel) 为Android设备的各种硬件提供了底层驱动&#xff0c;Display Driver/Camera Driver/Bluetooth Driver/Flash Memory Driver/Binder(IPC)Driver/USB Driver/Keypad Driver/WiFi Driver/Audio Drivers/Power Management 2、Libraries/Android Run…

REST资源何时应获得其自己的地址?

在纯粹的REST方法中&#xff0c;所有端点&#xff08;起始端点除外&#xff09;都是不透明的&#xff0c;不需要发布其各种详细信息。 即使使用这种方法&#xff0c;本文中的要点也很重要&#xff0c;因为服务器逻辑将必须确定何时需要结束点。 介绍 在REST体系结构中&#xf…

重温2 在Activity中使用Menu

1、引用string.xml中的字符串 1) 代码中 R.string.hello_world 2) XML中string/hello_world 2、AndroidManifest <activityandroid:name".MainActivity"android:label"string/app_name" ><intent-filter><action android:name"andr…

玩转大数据22:常见的关联规则挖掘算法

引言 关联规则挖掘是数据挖掘中的一种重要技术&#xff0c;主要用于发现数据集中项之间的有趣关系。关联规则挖掘在许多领域都有广泛的应用&#xff0c;如市场篮子分析、推荐系统等。常见的关联规则挖掘算法包括Apriori算法和FP-Growth算法。 一、Apriori算法 关联规则挖掘是…

Java 9:欢迎来到Module World

Java 9已于9月21日正式发布&#xff0c;Eclipse从Eclipse Oxygen.1a&#xff08;4.7.1a&#xff09;支持Java 9&#xff0c;让我们进入模块世界。 从此处下载Java 9&#xff0c;然后将其添加到Eclipse Installed JRE中&#xff0c;如下所示 就是这样&#xff0c;我们很高兴在…

重温5 UI开发

public class TextView extends View implements ViewTreeObserver.OnPreDrawListenerjava.lang.Object ↳android.view.View ↳android.widget.TextView Known Direct Subclasses Button,CheckedTextView,Chronometer,DigitalClock,EditText,TextClockButtonRepresents a…

JWT令牌的秘密轮换

当您使用JSON Web令牌 &#xff08; JWT &#xff09;或需要对有效载荷信息进行签名或加密的任何其他令牌技术时&#xff0c;设置令牌的到期日期很重要&#xff0c;因此&#xff0c;如果令牌到期&#xff0c;则可以假定这可能被视为安全漏洞&#xff0c;您拒绝使用此令牌进行任…

重温6 ListView相关|单位dp/sp

dp:密度无关像素。 sp&#xff1a;可伸缩像素。解决文字大小适配问题。 密度&#xff1a;Android中的密度即屏幕每英寸所包含的像素数&#xff0c;通常以dpi为单位&#xff0c;例如一个宽2英寸长3英寸手机屏幕&#xff0c;若分辨率为320*480&#xff0c;则屏幕密度为320dpi。…

wso2 esb_通过运行示例从WSO2 ESB开始

wso2 esb我最近加入了一个新任务&#xff0c;我们必须基于WSO2工具栈实施ESB解决方案。 尽管我熟悉ESB的大多数概念以及其他一些实现&#xff08;例如Mule ESB &#xff09;&#xff0c;但这是我第一次必须使用WSO2 ESB 。 幸运的是&#xff0c;有很多文档可以找到&#xff0c;…