Chapter 1 C++の概要

C++とはどのような言語なのでしょうか?

1.1 C++の特徴

1.1.1 コンパイル言語

CやC++はコンパイル言語と呼ばれます。一方、RやPythonなどの言語はスクリプト言語と呼ばれています。その違いを述べる前に、簡単にプログラミング言語とは何なのかを説明すると、コンピューターは、ユーザーが作成したソースコードをそのまま実行することはできません。実行するにはソースコードをコンピューターが実行可能な機械語に変換する必要があります。人間が直接書くのが困難な機械語を、人間に理解しやすい構文で書けるように設計された言語がプログラミング言語です。

スクリプト言語はソースコードを1文ごとにインタープリター(RやPythonの本体)が機械語に変換しながら実行します。RやPythonのコンソールからコードを入力してリターンを押すたびに実行されるので、ユーザーからはソースコードが直接実行されているように見えます。スクリプト言語はユーザーがコードを書くのを簡単にすること実行するまでの手間を簡単にすることを目的に設計されています。なので比較的お手軽に使える利点があります。しかし、実行速度の観点からはコンパイル言語には劣ります。それは、実行時に1文ずつ機械語に変換されるので、変換するための時間もかかりますし、機械語に変換するときの最適化も1文単位でしか行うという限界があるためです。

コンパイル言語はあらかじめソースコードの全体をコンパイラーにより機械語に変換して実行ファイルを作成します。そして実行したいときに、その実行ファイルを実行します。実行ファイルはアプリケーションの本体なのでRやPythonのインタープリタも実行ファイルです。コンパイル言語は実行する前にコンパイルしておかないといけないですし、ソースコードを変更するたびにこのパイルしなおす必要があるので、トライアンドエラーを行うのに手間がかかります。しかし、ソースコード全体をまとめて機械語に変換するため機械語に変換時の最適化はスクリプト言語よりも優れており実行速度に勝ります。ただ、コンパイルにも時間がかかるので、一度コンパイルしたコードを何度も使うような場面には向いていますが、一度しか実行しないような使い捨て作業には向いていません。

(ちなみに使ったことはないですがClingというC++のインタープリターもあるみたいです。)

1.1.2 静的型付け言語

1.1.3 C言語の機能を包含している

C++はC言語の機能を(ほぼ)包含しているので、Cの構文で記述されたプログラムはC++としても動きます。Cの標準ライブラリもC++の標準ライブラリの中に含まれているので基本的にはそのまま利用できます。ただCの標準ライブラリをC++の流儀で使えるように多少変更も加えられています。例えば、Cの stdio.h をC++で利用する場合には cstdio をインクルードします(同様に math.hcmath)。stdio.h も使えるのですが、C++では cstdio を利用することが推奨されています。その理由は、標準ライブラリにある関数の名前が、ユーザーが定義した関数や他のライブラリの関数の名前と衝突するのを避けるために cstdio では全ての関数が std 名前空間の中で定義されているためです。なので cstdio の中で定義されている printf() を利用したい場合にはC++では std::printf() と指定します。

たまにC++を使うにはまずCを覚えた方が良いのかという話を聞きますが、Cを覚える必要はありません。むしろ、C++の方がシンプルで高機能に記述できるケースが多いと感じています。それを知らずC言語の流儀で書いてしまうクセを回避するために、初めからC++を学ぶことをオススメします。

1.2 C++の基本的な構成要素

C++言語の基本的な構成要素は「関数」「変数(オブジェクト)」「制御文」だと思います。それぞれの基本を以下では説明します。

1.2.1 関数

ミニマムなC++のソースコードは下のようになります。

int main()
{
}

このコードをコンパイルして実行しても、何も起きないですがC++としては有効なコードとなっています。このコードは具体的には main という名前の関数を定義しています。その意味でC++の最小の構成要素は関数であるといっても良いのかもしれません。

(蛇足)C/C++界では main 関数は特別な関数で、全てのアプリケーションは main 関数を必ず1つ持っています。ユーザーがアプリケーションを実行するときには、CUIからコマンドを入力してリターンキーを押したり、GUIからアイコンをダブルクリックすることで、OSがアプリケーション本体の実行ファイルを起動します。実行ファイルが起動されると main 関数が呼び出され、main関数の実行が終了するということはそのアプリケーションの実行が終了するということを意味します。

(蛇足)とはいえ、Rcppを使ってコードを書く際には、main関数を作成することはありません。なぜならmain関数はR側が持っているためです。Rcppの関数はRのmain関数から呼び出されるだけなのでmain関数が必要ないのです。順番としては、ユーザーがRを起動する → Rのmain関数が呼び出される → R内でのユーザーの入力に応じてRのその他の関数やRcppの関数が呼び出される → ユーザーがRを終了を指示する → Rのmain関数の実行が終了する、という感じです。

蛇足が長くなりましたが、C++ での関数定義に話を戻します。関数には入力と出力があるものですが、C++では次のように書きます。例えば、整数スカラー(int)の変数 x を入力として、その値を2倍にして返す関数 timesTwo を定義するコードの例は以下のようになります。

int timesTwo(int x){
  return 2 * x;
}
  • 1行目 int timesTwotimesTwo 関数の返り値の型が int であることを示します。
  • 1行目 (int x):この関数の入力(引数)x の型が int であることを示します。
  • 2行目 return 2 * x;x を2倍した値を返しています。C++では main ではない普通の関数では return 文は必須です。また、全ての文の末尾にセミコロン ; が必須です。

1.2.2 変数(オブジェクト)

変数は値を保持します。Rとは異なりC++では変数の型は、その変数を作成する(C++では変数を宣言すると言います)ときに必ず決める必要があります。また変数の作成後には型を変えることはできません(静的型付言語)。

int x; // int 型の変数 x を宣言します
x = 1; // 変数 x に値を代入します

1.2.3 制御文

プログラミング言語の制御文には「条件分岐」と「繰り返し処理」があります。

条件分岐

C++ の条件分岐には次の2つの方法があります。

  • if文
  • switch 文

繰り返し処理

C++ の繰り返し処理には次の2つの方法があります。

  • for 文
  • while文
  • do while 文

このドキュメントでは for 文のみ説明します。

1.2.4 標準ライブラリ

関数・変数・制御文はプログラミングのコアな要素ですが、実用的なプログラムを作成するには、例えばテキストを画面に表示したり、ファイルを読み書きしたり、ユーザーからの入力を受け付けたり、数学的な計算を行ったりと様々な機能が必要になります。そのためにC++ではそのような機能を標準ライブラリとして提供しています。ライブラリとは特定の機能を提供するモジュールです。標準ライブラリはRで例えるならデフォルトでRと一緒にインストールされるパッケージ(statパッケージなど)のようなものです。

標準ライブラリについては以下のサイトなどを参考にしてください。

C++日本語リファレンス

C++は産業や学術などの分野でのメジャーなプログラミング言語となっているので標準ライブラリの他にも、準標準ライブラリの位置づけにある boost ライブラリを始め、フリーや商用の様々なライブラリが多数存在しています。