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・スマホ系エンジニアを積極採用中です!
※現在、多数のお問合せを頂いており、返信に、多少お時間を頂く場合がございます。

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


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

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

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

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

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

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

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

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

採用情報はこちら

関連記事

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

採用情報

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

バックエンドエンジニア

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

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

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

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア

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

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