1. HOME
  2. ブログ
  3. IT技術
  4. 【第3回】Brainfuckを実装しながら学ぶC++【実装してみよう!中編】
【第3回】Brainfuckを実装しながら学ぶC++【実装してみよう!中編】

【第3回】Brainfuckを実装しながら学ぶC++【実装してみよう!中編】

第3回~Brainfuckを実装しながら学ぶC++

今回で、「Brainfuckを実装しながら学ぶC++」シリーズの第3回目となりました。

ちなみに前回は、今回に備えて、C/C++ の基礎を解説していきましたね!

さて今回は、いよいよ本格的な BrainFuck の実装に入っていきます。

やや長丁場になりますが、一緒に頑張っていきましょう!

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


大枠の実装

前回に引き続き、「brainfuck」プロジェクトを使用します。

まずは、大枠を作っていきましょう!

命令の定義

連載の第1回目に解説したように、Brainfuck には、8つの命令が存在します。

それらを定数として、まずは定義していきましょう。

C++ 11 からサポートされる constexpr 修飾子は、以前まで使われていた #define INCREMENT '+' という、マクロ定義によるコンパイル時定数と同じ役割。

これらはその名の通り、コンパイル時に評価され展開されるため、実行時間の短縮につながります。

ちなみに C++11 以降でも、 #define で定数定義している人は多くいますが、公式では constexpr の使用を推奨しています。

各種変数の初期化

次に、以下を初期化するコードを書いていきましょう。

  1. メモリのサイズ
  2. ポインタの初期位置や値
  3. Brainfuck コード読み取りのポインタ
  4. Brainfuck コードの長さ

実際のコードは、次の通り。

memset() は、C 言語時代からあるもので、配列要素を一括初期化できる関数です。

ただ現在では、今回のような単純な配列の初期化などに、使われることが多くなりました。

ファイルの読み込み

今回作成しているインタプリタは、以下のような使い方を想定しています。

ですので、「コマンドラインからの引数受け取り処理」と「そのファイル読み込み機構」を、ここで実装していきたいと思います。

コマンドライン引数の受け取り

C++ では、標準でコマンドライン引数を処理する機能があるので、とても簡単!

メイン関数に、以下のような引数を指定します。

argc は、自身の命令と、後続のコマンドライン引数を含んだ数値が格納されます。

argv 配列には、それらの文字列が格納されます。

例えば、 $ brainfuck samplecode.bf と実行すれば、

となります。

念のため、引数がなかった場合のエラー処理も書いておきましょう!

cerr は、エラー出力用の出力ストリームです。

ファイル読み込み

次に、コマンドライン引数で受け取ったファイル名を元に、ファイルを開く処理を実装しましょう。

ファイルの扱いは、 #include <fstream> で使用可能になります。

ファイル読み込みは std::ifstream、書き込みは  std::ofstream を使用します。

今回は、読み込みだけなので、以下のようになります。

ファイル処理

それでは、ファイルが上手く開けた場合の処理を考えます。

ここで取得したいのは、ファイルの中身 (スペース・改行含む) と、コードの長さ。

ファイル全体を一括で読み込みたいときは、 std::stringstream を利用することで、簡単に実現できます。

ここでビルドディレクトリに、以下のような Brainfuck コードを追加して、動作確認をしましょう。

上のコードを、「hello.bf」として保存します。

そして、

このように表示されれば、ファイル読み込みが上手く動作しています。

コード解析部の大枠作成

次に、核となる Brainfuck コード解析部分の大枠を作成して、今回は終わりにします。

基本は、命令を一つずつ読み込んでいくだけなので、以下のようなループが大枠です。

この while 文の中身で、その命令によって処理を分けていくのですが、ここではそれを switch 文を使用して実装していきます。

まだ、各ケースは実装していないので何も起こりませんが、次回からはこの部分を実装していきます。

ここが完成すれば、Brainfuck インタプリタは出来上がりです!

第4回目へつづく!

今回は、インタプリタ実装に本格的に着手しました。

ただ、まだ「読み込んだコードをそのまま出力するだけ」という、実用性のないコードになっていますね…。

というわけで次回は、これを基に、どんどんコードを発展させていきましょう!

具体的には、インタプリタの核を実装していきます。

では、次回もお楽しみに!

第4回はこちら!

第1回目はこちら!

記事を書いた人

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

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


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

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

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

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

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

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

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

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

採用情報はこちら

関連記事

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

採用情報

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

バックエンドエンジニア

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

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

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

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア

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

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