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

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

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

連載「Brainfuckを実装しながら学ぶC++」シリーズの第2回目です。

さて前回は、導入ということで、Brainfuck の仕組みを解説しました。

今回からは、実際に C/C++ を使って、実装していきましょう。

…と言いたいところですが、今回はまず C/C++ の基本的な話を中心に、解説していきたいと思います!

ですので、必要のない方は読み飛ばしていただいて OK です。

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


環境構築

これは、必要な人だけ読んでください。

今回必須な環境は、C/C++ コンパイラ「gcc」と、ビルドで使う「CMake」です。

「過去にインストールしたかもな…」と思った方は、以下のコマンドで確認してみてください。

gcc/g++

gcc は、C/C++ コンパイラの一つです。

macOS であれば、Homebrew で簡単にインストールできます。

ちなみに macOS では、デフォルトで「Clang」というコンパイラが入っているのですが、おそらくデフォルトのままでも大丈夫かと思います。

もし、筆者の環境と同じものにしたい場合は、Homebrew で新たに gcc を入れてください。

Windows では、MinGW というインストーラがよく利用されます。

CMake

CMake は、C/C++ ソースファイルを「解析・コンパイル」して、実行ファイルを生成するための Makefile を生成してくれるツールです。

macOS では、こちらも Homebrew でインストールできます。

または、Windows 含め、以下からインストーラを入手することもできます。

【 CMake 公式サイト】
https://cmake.org/download/

C/C++プロジェクトを作る

プロジェクトディレクトリをつくるほどのものではありませんが、CMake を利用したいので作成します。

ちなみに、Jetbrains 社の C/C++ IDE である「CLion」では、同じようなプロジェクトが自動で生成されます。

もし、ライセンスを持っている方は、ぜひ試してみてくださいね!

さて本連載では、プロジェクト名を「brainfuck」としておきます。

まずは、以下のようなディレクトリ構成を作成しましょう。

それぞれのファイルに、以下のようなコードを書いてみてください。

※  CLion で自動生成されるものと同じです。

CMakeLists.txt

正直なところ、もっと古いバージョンでも実装可能ですが、今回は C++11 にしておきます。

main.cpp

こちらはよくある、最初の一歩「Hello, World!」です。

深く C++ を理解したいエンジニアのために、この基本的なコードを細かく解説していきます。

まず、 #include <iostream> は、入出力に関する標準ライブラリを読み込んでいる記述です。

メイン関数 int main(){ } では、Java におけるメインクラスのように、このスコープ内のコードが順に実行されていきます。

std:: は、標準ライブラリの名前空間 (namespace) です。

名前空間は、関数名やクラス名などに重複がないことがハッキリしていれば、以下のように省略ができます。

ちなみに、上のコードの各意味は、次のとおりです。

  1. cout :出力ストリーム
  2. endl :改行
  3. << :C++ では演算子のひとつ
  4. cout :文字列や数値型を出力にスタックする

ビルドして実行してみる

CMake を利用したビルドと実行は、とても簡単。

上手くいきましたね!

C/C++の基本要素

型と関数

C/C++ では、常に明示的に型を記述する必要があります

これは関数も同様で、返すものの型を明記します。

もし、何も返すものがないのであれば、以下のように void を使用します。

他にも、よく使われる型として、以下のような型があります。

int整数型 (32bit = 4byte)
float単精度浮動小数点型 (32bit = 4byte)
double倍精度浮動小数点型 (64bit = 8byte)
char文字型 (8bit = 1byte) ( string の構成要素であり整数も一応扱える)

ポインタ

C/C++ の重要な要素、「ポインタ」の扱いにも、軽く触れておきます。

通常、変数は他の言語と同じく、値を指すものとして保持されます。

以下のようなコードは、違和感なく見ることができますよね?

ところが、値そのものではなく変数のアドレスを扱いたい場合には、「 *」と「 &」を使う必要があるのです。

例えば、以下のような具合です。

型名に * を付ければ、その変数はメモリアドレスを持つ変数になります。

ちなみに、 int* a_ptr と  int *a_ptr は同じ意味です。

また逆に、変数のメモリアドレスを参照する場合は、 &a と記述します。

このメモリアドレスを扱う、ということを理解するには、値渡し参照渡しを比較してみるのが一番です。

このように、単に値が同じであることと、メモリアドレスを共有するということの違いが分かるかと思います。

Python では、基本は全て参照渡しなので、最初は困惑するかもしれません。

関数の引数でも同じです。

例えば以下のように、関数の引数に & を明示的に記せば、変数名は違っても同じアドレスを指すものとして扱われるようになります。

ポインタと配列

ここからは、さらに重要な話になります!

C/C++ における配列についてです。

通常 C/C++では、以下のように配列を定義できます。

ここは、特に問題ないでしょう。

しかし、以下のコードでは、どのように出力されるでしょうか?

試してみると分かりますが、 0x7ffeeebbeb3c のように、何かのメモリアドレスが出力されます。

これは、配列の先頭要素のアドレスです。

つまり、配列は一種のポインタであることが分かります。

さらに、ポインタですので、以下のように扱うことも可能です。

C/C++ のポインタは、かなり奥が深いですが、今回での基本的な話は以上になります。

その他に大切な要素は、インタプリタを実装しながら、確認していきましょう!

第3回目へつづく!

さて今回は、Brainfuck インタプリタを始める前に、大事な環境構築と C/C++ の基本の話をしました。

次回からは、いよいよ本格的な実装をしていきます!

その中で、C++ の大事な要素もバンバン出てきますので、これを機に C++ に入門していきましょう!

第3回はこちら!

第1回目はこちら!

記事を書いた人

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

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


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

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

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

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

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

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

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

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

採用情報はこちら

関連記事

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

採用情報

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

バックエンドエンジニア

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

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

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

モバイルエンジニア

\ サービスの守り神! /

インフラエンジニア

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

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