GraalVM全栈(通用)虚拟机

GraalVM是一款通用虚拟机,能够运行Java、Scala、Kotlin、Clojure、JavaScript、Python、Ruby、R、C、C++。

graalvms

GraalVM消除了编程语言之间的隔膜,并实现了运行时的互操作性。GraalVM可以将Java字节码编译为本地可执行程序,以实现更快的启动速度和更小的空间占用。

GraalVM提供了一个全面的生态系统,支持大量语言(Java和其他基于JVM的语言,JavaScript,Ruby,Python,R和C / C ++以及其他基于LLVM的语言),并在不同的部署方案中运行它们(OpenJDK、NodeJS、MySQL、Oracle数据库或独立)。

GraalVM性能对比

graalvm performance

安装GraalVM

GraalVM企业版64位支持Linux和Mac OS X。

设置PATH环境变量

Linux:

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

Mac OS:

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

使用echo验证环境变量设置 : 

echo $PATH

JAVA_HOME(可选)

将JAVA_HOME环境变量设置为GraalVM安装目录。

GraalVM bin目录与标准JDK的目录大致相同。

graalpython

graalpython -m ginstall --help
graalpython -m ginstall install numpy

GraalVM Docker容器

可以从Docker Hub获得GraalVM CE的官方Docker镜像。

如果要将Docker容器与GraalVM CE一起使用,使用docker pull命令:

docker pull oracle/graalvm-ce:1.0.0-rc13

在docker容器中进入会话:

docker run -it oracle/graalvm-ce:1.0.0-rc13 bash

GraalVM构建本地执行程序

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

首先生成类字节码,然后基于类文件构建本地可执行程序:

$ javac HelloWorld.java
$ native-image HelloWorld

在当前的目录中构建一个helloworld可执行文件。

$ ./helloworld
Hello, World!

使用多种语言构建本地可执行程序

在GraalVM中使用JavaScript实现JSON输出:

// PrettyPrintJSON.java
import java.io.*;
import java.util.stream.*;
import org.graalvm.polyglot.*;

public class PrettyPrintJSON {
  public static void main(String[] args) throws java.io.IOException {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String input = reader.lines().collect(Collectors.joining(System.lineSeparator()));
    try (Context context = Context.create("js")) {
      Value parse = context.eval("js", "JSON.parse");
      Value stringify = context.eval("js", "JSON.stringify");
      Value result = stringify.execute(parse.execute(input));
      System.out.println(result.asString());
    }
  }
}
$ javac PrettyPrintJSON.java
$ native-image --language:js PrettyPrintJSON

--language:js参数确保JavaScript引擎可用。

本地可执行文件输入JSON:

$ ./prettyprintjson <<EOF
{"GraalVM":{"description":"Language Abstraction Platform","supports":["combining languages","embedding languages","creating native images"],"languages": ["Java","JavaScript","Node.js", "Python", "Ruby","R","LLVM"]}}
EOF