truffleTruffleを使って言語を実装してみたのだけど、やはり関数呼び出しもやりたい。今回、関数は埋め込みで呼び出しだけ行ってみます。いうことで、とりあえずランダムを返す関数を実装。}}ちなみに、native-imageするときstaticイニシャライザはコンパイル時に実行されるので、なにも考えずにネイティブイメージを作ると乱数が固定されて毎回同じ値を返します。--delay-class-initialization-to-runtime=RandNodeをつける必要があります。GenerationCallTargetを保持する関数としてはCallTargetが欲しいので、CallTargetを保持するクラスを作ります。}CallTargetを作るときにRootNodeが必要になるのだけど、前回作ったものは変数定義を入れてしまったので、改めてRootNodeを作っておきます。}}そしたら、こんな感じでパースのときにCallTargetを作って保持しておきます。RAND_FUNC;}実際には関数名->関数オブジェクトのMapに保持することになると思います。呼び出し呼び出しは、CallTargetのcallメソッドを呼び出すと行えます。}}今回はつかってないけど引数があるときはcallの引数で渡します。受け取り側では、VirtualFrameのgetArguments()で。パースのときに数値以外は変数として扱うようにしたのだけど、randと書くと乱数関数を呼び出すことにします。MathInvokeNode(createBuiltin(frame));これでこんな感じで動くようになります。String[]{exp});呼び出しの最適化さて、メソッド呼び出しを効率化しましょう。IndirectCallNode/DirectCallNodeを使います。ここではDirectCallNodeを。}}これでいいんだけど、実際に言語を作るとき、これだと再帰関数ではこの時点ではcallTargetが準備できてなかったりしてうまういかないことがあります。遅延処理することになります。}}けど、これ動くには動くけど遅くなるしGraalVMで動かすと文句いわれる。いうことで、@CompilationFinalをつけます。値変更時にCompilerDirectives.transferToInterpreterAndInvalidate()でGraalコンパイラに教えてあげる。}}今回のコードだと処理速度に影響はないけど、実際の言語実装したときに10%~30%くらい速くなった。Engineで受信メールの処理ができるようになった。3月別アーカイブリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!nowokayさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。