vm2gol v2 (51) 機械語コードのフォーマットを固定長風に変更



これまで機械語コードのフォーマットはこのような YAML ファイルにしていました。 (以下便宜的に「可変長風」と呼びます)

---
- call
- 1029
- exit
- label
- vram_set
- push
- bp
...

これを変更して、1行あたり1命令となるようにして、行ごとに JSON.parse でパースできるようにしました。 (以下便宜的に「固定長風」と呼びます)

["call", 1029]
["exit"]
["label", "vram_set"]
["push", "bp"]
...

どの命令でもメモリ上で占める幅が 1 になったため Vm.num_args_for も不要になってすっきりしました。

また、YAML への依存がなくなり JSON への依存に一本化できました。 Ruby でやる分には何でもいいのですが、他の言語に移植するときに若干めんどくさかったので。これでちょっと簡単になるはず。

その他の変更

メモ

元の YAML のように 1命令が複数の行(可変)となるようにしていたのは、機械語といってもバイナリではなくテキストにした上にさらに固定長風にしてしまうとさすがに簡略化しすぎで勉強にならないのではないか、みたいなことを考えていたからでした。たしか。

しかし、今になってみると別にこだわるところではなかったように思えます。こだわる必要がないのであれば簡単な方がよい、というわけで変えてしまうことにしました。

あとは 1行1命令にするとアセンブリコードとの違いがさらに小さくなってアセンブラが仕事してない感じになってしまうけどこれでいいの? ということが気になっていたのですが、そこも気にしないことにしました。


全体で 50行弱減って今このくらいの行数。

   14 common.rb
   58 vgasm.rb
  555 vgcg.rb
  509 vgparser.rb
  513 vgvm.rb
 1649 合計