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

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

私に教えられることなら

NASM / Linux x86-64でjonesforthを移植してみる 5

コロン定義(コンパイル)までできた!これで一番重要なところは終わりかな?

https://github.com/phaendal/jf64

$ ./forth 
: hoge 64 ;
: hoge hoge emit ;
: hoge hoge cr ;
hoge
@
bye
$

他にもLisp好きでjonesforthを64bitに移植した方がいる、という情報をもらったので探してみると、Factor クエックブックのquek氏のchocoforthというNASM / 64bit LinuxのForthを発見したのでだいぶん参考にさせてもらった。

汚いから書き直すと言ってたけど、書いてるうちに少しずつアセンブリがわかってきた気がするので、気になるところを書き直しつつ飽きるまで続けてみよう。ついでにemacsのNASM用のモード、マシなやつを探してTABを統一させたい。。

jonesforthそのものなので仕組みの解説はおいといて、アセンブリ初心者がいきなりForth移植に取り組んでみてわかってきた、バグを出しやすいところ(=チェックすべきところ)をメモしておく。

  • マクロが生成したラベル。ネイティブワード内にサブルーチンを作って、そこにcallするような使い方で、マクロが生成した別のラベルを使ってしまう、など。
  • レジスタの役割の一貫性。サブルーチンコールの後、どれが上書きされているか・どれに値が入っているかを勘違いしてしまう、など。
  • 扱うビット幅。1バイトデータを4バイトレジスタに読みこんで、余計なデータが入ってるのに気づかず比較する、など。

あと、ワードのコンパイルできた直後に変なコミットしてるのに気づいてgit rebase -iしてみたら、操作ミスってコンパイルするコードが消えて心折れそうになった。けどもう一度書き直すときは楽というか、視界が広がったようなカンジで書けたので、練習の必要性を実感できた。Forthは慣れると簡単に書けそうだし、これができた後も練習のため何度か作ってみよう。

広告を非表示にする