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 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引擎可用。

运行结果:

$ ./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