osdev-jpでは、OS開発に有用な情報を収集し公開しています
本書はプログラミングに入門する人のためのものです.C++の最新規格であるC++17を用いてプログラミング入門をします.
この節は読み飛ばして大丈夫です.C++を入門言語として選んだ理由が気になる人はお読みください.
C++はとても大きな規格を持つ複雑な言語です.なぜそんな言語を「プログラミング入門言語」として採用しようと思ったのか.それは,C++は進化するにしたがって複雑度は増しているのは事実ですが,機能を絞って説明すれば入門用言語としての教えやすさも伸びていると筆者が考えているからです.
C++の言語仕様が複雑になっているのは,C++が「オーバーヘッドを可能な限り小さくする」ことを目指しているからです.その目標と,実用的なプログラミングができるように言語機能やライブラリを充実させるという目標を両方追求するために,どうしても言語仕様が肥大化するのです.言い換えれば,C++は非常に効率的に動作するプログラムを簡単に書けることを目指した意欲的な言語なのです.そんな意欲的な言語,学んでみたいと思いませんか?
C++のすべての機能を把握するのは非常に大変ですから,本書では入門者が覚えておくべき項目に絞ってC++を説明します.
プログラミング入門といえば,最初は「画面にメッセージを出す」プログラムを作ります.「Hello, world!」と画面に出すので,ハローワールドプログラムなどと呼ばれます.ごく基本的なプログラムですが,これを作ることで,開発環境が正しくセットアップされていること,作成したプログラムがきちんと起動することを確かめることができます.
次の通りエディタに入力し,適当な場所に適当なファイル名で保存してください.ここでは$HOME/workspace/hello.cppという名前で保存したとします.
リスト1.1 はじめてのC++プログラム
#include <iostream>
int main() {
std::cout << "Hello, world!" << std::endl;
return 0;
}
このファイルをコンパイルして実行ファイルを生成します.
$ cd $HOME/workspace
$ clang++ -std=c++17 -Wall -o hello hello.cpp
何もエラーがでなければ成功です.成功するとhelloという実行ファイルが生成されます.実行してみましょう.
$ ./hello
Hello, world!
画面に「Hello, world!」と出れば成功です.
…画面と書きましたが,標準出力(Standard Output)と言う方が正確です.なぜなら,リダイレクトというシェルの機能を使うことで画面ではなくファイルに出力させることができるからです.
$ ./hello > h.txt
$ cat h.txt
Hello, world!
1行目で> h.txt
としている部分がリダイレクトです.標準出力を,画面ではなくh.txtという名前のファイルに向けるという意味になります.この知識はC++というよりはシェルの使い方の知識なのですが,プログラミングによって作ったツールの応用範囲を広げるためにシェルにも慣れると良いでしょう.
ハローワールドプログラムの6行のソースコードに説明を加えます.初めてのプログラムですので一字一句に対してしっかり説明します.ちょっと長くなりますが,頑張って付いてきてください.
#include
はコンパイラに対する命令で,iostreamというファイルをこの部分に読み込みなさい(インクルードしなさい)という意味です.iostreamというファイルの在り処はコンパイラが知っていて,そのファイルの内容がここに展開されます.std::cout
やstd::endl
を使うためにiostreamファイルのインクルードが必要なのです.main
という名前の関数を定義します.関数とは処理のまとまりに名前を付けたものです*1.ブレース{}
で囲んで「処理のまとまり」を表します.ここでは4,5行目をまとめていますね.また,関数は処理の結果を返すことがあります.関数名の前に書いてあるint
はInteger(整数)の意味で,この関数は何らかの整数を結果として返しますよ,という意味になります.std::cout
が標準出力を表します.<<
で値を並べると,それが標準出力に出力されます.最後に書いてあるstd::endl
は「改行」を表します.main
関数が0を返すとプログラムが成功,0以外を返すと失敗,という意味になります.これは,シェルで./hoge && echo "ok"
などと,論理演算子(&&
や||
)で結合したときに意味が出てきます.hogeプログラムが成功(return 0
)すればokと表示され,失敗なら何も表示されません.}
が関数定義の終わりを示します.細かく説明してしまいました.要点をまとめると,メッセージの出力はstd::cout
ででき,メッセージ出力処理に対してmainという名前を付けている,ということです.
C++プログラムはmain関数から処理が開始されることになっています.ハローワールドプログラムを起動させるとメッセージが表示されたのはそのためです.どこにもmainを実行せよというような記載はありませんが,コンパイラが自動的にそうなるようにしています.
出力されるメッセージを改造してみましょう.複数行の表示にも挑戦してみてください.
*1: 関数は元々は数学用語だが,数学とC++の関数は表すものがかなり異なる.