...]これでHamlのパーサーの困りポイントは解消され、比較的まともな中間表現列になっている。...\u0000"]に変換される。相当の働きをし、行番号は維持されている。これをコード生成器に渡すわけなので、StringTemplate同等の機能しか持たないコード生成器*12に渡せば、この文字列リテラル一つだけが生成される。要素の部分列が以下の条件を全て満たす時に、その範囲にのみ上記のような変換を行なうようになっている。呼ぶようにすればいいかなと思っている。それぞれ1つ以上含まれる」という条件は少しチューニングの余地があるとリリース後に気がついた。Interpolationで結合すると微妙に遅くなってしまう。2つある以下のものは元のコードより速くなった。適用条件を少し厳しくしようかなと思っている。まとめHamlitを使ってない人、速度に妥協していませんか。GitLabやMastodonもHamlitを利用しています。ラップしないコード生成器、という意味。さんの作業待ちでブロックしていて暇なので何かを書こうと思い、JVMを書くことにした。その辺のアプリを気軽に動かせるレベルでは全然ないが、別に秘密裏に開発する必要もないと思ったので公開した。github.comこれの紹介と、現時点で学べたことをこの記事に記録しておく。Kotlinで書かれている*1ので、既にRubyのVMはある程度わかる*2ことを考えると、JVMさえ理解してしまえば社内の主要な言語評価系を抑えたことになり、運用面で活躍の機会が増える気がしている。自分が最近一番書いているのはKotlinなのだが、JVMで動かしていることに由来した問題が垣間見えることがあるので、JVMに詳しいとその背景を理解したり問題に対処したりするのに役に立つと思っている。2.6で導入されたJust-In-Timeコンパイラの開発をしているので、なんか遅くて困った、という時に他の処理系が同様の問題をどう解決しているか参考にしたいことがある。VMは、既に長く運用され洗練されたJITを持っているのですごく参考になりそうだし、CRubyと性能を競うJRubyやTruffleRubyもJVMで動くので、JVMの挙動が解析できると他のRuby処理系の挙動理解にも役に立つ感じがする。Javaで実装したのか昔C言語のコンパイラをCで書いてセルフホストしようとして結局途中でやめた、ということがあり、今回こそセルフホストにこぎつけようと思いJVM言語で書くことにした。JVM言語の中でもJavaなのは、仕事で使うのでJavaのコードを割と読む機会があるが、書いてるのは大体Kotlinなので、Javaを書く方の経験の足しにしておこうと思ったため。*3JJVMは今どこまで実装してあるかtestディレクトリに置いてある奴は動くが、VM命令と一対一対応みたいなものしか置いてないのであまり参考にならなそう。テストを書くのが面倒くさいので、セルフホストを主な結合テストとして利用しようとしている。読んでいる皆さんが過去に書いたアプリケーションを動かしてみる、とかはおすすめできない状態にある。BytecodeInterpreter.javaを眺めたり、-Xjjvmtraceというオプションの出力を眺めると簡単に雰囲気がわかると思う。実装スコープ以下のものを実装している:クラスファイルパーサーホストJVMのbootclasspathの利用バイトコードインタプリタネイティブメソッドJavaを使うと本来クラスファイルパーサーはimportするだけでも使えるが、Javaバイトコードそのものに多少興味があったので自前で書いている。どこでインチキをしているかクラスファイルパーサーでは異常な真面目さを発揮しているが、それ以外の場所は手抜き感に溢れている。GC不要、JITはサボリホストのrt.jarをそのまま利用バグったらとりあえずスタブpublicなネイティブメソッドはホストのを呼ぶだけGCがある言語でインタプリタを実装すると、一般に、GCはホスト言語のものをそのまま使えることになる。最近JITばかり書いていたのでJITはお休み。より、ホストのランタイムライブラリに依存している*4。達成感を得るためにセルフホストまで行きたいが、何か面倒っぽい細かいところの呼び出しをスタブして逃げたりしている。Worldにも結構な労力をかけている。セルフホストする都合Javaで書かなければならないことを考えると保守性も性能も共に最高の実装のはずだが、勉強にはならない。ファイルは探さないでほしい。