表示調整
閉じる
挿絵表示切替ボタン
▼配色
▼行間
▼文字サイズ
▼メニューバー
×閉じる

ブックマークに追加しました

設定
0/400
設定を保存しました
エラーが発生しました
※文字以内
ブックマークを解除しました。

エラーが発生しました。

エラーの原因がわからない場合はヘルプセンターをご確認ください。

ブックマーク機能を使うにはログインしてください。
12/16

プログラム言語探訪 C++

 俗称、というか呼び方としては「シープラプラ」と呼ばれる、C言語から派生した言語で1983年に公開されたそうなので、これまた歴史の長い言語ですね。作者が触れた4番目の言語で一番付き合いの長い言語です。

 元々はC with Classesという名前で開発されていたそうですが、正式に公開するにあたり、C++に名前を変更しているのですが、ちょっとこれ洒落てます。

 こんなプログラム


 int c , d;

 c = 1;

 d = c++;

 printf( "c=%d\nd=%d\n" , c , d );


 これを実行したときの結果って、cは2になっているのに、dは1のまま。つまり、cの値は一つ進めるけど外からはcのままです、という意図があるとかないとか。

 さて、そんなC++ですが、ざっくり簡単にいってしまうと、C言語の構造体の機能を拡張した言語。どんな拡張かというと三つほど。

 一つ目は構造体のメンバに変数――データメンバと呼びます――だけでなく関数――こちらはメンバ関数と呼ぶ――も格納できるようになりました。

 二つ目は構造体のデータメンバとメンバ関数にアクセス制御を与え、外から読み書き実行できる/できないを設けました。

 三つ目は構造体を継承して新しい構造体を作れるようにしたこと。

 そして、これらの特徴を備えた構造体をクラス――実体化されるとオブジェクトと呼ぶ――と呼ぶようにして class というキーワードで定義するようにしています。そしてこのクラスをガンガン使ってプログラムを書く書き方をオブジェクト指向プログラミングと呼んだりします。

 実はC言語の構造体定義である、structでもクラスの定義は可能です。訳わからなくなるのであまりやりませんが。

 で、このC++によるオブジェクト指向プログラミングって、便利なんですよね。何がどう便利なのかというと、二つ目のアクセス制限がとても便利。これを活用すると、複数の関数で変数を共有しつつ、他からはアクセスできないという、便利なグローバル変数っぽいモノが作れるようになりました。このおかげで、例えばログファイル出力するクラスを作ると、プログラムの最初から最後までログファイルを追記モードで開きっぱなしで使えたりします。


 class LogWriter

{

private:

FILE *fp;

public:

LogOpen( char *log_name )

{

fp = fopen( log_name , "at" );

}

LogWrite( char *log_str )

{

fprintf( fp , "%s\n" , log_str );

}

LogClose( void )

{

fclose( fp );

}

 };


 雑に書くとこんな感じ。ログファイルにアクセスしている変数fpはクラスの外からは見えない代わりに、LogOpenからLogCloseまでの間はずっと維持されるので外から意識する必要はない、という感じです。勿論、こんな雑なクラスは使ってはいけません。あくまでも()です。作者はログ出力用クラスを自作して使ってますが、もっとちゃんとした作りになってます。

 また、付随する機能としてコンストラクタ、デストラクタというのがあって、クラスを実体化させる、つまりオブジェクトにするときにコンストラクタが実行され、オブジェクトが消滅するときにデストラクタが実行されるようにできます。変数の初期化忘れや終了時の後片付け――ファイルのクローズやデータベースへのセッションクローズなど――が自動化できるので、プログラムの記述がすっきりするのと凡ミス的なバグが減ります。先ほど示した例で行くと、コンストラクタでログファイルを開いて、デストラクタでファイルを閉じるようにすれば、きれいに処理が行われます。

 さて、作者がC++を本格的に勉強したのは大学四年になってからで、卒論がC++で作ったプログラムについて、でした。どんなプログラムかというと、UNIX系のXというウィンドウシステムで動くお絵かきツール。マウス操作で丸三角四角を描き、曲線矢印で結んでそれぞれに文字列を入れられるという……最近のオフィス系アプリケーションでは当たり前でありながら、当時のアプリケーションではまだ機能が不十分だったようなものを手作りしておりました。このとき、図形の機能をクラスで作ったんですね。

 基本となる図形クラスとそこから円のクラス、三角のクラス、四角のクラス、曲線矢印のクラス、といった具合に派生させ、図形を具体的に描画するのは派生させたクラスにやらせ、マウスで図形選択、文字列の入力、表示なんかは基本の図形クラスで、という分担をさせて作りました。さらに言うと印刷機能も作ったりしてます。

 コメントを大量に書いていたので、実行部分がどのくらいか覚えてませんが、それでもソースコードは五千行ほどで、当時の大学のワークステーションでコンパイルすると十分くらいかかりました。その頃のC++コンパイラって、C++→C言語という変換をしてからコンパイルしていたそうで、やたらに時間がかかってましたね。ちょっとした修正のたびに時間がかかって結構大変でした。朝から晩までプログラム書いて実行して、ができた環境だからこそ完成したとも言えるでしょう。今のコンパイラならもっと高速にできると思いますが、残念ながらソースは手元に残っておらず、確認のしようがありません。

 そして、このプログラムについて卒論を書いて教授たちの前で発表したら、ちょっとした騒ぎになりました。

 だいたいの場合、卒論発表って教授やら助教授やらが「それは○○ということか?」「その根拠は?」というツッコミを入れ続ける場なのですが、作者の場合「それ、動いてるところを見せてほしい」「図形を動かすと矢印もついてくるのか?」と行った具合で、質問の方向性が違うだろ、という感じになってました。ちなみに、卒論の評価は学科でトップでした。ツッコミどころがなかったのがポイントだったようです。

 それはさておき、C++ですが、歴史の古さと同時に人気も安定しており、前回のC言語と人気を二分する……というほどではないにしろ、人気のプログラム言語ランキングでも常に上位です。また、ソースコードの書き方がほかの言語にも継承されていて、特にJavaなんかはそのまんま受け継いでいたりしますので、それぞれの言語独自のライブラリを呼び出すようなところ以外ではぱっと見区別がつきません。

 また、言語の規格も常に更新され続けていて、最新の規格はC++20と呼ばれる、2020年に標準化されたものとなっています。世の中の流れ的なものとしてUnicodeへ対応する機能を追加してみたかと思えば、ほかの言語で採用されているものを取り込んでみたりとかしていて……ぶっちゃけ、世界でいちばん文法がややこしくなったプログラム言語とも呼ばれるとか。作者も最新の規格はほとんど追っかけていなくて、先に挙げたようなクラスの便利機能だけをつまみ食いする、「ベターC」的な使い方がメインです。

 では作者は普段、何に使っているのかというと、小説のネタ用プログラムですね。一部の小説でステータスとかスキルとか出してますが、あれ、全部プログラムで作ってます。

「現在のレベル、獲得経験値がこう」で、「モンスターの経験値がこう」だから、「○匹倒したときに、獲得ボーナスが○%入って、全体でこうなる」ので、「レベル○になる」と、「各ステータスはこう」なる。というのをパパッと計算。基本ステータスからHPやMPを算出してみたりする他、コピペして本文に貼り付ける機能も作っていたり。それこそ、「筋力はレベルが○上がる間に△上がる」というのを入れてあったりするので、レベルをちょっとずつ上げていくと、ステータスがランダムに上がっていくように見えたりして、ちょっと楽しいですね。

 という具合に、これからも作者が付き合っていく言語なんだろうな、というのがC++、です。

評価をするにはログインしてください。
ブックマークに追加
ブックマーク機能を使うにはログインしてください。
― 新着の感想 ―
このエピソードに感想はまだ書かれていません。
感想一覧
+注意+

特に記載なき場合、掲載されている作品はすべてフィクションであり実在の人物・団体等とは一切関係ありません。
特に記載なき場合、掲載されている作品の著作権は作者にあります(一部作品除く)。
作者以外の方による作品の引用を超える無断転載は禁止しており、行った場合、著作権法の違反となります。

この作品はリンクフリーです。ご自由にリンク(紹介)してください。
この作品はスマートフォン対応です。スマートフォンかパソコンかを自動で判別し、適切なページを表示します。

↑ページトップへ