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

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

私に教えられることなら

NASM / Linux x86-64でForth開発日誌 その後

forth

少し前までjonesforthをNASM/Linux/64bitに移植してて、開発日誌は一度完結ということにしたんだけど、その後いろいろ追加したり、考え方が変わったりしたので記録しておく。

追加したもの

すべて組み込みワードとして追加してある。

CREATE & DOES>

用途が結構限定されてるんじゃ……と思ってたんだけど、いろいろ読んでるうちに便利だと思うようになったので実装。create>does>>という名前にした。

doesのコードをどう書き換えるか、どう実行するかで悩んだ。悩んだ原因は、does>以降のコードアドレスを保持するために、does>を使わなくても1セル空けておく必要があること。64bitだと8バイトで、昔なら「たった8バイトじゃん」と思ってたとこだけど、考え方変わったみたいで「8バイトも使ってしまうのか……」ともったいなく感じるようになった。

いくつか処理系のソースを見たところ、専用DOVARとかDODOESみたいなコードを使うのが一般的っぽかったけど、その問題は解決してないので結局そのままForthワードのみで作った。

Structure Closer Stack (SCS)

Reforthで、いろんな構造を統一的にendで閉じられるようにしてるのがイカすと思ったので作った。

結構使う。

Guard

早めのリターンが大好きでif ... return thenをよく使うので、字面で意図がわかるようにguard ... endで同じことをできるようにした。

が、何故か使ってない。guardが長いからかな……?

Record

これもReforthの真似。

Forthの構造体はだいたい以下のように作る。

struct
  cell field yo
  cell field hey
end-struct Greeting

構造体の名前が分かりづらい。なので最初に宣言できるようにした。ついでにendで閉じられる。

record Greeting
  cell field yo
  cell field hey
end

イイカンジ。

が、構造体を使ったものをまだ書いたことがない。。

考え方

おもにThinking Forthと、gforthやSwiftForthの付属ドキュメント・コードなどを読み、そして処理系を作ったことでだいぶん考え方が変わった。

変わったというより、ForthではForthに合った考え方がある、と思うようになったので、追加されたと言ったほうが適切かもしれない。

多分一番変わったのは「シンプルさにもいろいろある」と受け入れられるようになったことだと思う。

Forthを触り始める前は、いくつかの強い思い込みがあった。

  • メモリを直接変更したり、メモリ管理を手動ですることはどうにかして避けるべき
  • どんな場合もグローバル変数は使わない
  • あれこれ手をつくして柔軟性と拡張性を最大限に高めておくことが大切
  • 関数名は長くてもいいから、それ自身がドキュメントとなるぐらい説明的な名前をつける

しかし、それらを全部無視してなお、シンプルでわかりやすいForthのコードを読んで、極端な思い込みは解消されていった。極端から極端に振れたわけではなく、依然としてClojureやFactorなどの美しさも好きなんだけど、Forthのおかげで好物が追加された、というところ。

多分人間の「慣れ」をもっと重視して、「練習」を大切にした方がいいのかな、と考えている。とりあえずもっと多くのコードを書きたい。結論を急がないように気をつけよう。

広告を非表示にする