hs2bf - Hello World?

case式の変換を実装したので、ようやくHello Worldできます。しかし・・・

動作モデルの変更

G-machineでcaseの評価を行うときにはその式をforceする必要があります。
そこで

から

へ変更しました。特にスタックの仕様を変更をしなくとも、単に要素の数が1つかどうか調べるだけで、その式をE型として実行するべきか分かります。
(もしそうでなければ、事前にpushしておいた続きのコードブロックへのidに飛ぶ)

比較

手書きのBF(112命令,390ステップ,Wikipediaより):

++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.

Haskellのコード:

main=outputStr Halt "Hello World!"

outputStr k []=k
outputStr k (x:xs)=Output x (outputStr k xs)


変換した物(124711命令,1051859235ステップ):

変換過程:

なぜせっかく作ったbfvprofでの絵がないのかというと、ステップ数を見ていただけると分かるように、絵を描かせるのが結構難しいのです。


しかも実はこの比較はいんちきで、「手書き」の例にある改行がありません。改行があるとヒープに確保するノード数が255個を越えてしまうようです。(GCはまだ実装していません)

さてさて

前にリバーシ(with AI)を作ると言いましたが、早くも暗雲が立ちこめてきたようです。
何か

  1. まぁまぁ簡単に実装できて
  2. 劇的に速くなる(100倍くらい)

最適化はないんでしょうかね・・・。