BallBlastを移植しました

FSharpで作成していたネイティブコンパイラな言語に、id:abaさん作のwonderflのBallBlast(http://wonderfl.net/c/euqw)を移植してみました。

移植後のソース:(https://github.com/hsk/fstype7/blob/master/sample/ballBlast.lll)

プログラムの行数

元のasファイルが459行で移植後のlllファイルが786行と2倍弱の行数になりました。
行数が増えた一番大きい理由はライブラリがないためにコードを追加した事でした。
他にも色々理由はありますが、たいした変更ではありませんでした。

  • for eachが無いので、 forループと取り出しで書き直した
  • Vectorがないので固定長配列にプールして取り出すようにした
  • 1行に複数の処理を複数行に書き換えた

作業時間

作業時間ですが、1日くらいで移植出来ました。

移植作業で困った事

移植で困った事はいくつかありました。

  • ○暗黙的なcastの挙動がActionScriptと違っていた
  • 演算子の優先順位が違かった
  • ○型の前方参照が出来ない事がある
  • ○continueにはバグがあって使えない
  • ●比較がunsignedで行われていた
  • ○配列リテラルが使いずらい
  • ●文字列の出力が面倒

●の項目は修正したのですが、○の項目はまだ未解決です。
大部分のエラーは行番号をコンパイラが出力するようになったのでずいぶんバグを取るのは楽になりました。
文字列の出力は、英数字が使えればOKなので、フリーの6x8フォントであるk6x8フォント(http://www.geocities.jp/littlimi/k6x8.htm)をphpで配列データとしてプログラム上に取り込み、四角形を複数描画して描画しました。

まとめ

やっぱり、ゲームを動かすと面白いです。
ゲーム等を作るとなると、それなりの規模が必要になるため、
言語のユーザー視点でコンパイラを触れる良い機会になります。

一からゲームを作るとなると、ゲームを作る才能や試行錯誤が必要です。
才能がないわ、試行錯誤中にコンパイラのバグは見つかるわで、
ゲームを作ろう作ろうと思いつつ、なかなか作れないでいました。
しかし、移植作業だけであれば、ゲームを作る才能も試行錯誤も必要ありません。
ある物をただ、正しく動かす為にソースを弄るだけで済むのです。
おかげで、コンパイラと向き合いつつ、ゲームが動くようになって行くのはモチベーションの維持に、ちょうど良く働きました。

言語を作る場合は、ゲームに限らず既に動いているそれなりの規模のプログラムを移植すると楽しく出来そうです。

今回の移植作業で出た問題点は今後のコンパイラ開発に生かして行けたらと思います。