1. HOME
  2. ブログ
  3. IT技術
  4. 【番外編】Brainfuckを実装しながら学ぶC++【改造編】
【番外編】Brainfuckを実装しながら学ぶC++【改造編】

【番外編】Brainfuckを実装しながら学ぶC++【改造編】

番外編~Brainfuckを実装しながら学ぶC++

さて前回で、「Brainfuckを実装しながら学ぶC++」シリーズのメインは、終わりを迎えましたね!

今回は番外編ということで、出来上がったコードを、少しだけ改造してみたいと思います。

皆さんのオリジナルの Esolang 作成、または C++ 学習の一助となれば幸いです。

命令を変えてみよう

まずは、一番簡単なアレンジです。

の部分を好きなものに変えてみましょう。

例えば、

と変えるだけでも、オリジナルの Esolang になりますね!

ただし、 char 型は1バイト文字なので、文字列は指定できません

さらに、C / C++ の switch 文は、「整数」もしくは今回のような「1バイト文字」しか分岐が行えません。

この文字列を使った、Esolang 作成の対処については、後半で紹介します。

switchではなくmapを使う

実は、 switch を使わずとも、Brainfuck インタプリタは作成できます。

その場合、 std::map<> を使います。

これは、Python の辞書型変数のように扱うことができる、便利な STL (Standard Template Library) の一つです。

mapの使い方

まずは、インクルードしましょう。

これで使えるようになります。

キーは、どんな型でも良いのですが、例えば以下のように扱います。

stringをキーとして関数を呼ぶ

map を使った実装では、例えば「 "+" をキーとしたら、 increment() を呼ぶ」のように実装する必要があります。

つまり、以下のように呼び出せるのが理想です。

こういった処理は、関数ポインタを利用して、実装する手段があります。

関数ポインタとは、その名の通り関数へのポインタです。

このように、関数ポインタは void (*) のように、括弧が必要です。

なぜ括弧が必要かと言うと、こういうことです。

ややこしいですね…

ちなみに、その後ろの括弧は引数です。

Brainfuckインタプリタに適用してみる

早速、関数ポインタと map を駆使して、インタプリタを再構築してみましょう!

まずは、各命令に対して、関数を定義します。

このとき、全ての関数について「ポインタ」や「メモリ」は弄る対象となるので、参照渡しで定義しましょう。

中身は、前回実装したものと同じです。

まずは、関数部。

これらを格納する、map を定義します。

このように定義することで、Brainfuck 解析部分の while 文の中は、以下のようにかなりスッキリしますね!

ちなみに、map を使った方が、コードの管理はしやすいかもしれません。

ですが、switch の方が、実行速度が速いのです。

文字列を命令にする

map を利用すれば、文字列を命令とした、Esolang が作成できるようになります。

命令を文字列へ

このとき、コンパイル時定数は、型変換を明記しておかないと Warning が出てしまいます。

なので、一応 (char*) のように、キャストしてあげましょう。

また、実装のしやすさを考慮して、命令の長さも固定しておくパターンにします。

mapのキーも文字列へ

細かな調整

命令をコードからどう切り取るか、コードポインタをどう進めるかも、修正していきましょう。

あとは、ループ処理の部分で、コードポインタの取り扱いを変更するだけとなります。

これで OK です。

試してみる

実装の簡略化で、コードの空白と改行については、取り除く部分は書いていません。

なので、それらがない Esolang コードを、読み取らせてみましょう!

上のようになれば成功です!

より難解な、オリジナル Esolang が出来上がりましたね!

さいごに

今回は番外編で、オリジナルの Esolang を作成してみました。

もしかしたら、「少し難しい内容だった」という方も、中にいるかもしれませんね!

ただ、もっと改良すれば、日本語のマルチバイト文字を使った Esolang も実現できてしまいます。

余力のある方は、ぜひチャレンジしてみてくださいね!

以上で、番外編含め本連載は終了になります。

ここまでお付き合いいただき、ありがとうございました!

第1回目はこちら!

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


書いた人はこんな人

ライトコード社員ブログ
ライトコード社員ブログ
「好きなことを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。

システム開発依頼・お見積もりは大歓迎!
また、WEBエンジニアとモバイルエンジニアも積極採用中です!

ご応募をお待ちしております!

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

\ みんなが使うアプリを創る /

iOSエンジニア