最終更新:2021年10月25日(変更履歴

Shintaro Mori's the art of C++ programming

プログラムは人間がコンピュータに何か指示を与えるための命令、それを記述することばがプログラミング言語、それを記述する行為がプログラミングです。コンピュータはデジタル情報(すなわち0と1が並んだビット列)しか理解することができないので、コンピュータと会話したい場合はプログラミングによって実現します。パソコンはコンピュータの代名詞として扱われ、ハードウェアと呼ばれる物理的な機械と、ソフトウェアと呼ばれるプログラムの組み合わせで動作しています。本稿ではとくにソフトウェアの部分に焦点をあて、プログラミングの基本を解説します。

Homepage | Previous

アジェンダ


なぜプログラミングをするのか

今日、コンピュータのない生活は考えられないくらい様々なシーンで利用され、生活の一部となっています。例えば小型のマイコンと呼ばれるチップ状のコンピュータは、我々の身近にある電化製品のほとんどに使用されています。これらの存在は普段の生活で意識されることはありませんが、POS レジやCAT(クレジット端末)のトラブル、外出時に携帯電話・スマートホンを忘れた際に、その存在の大きさを痛感することがよくあります。議論の対象をパソコンに限定するとき、インターネット、メール、ワープロソトや表計算ができれば通常の使用ではこと足りることが多いかと思います。また必要になれば、その都度別のソフトウェアを導入することで、目的とするタスクを遂行することが可能になります。それらソフトウェアは店頭やオンラインでダウンロード販売されていたり、インターネットやパソコン雑誌などで簡単に手に入れることができます。

このような状況において、手に入らないソフトウェアが必要になった場合に対処できるかもしれませんが、なぜプログラミングを学習する必要があるのでしょうか。プログラミングを始めるきっかけは人によって異なるかと思いますが、例えば大学や高専など学校で必要になる、企業や関係機関で必要になる、または純粋に趣味の世界などがあるように思います。私的にはプログラミングにより自分専用のソフトウェアを作ることはとてもおもしろくて、完全に趣味の世界で始めたが、気がつけば大学などにおける研究活動でプログラミングの存在が様々なシーンで切り札となりました。動機はどうであれ、情報化社会を生き抜く現代社会の人たちには、プログラミングをある程度理解しておくメリットは非常に大きいように思います。

プログラミングは敷居が高くて全く理解できなかったり、そもそもお金が必要になるなど、マイナスのイメージをもたれる誤解もあります。実際マニアックなプログラミングや効率的にプログラムを実装するのであれば、統合開発環境と呼ばれる数万円単位のソフトウェアが使用されることがあります。ただしお金をかけなくてもプログラムを作成しソフトウェアを開発することは可能です。初めてプログラミングを勉強する場合は、無料で作れる範囲でプログラミングを練習し、徐々にツールを増やしていけば十分かと思います。ぜひこの機会にプログラミングをはじめて、少し遊んでみてはいかがでしょうか。

△目次に戻る

プログラミング言語の選択

ソフトウェアを作成するためにプログラミングをしようと考えます。遠い昔、コンピュータが誕生しソフトウェアが開発され始めた頃のプログラミングの世界では、アセンブリ言語と呼ばれる直接機械を操作する言語が用いられていました。原始的なコンピュータは現在の電卓程度の演算能力しかなかったため、機械に近いアセンブリ言語を使用したプログラミングスタイルが普通だったのでしょう。sのようなスタイルは、あくまでコンピュータの演算を単純にキーワード(命令語)に置き換えた程度であり、人間が普段用いる言語とはひと味違ったものになります。一方、今日のような高級言語を用いたプログラミングのスタイルはプログラムを効率的に開発できるようになっています。高級言語としていくつかの言語が登場したことにより、人にとってストレスの少ないプログラミング言語を一度アセンブリ言語に変換した後、アセンブリ言語から機械語翻訳しています。

プログラミング言語はたくさんの種類が存在しています。例えば機械学習や人工知能の分野においてはPython、スマートホンではJavaやSwift 、ホームページはHTML、CSS、PHP、Perlなどがあります。本稿ではC++言語に焦点をあてます。C++言語は工学部の情報系の学科の人やソフトウェア開発の人の間では有名かと思いますが、一般の人たちはほとんど知られていない言語かと思います。そもそも、C++言語は上級者向けの難しい言語である先入観があり、初学者に敬遠されているように感じます。確かにとても難しい言語であることは事実で、中途半端な気持ちで勉強すれば必ず挫折し習得をあきらめることが多いように思います。しかし、きちんと順番に勉強していけば習得できない訳でもなく、また理解できたときの達成感は人一倍あるように思います。

△目次に戻る

プログラミング言語としてのC++言語

C++言語はいったいどういう言語かという質問に対しては、プログラミングの世界の標準言語だと私は思っています。すなわち、実世界では英語のような存在で、何にでもつぶしがきく素晴らしい汎用言語だと思います。C++言語はC言語とSimla言語を両親にもつ、オブジェクト指向としても使うことができる汎用言語です。クラスを使用したオブジェクト指向の概念を用いることで、数百万行にのぼる莫大なプログラムコードも管理することが可能になります。マイコンから流通している商用ソフトウェア、基本ソフト(OS)、スーパーコンピュータ、大規模なシステムなどのほとんどがC++言語で書かれています。繰り返しになりますがプログラミングの世界では実世界で言う英語と同じ位置づけにあると考えているので、他言語を勉強するよりも良いと主張したいです。

一般にC++言語を勉強する前にC言語を勉強するべきだという議論がありますが、私はあえてC言語の勉強をする必要はないと考えています。それは私自身C++言語からはじめた人間であり、C++言語の開発者であるBjame Stroustrup氏も、いきなりC++言語からはじめるべきだと、自身の著書で述べています。ただし現実的には、簡単なC言語の本からやり始める方が良いかと思います。

△目次に戻る

Hello world

入出力の基本としてコマンドプロンプトの画面上に出力しキーボードから値を入力することで、C++言語ではストリームという概念を使用して実現します。一般にプログラミング言語の中で使用する命令語を予約語と呼び、この場合は(cout)を画面だとイメージしてリダイレクト(<<)を使用して画面に文字列を出力します。いわゆるHello worldは次の通りです。

#include <iostream>
using namespace std;

int main()
{
  // コメント(この行はプログラムに影響を与えません)
  cout << "Hello World" << endl;
  return ( 0 );
}

コマンドプロンプトを基本とするプログラムはメイン関数を必ず1つ含んでおり、メイン関数内へ記述された処理が随時実行されます。関数はブロックと呼ばれる中括弧({ })で囲まれた部分を1つのまとまりとして取り扱われます。プログラムのソースコードは人が読むことを前提としているため、ブロック単位でインデントを行うことで可読性を良くさせます。プログラム冒頭において、#include命令によってヘッダファイルを設定することで、ソースコード内で使用する関数や機能を提供するライブラリファイルを指定します。関数に依存して適切なヘッダファイルをインクルードする必要があり、初心者向けの解説書にはおまじないという言葉で詳細が割愛されることが多いです。なお、ヘッダファイルのインクルード方法として、(< >)と(" ")の2種類の記述法があり、前者はコンパイラ等がすでに準備しているヘッダファイルを使用する場合で、後者はユーザが独自のヘッダファイルを定義したうえで同フォルダ内に指定するヘッダファイルが存在する場合に使われます。

C++言語ではネームスペースの概念があるため、同じ名前を使用してもネームスペースが異なれば区別して使用することができます。例えば、私の作成した特別な仕様がありそのネームスペースをMYに設定すると、MY内で変数Aを定義すれば変数AはMY::Aとなります。このとき、別の人が変数Aをすでに定義したとしても、MY::AとYOU::Aのようにネームスペースを導入することで両者を識別できるようになります。ネームスペースを導入することで、C言語におけるグローバルネーム空間の汚染を回避することができます。

改めてHello worldのプログラムコードを見直します。ヘッダファイルはソースコードの先頭に記述することにより、様々な機能を使えるようにする特別なファイルになります。#include <iostream.h>でインクルードした場合、関数cout()はグローバル空間の関数となりますが、#include <iostream>でインクルードした場合(C++言語風の記法)はネームスペースstd空間の関数となります。そのため、後者の場合、std::cout()と指定する必要があります。一方、ネームスペースの導入でグローバルネーム空間の汚染を解決することができても、小規模プログラムを作成する場合はタイプ量が増加してしまいます。そこで、using namespace std;と一言添えることで、std::を省略することが可能となります。

入出力と変数


変更履歴

  • 2021/10/25 Hello worldを追記しました。
  • 2021/10/20 Hello worldを追記しました。
  • 2021/10/18 過去のウェブコンテンツを復活させ最新情報に修正しました。
△目次に戻る