情報処理 II − 第1回


1.講義内容について


この授業ではプログラミングについて学習します。

情報処理 I のような内容を期待していた人には、 ひたすらおもしろくない授業になると思います。 みなさんのうちの多くが、 こういうことをしたいと思ってここに入ってきたのではないということを、 知らないわけではありません。 しかし、進路のことを考えると、 プログラミングの能力はやはり強い武器になると思うのです。 どうか投げ出さないで付き合ってください。


2.プログラムとは


コンピュータのプログラムとは、 コンピュータが行う仕事の手順を示した手順書のようなものです。 仕事の手順は人間が考えるわけですから、 プログラミングは、 それを手順書として具体化する作業にほかなりません。

ところが、コンピュータは人間の言葉を理解できないので、 この手順書はコンピュータの言葉(機械語) で書く必要があります。 とは言っても、 機械の言葉はみなさん良くご存じの通り「0/1の二進数」なので、 人間が直接機械語でプログラムを書くのは、 それはそれは大変な作業になります。

そこで、 普通はより人間の言葉に近い文法の言語を使って手順書を書き、 それを機械語に翻訳してコンピュータに与えるという手段を用います。 この翻訳の仕方には逐次式(インタプリタ)と 一括式(コンパイラ)という二つの方法があります。 一般にコンパイラ方式の方が、 作成したプログラムを実行するときの性能が良いと考えられています。

このような目的で人間が設計した言語を プログラミング言語と言います。 これには目的に応じて様々なものが開発されていますが、 C 言語およびそれを拡張した C++ 言語は、 汎用性があり性能も良いため、 現在のソフトウェア開発用の言語として、 最もポピュラーなものの一つです。

この講義では、 思考を具体化する際の「文法」として、 C++ 言語を用います。

実は C++ 言語は、 はじめてプログラミング言語を学ぶ人にはあまり適さない言語だと言われます。 私もそう思います。 この言語は、そのもとになった C 言語に、大規模なプログラムの開発を行う時に使われるいくつかのテクニックを、 言語仕様としてフィードバックしたものだと考えられます。 このため C++ 言語の C++ 言語たる部分は、 やはり大規模なプログラムでないとなかなか見えてこないように思われ、 講義で使用する簡単なサンプルプログラム程度では、 なかなかその本質に迫ることができません。

しかし、現在ではみなさんが使っている O2 に限らず、 Windows や Macintosh 等でも C++ によるソフトウェア開発が中心になってきています (Windows だと Visual BASIC という気もしますが、 O2 では使えませんから)。 また OpenInventor などのグラフィックライブラリは C++ をベースに設計されていますから、 避けて通るわけにはいかないとも思うのです。 ということで、この講義では C++ 言語の文法を網羅するようなことはしません。 それは必要になったときに自分で勉強してください。 また C++ は文法がたびたび変更されています。 この授業で使用している C++ コンパイラは最近の文法には対応していないので、 最新の情報を得るためにも常に自分で勉強しておく必要があります。


3.プログラムを組むということ


プログラミングは、本当はとってもおもしろい創作行為です。 ただ、そこに至る前にクリアしなければならないいくつかのハードルがあって、 その一番おもしろいところが最初は見えないために、 「どうもピンと来ない、わけがわかんない」という印象を持ってしまうのです。 この最初のハードルは、 みなさんがまだ自分の思考を整理して別の形で再構成するという行為に慣れていない、 というところにあります。

「思考を具体化する」という点で、 プログラミングは絵を描いたり彫刻したりすることに非常に似た作業です。 ところが、絵筆やノミによって具体化された「作品」は、 視覚を通じて直ちに思考にフィードバックできるのに、 プログラムは一通り完成させてしまわないと、 その姿を見ることができません。 プログラムは途中経過を見ながら完成させることが難しいのです。 ここに第2のハードルがあります。

この後にも第3・第4…とハードルは続きますが、 そのうちこのハードルを越えること自体におもしろさを感じるようになります。 だから、とりあえずはじめてみましょう。


4.プログラム作成の手順


プログラム作成の基本的な手順は、次のようになります。

  1. テキストエディタを使って、 人間が理解できる形式のプログラム (ソースプログラム)を作成します。 これをファイルとして保存します (ソースファイル)。

  2. コンパイラを使って、 ソースファイルをコンピュータが理解できる形式のプログラム (オブジェクトプログラム)に変換し、 これをファイルとして保存します (オブジェクトファイル)。 この作業をコンパイルと呼びます。

  3. リンカを使って、 オブジェクトプログラムに 他のオブジェクトプログラムやライブラリファイル (最初から用意されているオブジェクトプログラムを集めたもの) の中のオブジェクトプログラムを結合し、 コンピュータによって実行できる形式のプログラム (実行プログラム)を作成します。 これをファイルとして保存します (実行ファイル)。 この作業をリンクと呼びます。

この処理の流れを図で表すと、こんな感じになります。

なお、CC コマンド(後で解説します)を使用した場合、 リンクはコンパイルに引き続いて自動的に実行されます。


5.ソースプログラムの作成


プログラムの作成に入る前に、 この講義用のディレクトリを一つ作っておきましょう。 ディレクトリ名は何でも構いませんが、 日本語は使わないでください。 下の例では shori2 とします。 ディレクトリがなんなのかよく分からない人は、 情報処理 I の第5回の ディレクトリのところを復習してください。

% mkdir shori2[Enter]

カレントディレクトリをそこに移します。

% cd shori2[Enter]

テキストエディタを使って、ソースプログラムを作成します。 ここではファイル名を hello.cc としてください。 C++ 言語のソースファイルのファイル名の末尾には ".cc" あるいは ".cpp"、".c++"、".cxx" を付けることになっています。

% mule hello.cc[Enter]

次のプログラムをタイプしてください。 このプログラムは「何もしない」プログラムです。

main() {
}

全部タイプできたらファイルを保存し、mule を終了してください。

これで hello.cc というファイルが作られます。 実際にファイルが作成されているかどうか、 ls コマンドを使って確認してください。

% ls[Enter]
... hello.cc ...

6.ソースプログラムのコンパイル


CC(大文字)コマンドによって、hello.cc をコンパイルします。

% CC hello.cc[Enter]
(エラーがなければ、何も表示されない)

これで a.out というファイルが作成されます。 これが実行ファイルです。

% ls[Enter]
... a.out ... hello.cc ...

ここで、もしソースプログラム中に エラー が見つかると、a.out は作成されません。 その場合はソースプログラム hello.cc をもう一度良く見直して、 もう一度コンパイルしてください。

なお、ここではコンパイルに引き続いて自動的にリンクが行われるため、 オブジェクトファイルは作成されません。


7.プログラムの実行


作成された a.out を実行してみましょう。

% a.out[Enter]
(何もしないプログラムなので、何も表示されない)

このように、作成されたプログラム (a.out) は、 ls などと同様 UNIX のコマンドとして利用可能なものになります。 a.out というファイル名が嫌なら、 mv でファイル名を変更しても構いません。

% mv a.out hello[Enter]
% hello

あるいは CC コマンドに -o オプションを付けて、 直接その名前の実行ファイルを作成できます。

% CC -o hello hello.cc[Enter]
% hello

8.ソースプログラムの修正


再度 mule を使って、hello.cc を編集します。

% mule hello.cc[Enter]

{ と } の間にプログラムを書きましょう。

#include <iostream.h>

main() {
  cout << "Hello!\n";
}

cout出力ストリームと呼ばれ、 標準出力(画面)にデータを出力する オブジェクト を示しています。 << は出力ストリームにデータを送る 挿入演算子です。 このオブジェクトに << "hello!\n" というメッセージを送ると、 それがコマンドの出力として画面に表示されます。 これがこのプログラムの仕事です。

#include <iostream.h>cout を使うためのおまじないです。

C++ 言語では、 プログラムの単位(と呼びます)ごとに、 区切り記号として ";"(セミコロン)を置きます。 また追加する部分が 字下げ されていることに注意してください。

タイプできたら先ほどと同様にファイルを保存し、 mule を終了してください。

% ls[Enter]
... a.out ... hello.cc hello.cc~ ...
(hello.cc~ は修正前の内容のバックアップ)

このファイルをもう一度コンパイルします。

% CC hello.cc[Enter]
(エラーがなければ、何も表示されない)

正常にコンパイルできれば、a.out を実行してください。

% a.out[Enter]
Hello! (←これがコマンドの出力)
%

では次に、このプログラムを "Hello! How are you?" と出力するように変更してみましょう。 hello.cc を次のように変更してください。 ソースプログラムの修正とコンパイルを繰り返すときは、 mule をバックグラウンドで起動すると便利です。

#include <iostream.h>

main() {
  cout << "Hello!\n";
  cout << "How ";
  cout << "are ";
  cout << "you?";
  cout << endl;
}

このプログラムをコンパイルして実行してみてください。 どのように表示されたでしょうか。

プログラムは最初(上)の方から順番に実行されます。 こういう風に やりたいことをやりたい順に並べて仕事の全体を記述したもの手続きと呼びます。

なお、上のプログラムは次のように書くこともできます。

#include <iostream.h>

main() {
  cout << "Hello!\n" << "How " << "are " << "you?" << endl;
}

間にある空白や改行は無視されるので、下のプログラムは上のプログラムと同じです。

#include <iostream.h>

main() {
  cout << "Hello!\n"
       << "How "
       << "are "
       << "you?"
       << endl;
}

でも、まあ普通?は次のように書くんじゃないでしょうか。

#include <iostream.h>

main() {
  cout << "Hello!" << endl;
  cout << "How are you?" << endl;
}

'\n' というのも一つの文字で、 これは出力装置を改行する機能を持ちます。 このような文字は制御文字と呼ばれます。 endl は行末 (end of line) を意味します。 見た目の動作は '\n' と同じです。


課題1


実行すると次のような出力を行うプログラムを作ってください。 ソースプログラムのファイル名は kadai1.cc とし、 それをtokoiまで メールで送ってください。Subject:(件名)は kadai1 としてください。 なお、"Kentaro Wakayama" は自分の名前にしてください。

Wakayama University,
Faculty of Systems Engineering,
Kentaro Wakayama.

なお、Netscape からメールを送る場合は、 今一度設定の確認を行ってください。 Netscape でメールにソースプログラムを添付するには、 メールの宛先を書くところの下にある ゼムクリップの絵が書かれたタブをクリックし、 そこに shori2 のフォルダの中にあるソースプログラムのアイコンを重ねてください (mule の場合は C-x i でファイルを読み込むとか、 いろんな方法があります)。