*Brainf*ck [#f7d1af24]

#contents

*はじめに [#o7747c97]
なんか、Brainf*ckのページでも作ってみようかなーなんて。~
いっしょに楽しく学びましょう。

*言語の特徴 [#gbc97476]
命令が8つしかない。以下は[[Wikipedia:http://ja.wikipedia.org/wiki/Brainfuck]]からの引用。~
+> ポインタをインクリメントする。ポインタをptrとすると、C言語の「ptr++;」に相当する。
+ < ポインタをデクリメントする。C言語の「ptr--;」に相当。
+ + ポインタが指す値をインクリメントする。C言語の「(*ptr)++;」に相当。
+ - ポインタが指す値をデクリメントする。C言語の「(*ptr)--;」に相当。
+ . ポインタが指す値を出力する。C言語の「putchar(*ptr);」に相当。
+ , 1バイトを入力してポインタが指す値に代入する。C言語の「*ptr=getchar();」に相当。
+ [ ポインタが指す値が0なら、対応する ] までジャンプする。C言語の「while(*ptr){」に相当。
+ ] ポインタが指す値が0でないなら、対応する [ にジャンプする。C言語の「}」に相当。


*処理系 [#qc72773f]
[[The Brainfuck Archive:http://esoteric.sange.fi/brainfuck/]]の、 impl/compilers/BF2C.c を保存します。~
~
BF2C.cをCのコンパイラでコンパイルすると、BrainfuckのソースをCのソースに変換してくれるプログラムができあがるので、~
Cに変換されたソースをもう一度Cコンパイラでコンパイルして実行してください。~
こんな感じ。~
~
 program.bf ー(BF2C.exe)→ program.c ー(Cコンパイラ)→ program.exe~
~
また impl/interp/ 以下にインタープリタもあるようなので、UNIX系OSではそちらを使って #!/usr/bin/bfi などとした方がラクでしょう。

*Hello, World! [#jb4847a8]
さて、Wikipediaの[[Hello worldプログラムの一覧:http://ja.wikipedia.org/wiki/Hello_world%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AE%E4%B8%80%E8%A6%A7]]に、こんなコードが載っております。~
  +++++++++[>++++++++>+++++++++++>+++++<<<-]>.>++.+++++++..+++.>-.
  ------------.<++++++++.--------.+++.------.--------.>+.
これを実行するとたしかに Hello, World! と表示されますが、最初はわけがわからないのでちょっと解説を。~
~
まず一つ目の +++++++++ ですが、これは次の [ ] ループのためのループ回数の設定です。これを念頭に置いてコードを読むと良く分かります。~
~
次に [ がありますが、今ポインタの内容は最初に9まで増やしたので、0ではありません。従って ] までジャンプはせずに、中に入ります。~
そして >++++++++>+++++++++++>+++++<<<- が実行され、メモリの内容は
  [8][8][11][5][0][0]……
となります。~
~
[ ] ループはメモリの先頭のが0になるまで(つまり9回)繰り返され、ループが終わった時点でメモリの内容は
  [0][72][99][45][0][0]……
となります。~
~
あとは見てもらえれば分かると思います。72が H の文字コード、99が c の文字コード、45が  , の文字コード-1で、この3つを基準にいくつかずらして表示しています。(例えばeなら 99+2 と言った感じで。)
*続く [#pc01092f]
多分続くよ!

トップ   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS