1. HOME
  2. ブログ
  3. IT技術
  4. 【第1回】Brainfuckを実装しながら学ぶC++【Brainfuckとは】
brainfuckを実装しながら学ぶC++

【第1回】Brainfuckを実装しながら学ぶC++【Brainfuckとは】

第1回目~Brainfuckを実装しながらC++学ぼう

本連載では、「Brainfuck」の特性を理解しながら、実際に Brainfuck インタプリタを作成していきたいと思います!

実は、Brainfuck を理解するということは、C/C++ でつまずきがちな「ポインタの概念を理解する」ということにつながります。

つまり、Brainfuck インタプリタの実装は、プログラミング言語を深く学習するのに、もってこいの題材だということ。

今まで、C/C++ を避けていたプログラマの皆さん!

これを機に、C/C++ をマスターしながら、Brainfuck もマスターしていきましょう!

こちらの記事もオススメ!


Brainfuckとは

Brainfuck (またはBrainf*ck) は、実用性を無視した、難読プログラミング言語 (通称 Esolang ) に分類されます。

単なるユーモアプログラミング言語でありながら、チューリング完全 (≒なんでもプログラミング可能) な言語でもあるのです。

例えば、「Hello, world!」と出力させたければ、Brainfuck では以下のように記述します。

見た目は、何をしているのか、さっぱりですね…。

にもかかわらず、やっていることは、大したことありません!(笑)

Brainfuckの基本を学ぼう

連載第1回目では、まずは Brainfuck の仕組みを理解していきましょう!

Brainfuck には、8つの命令が存在します。

Brainfuckの命令

+ポインタの指す値を1加算する
-ポインタの指す値を1減算する
>ポインタを1つ進める
<ポインタを1つ戻す
[ループ始まり:ポインタの指す値が0ならば ] を指すポインタの一つ先に移動
]ループ終わり: [ を指すポインタに移動
.ポインタの値をASCIIコードで変換して出力
,入力を受け取る

以上の8つの命令で、Brainfuck は成り立っているのです。

これ以外は、全てコメントとみなされます。

さて、ここで「ポインタ」という概念が出てきました。

ポインタについて、簡単に説明します!

ポインタ (Pointer)

ポインタとは、その名の通り「指すもの」を表します。

何を指しているかというと、メモリ番地です。

プログラミングの世界では、変数や関数を読み取るとき、その内容をメモリに保存します。

例えば、4バイト分のメモリを使用する整数型の int であれば、次のように保持されます。

4バイト分のメモリを使用する整数型のintの表示

これら変数にアクセスするときは、メモリ番地をもとに参照しますよね?

そのメモリ番地を指すのが、ポインタです。

この場合、変数 num のポインタは「4」であり、「メモリ番地 4 」ということになります。

そこに格納されている値が、「123 (=0x007b)」ということです (「0x」は16進数)。

つまり、変数にアクセスしたときは、「まずはポインタで、メモリのどこに格納されているかを探し、その値を読み取る」というプロセスが起こっているわけですね!

ちなみに Brainfuck では、ポインタの初期値は「0」で、値も全て「0」です。

Brainfuckを実際に書いてみよう

では次に、実際に書きながら理解しましょう。

インタプリタは、WEBrainfuck のようなブラウザで動作するタイプでもいいですし、インタプリタをお手持ちの PC にインストールするタイプでも構いません。

macOS であれば、

で、できます。

Windows であれば、以下のリンクから、実行するでもいいでしょう。

【BFI.exe】
http://esoteric.sange.fi/brainfuck/compiled/win/BFI.exe

とりあえず 「H」 を出力させる

「Hello, world!」の前に、まずは一文字目の「H」を出力させてみましょう!

「H」は、ASCII コードでは、10進数で「72」です。

したがって、以下のようにポインタの指す値を「+」で72回インクリメントして、「.」で出力させれば良いのです。

これで「H」が出力されます。

...が、この調子で「Hello, world!」を出力させようとすると、まずそうな雰囲気が漂ってきますね(笑)

そこで、 [] の出番です。

ループで綺麗に書く

Brainfuck にも、Brainfuck らしい綺麗なコード、というものがあります。

[ は、最初に解説したように、今ポインタが指している値が「0」であれば、 ] の一つ後へ飛ぶ命令。

そして ] は、 [ に飛ぶ命令です。

これを使って、スマートに「H」を出力してみましょう

これでも「H」が出力されるはずです。

記法はこの限りではありませんが、 [] を使うだけで、Brainfuck らしいコードになります。

このとき、0番地目のメモリはループカウンタ、1番地目のメモリは「H」の ASCII コードを保持しています。

さらに細かく紐解くと、以下のような感じ。

ここまでくれば、あなたはもう Brainfucker ですね!

Hello, world!

それでは「Hello, world!」に挑戦しましょう。

各 ASCII コードは以下になります。

H72
e101
l108
o111
,44
[スペース]32
w119
r114
d100
!33

メモリの使い方によって、実装方法はたくさんありますので、ここでは一例を示します。

冒頭の例とは違った例で、できるだけループを使うようにしてみました。

ちなみに、コメントの+ーは、わざと全角にしています。

1行につき一文字です。

これを改行なしで書くと、さらに Brainfuck 感が出ますね(笑)

次回からはBrainfuckのインタプリタを作る

さて、Brainfuck の仕組みがわかったところで、いよいよ Brainfuck をデコードするインタプリタを作ってみましょう!

ポインタを扱うには、C/C++ が最適ですので、C/C++ の知識も同時に身につけていきます。

第2回へつづく!

今回は、実装する前の予備知識として、Brainfuck を解説しました。

次回からは、いよいよ C/C++ を使って、インタプリタの実装をしていきます。

本連載では、今まで C/C++ を触ったことがないような人にも、理解できるような内容になっているので安心してくださいね!

それでは、次回をお楽しみに!

第2回はこちら!

記事を書いた人

\ 3度のメシより技術が好き /
(株)ライトコードは、WEB・アプリ・ゲーム開発に強い「好きを仕事にするエンジニア集団」です。
システム開発依頼・お見積もりはこちらまでお願いします。
また、WEB・スマホ系エンジニアを積極採用中です!
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

こちらの記事もオススメ!


ライトコードよりお知らせ

にゃんこ師匠にゃんこ師匠
システム開発のご相談やご依頼はこちら
ミツオカミツオカ
ライトコードの採用募集はこちら
にゃんこ師匠にゃんこ師匠
社長と一杯飲みながらお話してみたい方はこちら
ミツオカミツオカ
フリーランスエンジニア様の募集はこちら
にゃんこ師匠にゃんこ師匠
その他、お問い合わせはこちら
ミツオカミツオカ
   
お気軽にお問い合わせください!せっかくなので、別の記事もぜひ読んでいって下さいね!

一緒に働いてくれる仲間を募集しております!

ライトコードでは、仲間を募集しております!

当社のモットーは「好きなことを仕事にするエンジニア集団」「エンジニアによるエンジニアのための会社」。エンジニアであるあなたの「やってみたいこと」を全力で応援する会社です。

また、ライトコードは現在、急成長中!だからこそ、あなたにお任せしたいやりがいのあるお仕事は沢山あります。「コアメンバー」として活躍してくれる、あなたからのご応募をお待ちしております!

なお、ご応募の前に、「話しだけ聞いてみたい」「社内の雰囲気を知りたい」という方はこちらをご覧ください。

ライトコードでは一緒に働いていただける方を募集しております!

採用情報はこちら

関連記事

初心者が3ヶ月でどれくらいプログラミングができるようになるのか

採用情報

\ あの有名サービスに参画!? /

バックエンドエンジニア

\ クリエイティブの最前線 /

フロントエンドエンジニア

\ 世界はお前の手の中に・・・ /

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア

初心者が3ヶ月でどれくらいプログラミングができるようになるのか

初心者が3ヶ月でどれくらいプログラミングができるようになるのか