読者です 読者をやめる 読者になる 読者になる

レガシーコード生産ガイド

私に教えられることなら

サブルーチン・スレッディングのForth処理系作った

RFR64

github.com

Linux 64bit向け、アセンブリで書いたForthは2個目。

VFX ForthとSwiftForthめっちゃ速い - レガシーコード生産ガイドで、Disassembleするとどちらの処理系もサブルーチン・スレッディングを使ってるので気になってた。ので作った。MovingForthを寝ながら読んで参考にしたので、正確に言葉使えてるかは自信無い。

サブルーチン・スレッデッドコード(以下STC)の利点は、

  • 単なるcallの列なので、マシンコードをそのまま間に挟める
  • よってインライン展開による最適化が簡単、CREATE&DOES>などの実装も楽になる
  • x86-64だとcall命令(E8)が5バイトなので、8バイトの列になるITCやDTCよりサイズが小さくなる

だと思う。多分。それに加えてスタックトップをレジスタに置く最適化も実装してみた。

組み込みワード(予定)に書いてるように、現在分岐・ループ・create & does>までできたので、拡張のための基礎はできてきたかなというところ。インライン展開も早めに実装して、速度を計ってみたい。

前作のjf64はjonesforthの移植から始まったんだけど、ガンガン組み込みワード追加して「移植」と言い張るのがちょっと変な気分だった……ので、今回は完全にオリジナルという感覚でスッキリした。

call命令

あと、昨日半日ほど勘違いしたまま、いろいろ調べたり苦しみぬいたんだけど、call命令(E8)のオフセット計算元は

(こ↑こ↓) E8 XX XX XX XX じゃなくて

E8 XX XX XX XX (こ↑こ↓) だった。

気づいたときの脱力感やばかった。

感想など

短期間に同じようなものを作ると、成長というか慣れみたいなのを強烈に体験できて楽しかった。

call命令が上手くいかない理由をつきとめるためにGDBの使い方調べたりしたのもいい経験になった。

が、始めから基礎知識があれば……という後悔がやっぱり無いでもない。本、読もう。

あとForth処理系ばっかり書いててForthのコード書いてない。。ヌヌヌ

広告を非表示にする