TechCraft – エンジニアのためのスキルアップメモ

エンジニアのスキルアップを少しでも加速する技術ブログ

Brainfuck で Hello World

BrainfuckHello World

1. はじめに

Brainfuck は、1993年に Urban Müller によって作られた極端に小さな命令セットを持つ難解プログラミング言語です。その名の通り「頭を混乱させる(brain-f*ck)」ような言語であり、チューリング完全ながらも理解しにくい特徴を持っています。

今回は、Brainfuck で「Hello, World!」を出力するコードを紹介し、その動作を細かく解説します。


2. Brainfuck の基本

Brainfuck は、以下の 8 つの命令のみで構成されます。

コマンド 説明
> ポインタを右に移動
< ポインタを左に移動
+ ポインタが指すセルの値を 1 増やす
- ポインタが指すセルの値を 1 減らす
. ポインタが指すセルの値を ASCII 文字として出力
, ユーザーから 1 文字入力を受け取り、現在のセルに格納
[ 現在のセルが 0 でなければループを開始
] ループの終わり。現在のセルが 0 でなければ [ に戻る

Brainfuck のメモリは 30000 個のセル(0 初期化)で構成されており、ポインタを左右に移動しながらセルの値を操作します。


3. Hello, World! のコード

以下は、Brainfuck で「Hello, World!」を表示する標準的なプログラムです。

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

出力結果:

Hello, World!

4. 詳細なコード解析

上記のコードを部分ごとに分解して解説します。

(1) メモリ初期化

++++++++++

この部分は、セル010 に設定します。

(2) ループで特定の数値を作成

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

このループの中で、以下のように各セルに値を格納します。

セル番号 目的
0 0 (ループ終了)
1 70 'F' の基準
2 100 'd' の基準
3 30 制御用
4 10 制御用

(3) 文字の出力

ここから、各セルの値を . コマンドで出力します。

>++.  // セル1(70) + 2 = 72 → 'H'
>+.   // セル2(100) + 1 = 101 → 'e'
+++++++.   // 'l'
.  // 'l'
+++.   // 'o'
>++.   // ','
<<+++++++++++++++.   // ' ' (スペース)
>.   // 'W'
+++.   // 'o'
------.   // 'r'
--------.   // 'l'
>+.   // 'd'
>.   // '!'

このように、メモリの値を ASCII 文字に変換しながら Hello, World! を表示しています。


5. Brainfuck の実行方法

Brainfuck のコードを実行するには、以下のいずれかの方法を使用します。

(1) オンラインエミュレーター

以下のサイトで Brainfuck のコードを実行できます。 - dcode.fr Brainfuck Interpreter - paulshannnon.net Brainfuck Online

(2) ローカルで実行する

以下のような Brainfuck インタプリタを使うことで、ローカル環境で実行可能です。

Python の場合

import sys

def brainfuck_interpreter(code):
    tape = [0] * 30000
    ptr = 0
    loop_stack = []
    pc = 0
    output = ""

    while pc < len(code):
        cmd = code[pc]

        if cmd == ">":
            ptr += 1
        elif cmd == "<":
            ptr -= 1
        elif cmd == "+":
            tape[ptr] = (tape[ptr] + 1) % 256
        elif cmd == "-":
            tape[ptr] = (tape[ptr] - 1) % 256
        elif cmd == ".":
            output += chr(tape[ptr])
        elif cmd == ",":
            tape[ptr] = ord(sys.stdin.read(1))
        elif cmd == "[":
            if tape[ptr] == 0:
                open_loops = 1
                while open_loops:
                    pc += 1
                    if code[pc] == "[":
                        open_loops += 1
                    elif code[pc] == "]":
                        open_loops -= 1
            else:
                loop_stack.append(pc)
        elif cmd == "]":
            if tape[ptr] != 0:
                pc = loop_stack[-1] - 1
            else:
                loop_stack.pop()

        pc += 1

    print(output)

# 実行
brainfuck_interpreter("++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++."
                      ">++.<<+++++++++++++++.>.+++.------.--------.>+.>.")

6. まとめ

Brainfuck は非常にシンプルな命令セットを持ちながらも、意外なほど強力なプログラミング言語です。特に以下の点に注目すると面白いです。

  • 8つの命令だけでチューリング完全
  • メモリ操作を手動で行うため、低レベルプログラミングの理解が深まる
  • 最小限の構造で「Hello, World!」が動作する

興味のある方は、さらに大きなプログラム(FizzBuzz、電卓、BrainfuckBrainfuck インタプリタを作るなど)に挑戦してみてください。

また、以下の参考サイトも Brainfuck を学ぶのに役立ちます。 - Brainfuck Wikipedia - esolangs.org