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

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

私に教えられることなら

NASM / Linux x86-64でForth開発日誌4

mkforth4-jsで作ってたVocabularyとRegionに加えて、ワードをインライン展開ワードに変えるinline!を作ってみた。

といっても仕組みは単純で、対象ワードと同名のimmediateワードを作り、

  • コンパイルモードの場合は、対象ワードのdfaからreturnの前までを辞書にpush
  • 実行モードの場合は、そのまま対象ワードを実行

という動作をさせる。とくに難しいことはしてない。けど、ベンチマークから考えると、適切な場所に入れると速くなりそう。

1up!と出力するワード1up、それが3つの3up、3upが2つの6upを定義すると、6upの内容はこうなる。

  0 > : 1up ." 1up!" cr ;
  0 > 1up
1up!
  0 > : 3up 1up 1up 1up ;
  0 > : 6up 3up 3up ;
  0 > see-word> 6up
0000000000B3A578 -- 0000000000B3A538 : 3up
0000000000B3A580 -- 0000000000B3A538 : 3up
0000000000B3A588 -- 0000000000400EE8 : return

  0 > 

このとき、3up定義後にinline!すると、インライン展開されて6upの内容はこう変わる。

  0 > : 1up ." 1up!" cr ;
  0 > : 3up 1up 1up 1up ; inline!
  0 > : 6up 3up 3up ;
  0 > see-word> 6up
00000000007ED5C0 -- 00000000007ED4F0 : 1up
00000000007ED5C8 -- 00000000007ED4F0 : 1up
00000000007ED5D0 -- 00000000007ED4F0 : 1up
00000000007ED5D8 -- 00000000007ED4F0 : 1up
00000000007ED5E0 -- 00000000007ED4F0 : 1up
00000000007ED5E8 -- 00000000007ED4F0 : 1up
00000000007ED5F0 -- 0000000000400EE8 : return

  0 > 6up
1up!
1up!
1up!
1up!
1up!
1up!

(単純だし解説別にいらなかったかな)

そろそろ文法は充実してきて、これ以上欲しいものとすればGCと本物のLexical Closureかな、というところ。文法以外ではいよいよファイルアクセスを扱いたい。でも、正直に言うと好奇心よりも「全部ポインタ、数値でやるのか……」という面倒さの方がちょっと勝ってしまってる。Raspberry Piとかもっと小さいマシンとか、アセンブラで書かないと、ってマシンだと逆にやる気でるかな。

もうひとつ、CommonLispで書いてたワード列をリンクリストで構成する設計が、Mark&SweepGCなら書けるかもな、ということでC言語で書きたくなっている。更に言うと、それよりもLispSmalltalkでいろいろと試したいことがある。

だからしばらく離れそうなんだけど、せっかくForthの仕組み学んだので、id:seijinibanさんの書いた条件に合った小さい処理系とドキュメントを、忘れないうちに復習も兼ねて書いてみたいなとボンヤリ思案中。

広告を非表示にする