graal とは
truffle とは
遊んでみる
もろもろ
$ ls bin
R aot-image graalvm java javadoc node ruby
Rscript g irb javac js npm
なんか色々入ってる!
$ bin/graalvm --shell
GraalVM MultiLanguage Shell 0.24
Copyright (c) 2013-7, Oracle and/or its affiliates
JS version 0.9
R version 0.1
Ruby version 2.3.3
Usage:
Use Ctrl+L to switch language and Ctrl+D to exit.
Enter -usage to get a list of available commands.
JS> console.log('hello js')
hello js
R> print('hello R')
[1] "hello R"
Ruby> puts 'hello Ruby'
hello Ruby
nil
$ bin/node
> var fs = require('fs')
undefined
> fs.read
fs.read fs.readFile fs.readFileSync fs.readSync fs.readdir fs.readdirSync fs.readlink fs.readlinkSync
> java.util.Arrays.asList(1, 2, 3, 4)
'[1, 2, 3, 4]'
node.jsのモジュールが一式使える!
Javaクラスにもアクセスできる!
const lodash = require('lodash')
const FastList = org.eclipse.collections.impl.list.mutable.FastList;
const UnifiedMap = org.eclipse.collections.impl.map.mutable.UnifiedMap;
const pair = org.eclipse.collections.impl.tuple.Tuples.pair;
const toJsArray = (vs) => vs.injectInto([], (vs, v) => vs.concat(v));
const javaList = FastList.newListWith(1, 2, 3, 4);
const jsList = toJsArray(javaList);
console.log(jsList)
const javaMap = UnifiedMap.newMapWith(pair('a', 1), pair('b', 2));
const jsMap = lodash.zipObject(
toJsArray(javaMap.keysView()),
toJsArray(javaMap.valuesView()));
console.log(jsMap)
function Task(f) {
return new java.util.concurrent.Callable(f);
}
const atom = new AtomicInteger();
let count = 0;
const tasks = [1, 2, 3, 3, 3, 3, 3, 3, 4, 5].map(i =>
Task(() => {
atom.getAndIncrement();
count++;
sleep(i * 1000);
return Thread.currentThread().getId();
})
);
真の並列処理がJSに!
function loop(n) {
var add = Interop.import("add");
var i = 0;
var sum = 0;
while (i <= n) {
sum = add(sum, i);
i = add(i, 1);
}
return sum;
}
Interop.eval("application/x-ruby",
"def add(a, b) a + b; end;");
Interop.eval("application/x-ruby",
"Truffle::Interop.export_method(:add);");
console.log(loop(process.argv[2]));
function fibonacci(n) {
if (n < 2)
return 1;
else
return fibonacci(n-2) + fibonacci(n-1);
}
var res;
for (var i = 30; i < 46; i++){
var start = new Date();
res = fibonacci(i);
var end = new Date();
log("Input: " + i + " Result: " + res + ", Time: " + (end - start));
}
低いほど優秀
$ JAVA_HOME=. scala
scala> :paste
import com.oracle.truffle.api.source.Source;
import com.oracle.truffle.api.vm.PolyglotEngine;
val engine = PolyglotEngine.newBuilder().build();
engine.eval(Source.newBuilder("print('Hello polyglot world JavaScript!');")
.mimeType("application/javascript").name("").build()).get();
engine.eval(Source.newBuilder("puts 'Hello polyglot world Ruby!'")
.mimeType("application/x-ruby").name("").build()).get();
engine.eval(Source.newBuilder("print('Hello polyglot world R!');")
.mimeType("application/x-r").name("").build()).get();
Hello polyglot world JavaScript!
Hello polyglot world Ruby!
[1] "Hello polyglot world R!"
GraalVM上でもちゃんとAltJavaは動く
groovyshとscala REPLで確認
Scala 2.12.1だとエラーでコケる
2.12.2 にUpdate!
GraalとJava9
-XX:+UnlockExperimentalVMOptions -XX:+EnableJVMCI
手元では未確認
そもそもJava9が揉めてる 😇