Branfuck、試してみた
作成日時: 2022/12/01
更新日時: 2022/12/05
# はじめに
brainf\*ckとは、`+` `-` `[` `]` `>` `<` `.` `,`のみで表現する、~~頭のおかしい~~珍しいプログラミング言語です。
ふと気になって試してみたので、ついでに記事にしました。
# インストール
mac使ってるのでhomebrew経由で入れます。
```
brew install brainfuck
```
## バージョン確認
一応実行。
```
brainfuck -v
```
結果。
```
brainfuck 2.7.3 (Nov 10 2021, 23:20:41)
Copyright (c) 2016 Fabian Mastenbroek.
Distributed under the Apache License Version 2.0.
```
# 基本操作
`+`で値を1つ増やし、`-`で値を1つ減らす。
`>`でポインタ(参照先の場所)を右にずらし、`<`で左にずらす。
`.`で出力。
これだけ。
## イメージ
ポインタを知ってるとあーはいはいって感じだと思います。
`+`で値を1つ増やしたり
`>`で参照先の箱を右にずらしたり
`++`で値を2つ増やしたり
`.`で出力したり。

# "A"
`Hello World`はややめんどくさそうなので、とりあえず`A`を出力してみます。
**ファイルの拡張子は`.bf`、実行は`brainfuck ファイル名`。**
```
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.
```

`A`が出力されました。
ちなみに`+`を65個書いてますが、65はasciiコードで`A`に対応しています。([asciiコード表](https://e-words.jp/p/r-ascii.html)
一般的な言語でも、char型の'A'をint型にキャストして出力すると`65`が出力されると思います。
# "A\nB\nC\n"
ABCの間に改行を入れて出力してみます。
改行の`\n`はasciiコードで10と対応しています。
```
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++<.>.<+.>.<+.>.
```

## 解説1
1. `+`を65個入力し、`A`を保存する。
2. `>`でポインタ(参照先の場所)を右にずらす。
3. `+`を10個入力し、`\n`を保存する。
4. `<`で参照先を左(`A`が格納されている場所)にずらし、`.`で出力。
5. `>`で参照先を右(`\n`が格納されている場所)にずらし、`.`で出力。
6. `<`で参照先を左にずらし、`+`で値を1つ増やし(66になる)、`.`で出力。
7. 5, 6, 5を繰り返し、`\nC\n`を出力する。
# while文
**`[`でループを開始し、`]`が読まれた時に参照している値が0の場合、ループを抜ける**
先ほどの`A\nB\nC\n`をwhile文を使って多少汎用性をあげます。
```
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>++++++++++>+++[<<.+>.>-]
```

## 解説2
1. `+`を65個で`A`を保存。
1. `>`で参照先を右にずらし、`+`10個で`\n`を保存。
1. `>`で参照先を右にずらし、`+`3個分(ループ回数の変数用)を保存。
1. `[`でループ開始。
1. `<<`で参照先を左に2つずらし、`.`で`A`を出力、`+`で値を1つ増やしておく。
1. `>`で参照先を右にずらし、`.`で`\n`を出力。
1. `>`で参照先を右にずらし、`-`で値を1つ減らす。
1. 5-7を3回繰り返すと、右端の箱の値が0になり、`]`でループ終了。
# その他
- 四則演算とかやるとしたら各桁の箱用意して他の言語が内部の2進数でやってるような事を頑張るしかないですかね。。
# 参考文献
- [Brainfuck](https://ja.wikipedia.org/wiki/Brainfuck)
wikipediaです。
- [Brainfuck 超入門](https://qiita.com/TomoShiozawa/items/25dcce1540085df71053)
qiita記事です。ぶっちゃけこれでいい。