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

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

私に教えられることなら

JavaScriptで動くForth REPL/VMを作っている

うごく: http://phaendal.github.io/mkforth4-js/

リポジトリ: https://github.com/phaendal/mkforth4-js

なんでVM

アセンブラで書かれた、それ自体がForth処理系作成入門の素晴らしいドキュメントになっているjonesforthというものを昔発見して、実装してみてから、ずっとForthに興味を持ち続けている。

Forthのメタプログラミングの手法は、今自分が把握してるもので2つある。

  1. コンパイルするバイト列を操作する
  2. 読み込む命令列を操作する

どちらもForthの「全てのトークンが命令実行」という原則に従って強力さを生み出している。

今までCommonLispで試していたのは2なんだけど、jonesforthでの強烈な体験から、やっぱり

  • バイトコンパイルしたものを触りたい
  • Forthらしい、immediateワードを使ったDefining Wordを書きたい
  • GCに頼らない実装にして、いずれはアセンブラで一番下から書きたい

とぼんやり思ってて、さらに

  • JS上にForthVMを実装したい
  • その上にForth自身で便利なシンタックスを書いていきたい
  • さらにその上にForth自身でREPLや開発環境を書いたり、ゲームやフロントエンドを書きたい

という夢があったので、やるだけならタダだ!ということで1をJSで取り組んでみた。

そしたら結構できた。やってみるもんだ。

現状

今のところREPLはJSで書いてるけど、基本的なDOM操作もできてるのであとは体力勝負かな、というところ。

感想

クォーテーション、例外処理、名前空間なども自分自身で書いていくの楽しすぎて時間忘れた。

が、思いっきり自分の足を撃ちぬくことも多々あって、開発中に全く挙動がわからなくなったり、すぐに無限ループに突入したりとなかなか難しい。しかも「全てワード列」なので文法のチェックも難しい。難しいというか書くのがちょっと面倒。

なのでやっぱり木構造を操れるLispでも……と思うんだけど(まあいずれやるだろうけど)、並行するとワケわからなくなりそうなので今はForthに集中しようと思う。

自分の足を撃ちぬいているときも、丁寧にワードを分解していって切り分けるとなんとかどこを撃ってるかわかるので、練習で上達する事ではありそう。

テストコードも一切なくて恥ずかしいんだけど、取り敢えずそういうことは気にせずに好きに書いていこうと思う。

広告を非表示にする