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

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


書いた人はこんな人

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

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

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

関連記事

採用情報

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

バックエンドエンジニア

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

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

\ 世界を変える…! /

Androidエンジニア

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

iOSエンジニア