Open3

truffle

totem3totem3

Java 11 で truffle

必要なpackageがmoduleで公開されていない

  • truffle API を使ってインタープリタを書いてみようと思って遊んでいる
  • テストのため truffle で言語を書いているパッケージ内に main のクラスと関数を作って実行しようとしていた
  • com.oracle.truffle.api などを import しないといけないのに、 module から公開されていないので graalvm-ce-java11 で import するとエラーになってしまう
  • --add-exports オプションをつければ一応ビルドすることはできる
  • ビルドはできても実行時にリンクエラーになる

解決

  • --add-exportsオプションをつけてビルドする
  • SimpleLanguageのように、起動用のLauncherは別パッケージで作る
  • Launcherを実行する際に、↑でビルドしたjarをtruffleのクラスパスに追加する
    • -Dtruffle.class.path.append で追加する
totem3totem3

truffleで作った自作言語をgraalvmのpolyglotで実行する

truffleを使って作った言語をpolyglotで実行するには言語をinstallしないといけない。
installするには、
1. GraalVM componentにするか
2. 実行時に -Dtruffle.class.path.append オプションを使ってtruffleのclasspathに(?)jarを追加するか

2のためにtruffle-dsl-processorがいろいろやってくれるので、これを動かさないといけない。

gradleでannotationProcessorを動かす

mavenならsimplelanguageのとおりにすればよいが、gradleでは↓このようにする
https://github.com/oracle/graal/issues/1474#issuecomment-670197337

dependencies {
     annotationProcessor "org.graalvm.truffle:truffle-dsl-processor:${project.graalvmVersion}"
}
totem3totem3

Launcherを実行

java -Dtruffle.class.path.append=path/to/yourlang.jar -cp launcher LauncherMainClass ..