初心者向けプログラム開発アドバイス
2000.09
計算機初心者がプログラムを作って動かすまで、そしてさらに大規模プログラムの開発を
目指すまでについて概説してみます。
計算機は賢くない
計算機は決して賢くありません。点一つでも間違ったら、エラーがぼろぼろ出ます。コ
ンパイル(ccすること)してエラーが出たら、目を皿のようにしてチェックしよう。
よくある誤り: ; (セミコロン)が必要なところにない。または、セミコロンと間違
えて: (コロン)を入れてしまう。
プログラムの行番号
コンパイル時に出るメッセージの数字は、プログラムの行番号(何行目か)を意味して
います。短いプログラムなら上から行数を数えればいいでしょう。長い場合は、
cat -n プログラム名 とすると、行番号付きで表示してくれます。少しgrepの使い方を知っ
ていれば、cat -n プログラム名 | grep 行番号 とすれば、くだんの行だけ表示できること
がわかるでしょう。
行番号への高級なアプローチ
もうちょっと行番号への高級なアプローチは、viを使うことです。viはシステム管理には
必須と古くから言われています。使い方はやや難しく、初心者には取っ付きにくいですが、
マスターする価値はあります。詳細はここでは述べません。viの中で、set numberとすると
行番号付きで表示されます。: 行番号 とするとその行へポインタが移ります。なお、set
numberを使った行番号表示がなくとも、: 行番号 で該当行にポインタは移ります。
書き方スタイル確立の勧め
自分の書くプログラムの書き方スタイルを確立しましょう。かなり無茶な書き方のプログ
ラムも文法的に正しければ受け付けてはくれますが、読みにくいプログラムは自分の損です。
特に各行の字下げは首尾一貫したスタイルを確立しましょう(ちゃんとした教科書なら適切
なアドバイスがあります)。for文やif文のカッコについてはmule等のエディタはちゃんと分
っています。各行を打ち込んだらtabキーを押すと、一貫した位置に整えてくれます。もし、
カッコの数が合わないときは、奇妙な字下げが発生するのですぐ間違いが分ります。
プログラムの動作確認
コンパイルエラーが出なくなったらプログラムは完成でしょうか(歓声を上げますか?)。
まだまだ、勝負はそれからです。コンパイラ(ccを扱うプログラム)は文法上の間違いはチ
ェックできますが、あなたの作ったプログラムが正しく意図した通り動いてくれれているの
かは、何の保証もしません。チェックするのはあなた自身です。一般のプログラムではプロ
グラムの動作確認を必ずします。プログラムの考え方(アルゴリズム)が間違っていること
はありがちなことです。
プログラムの作り直し
チェックの結果、意図通りの結果が得られない場合、プログラムをよく調べて作り直しま
す。そして、またコンパイルします。また、コンパイルエラーが出なくなるまで、修正し、
実行結果を見ます。 …ということを、望みの結果が出るまでくり返すのです。
結果をファイルに残すには
結果をファイルとして残すと何かと便利ですね。その方法は:
コマンドの入れられる状態(コマンド行)で、script と入れます。そうすると、以後、画面
に出る文字は同時にtypescriptというファイルに蓄えられていきます。ただし、typescriptは、
用がなくなってscriptを終わらせた後(exitでscript終了)読み書きできるようになります。
プログラムや処理結果をメールで送ろう
プログラムができたとき、あるいは途中で、プログラムや処理結果をメールで送りたいこ
とがよくあります。そんなとき、UNIXユーザなら、/usr/ucb/mail のファイル取り込み
機能を使いましょう。~rサブコマンドを使い、 ~r ファイル名 とすれば一発です。詳細は
別項に譲ります。
実行時間を知るには
計算手順(アルゴリズム)のよしあしで、計算機の実行時間はずいぶん変わります。実行
時間をtime 通常の実行時のパラメータ 例 time a.out
これで、実行時間が表示されます。その意味はman timeでどうぞ。アルゴリズムを改良して、
より高速に動くプログラムを作ろう。
大規模プログラムの改良をするには
コンパイル時に-pというオプションを入れます(例 cc -p prog.c)。そうすると実行した
とき、mon.outというファイルができます。実行後、prof 実行プログラム名 とすると、ど
の部分でどの位時間が掛かったかを表示してくれます。詳細はman profでどうぞ。
大規模プログラム開発への道 分割コンパイル
教科書的なもので演習問題ばかりやっているだけでは大規模プログラム開発はできません。
まず、必要なのは分割コンパイルです。これは、システムをいくつかの部分に分けて作り、
動作確認なども部分的に行い、それらの組み合わせとしてシステム全体を動かすことです。
普通演習問題では、1回だけコンパイルしておしまいですが、何回にも分けて行います。
その手順を書くのにmakeというコマンドが使われます。makeはMakefileにある手順に従っ
て定められたことを行うものですが、詳細は別項に譲ります。
大規模プログラム開発への道(その2)デバッガ使用の勧め
少し複雑なプログラムを作る場合、予期せざる誤りを取除く操作(デバッグ)を完成する
まで何度も繰返すことになります。文法上の誤りはcコンパイラが指摘してくれますが、文
法上は正しくても思わぬ思い違いなどから求める結果が得られないことがよくあります。
このようなとき、途中の経過(どの段階で変数の値がいくらになっているかなど)をプリ
ントさせてみたりすると(また、もし可能ならプログラムの実行を途中で止めてみる)プ
ログラムの働きを確認でき早くデバッグできます。そのためにプログラムに本来は必要な
いprintf文(時として入力文も)などを挿入することも行われます。これも役立ちますが、
もっと便利なやり方があります。それがデバッガです。
大規模プログラム開発への道(その3)includeファイル
大規模システムに不可欠なのはincludeファイルです。includeファイルはコンパイル時に、
プログラムの中にinclude ○○ と書いておくと、そのファイルを読み出して、あたかも、
そのプログラムに読み出した部分が存在しているようにコンパイルするものです。各プロ
グラムに共通的なデータは1箇所にまとめると手間が少なくなり、間違いも減ります。そ
れを行うのにincludeファイルを使うことができます。
大規模プログラム開発への道(その4)構造体
教科書にポインタや構造体のことが書いてありますが、難しく感じるかも知れません。
ポインタや構造体は少し複雑なプログラムや大規模なプログラムを書くときにはがぜん威
力を発揮します。それなしには複雑怪奇になりかねないプログラムが美しくすっきりと書
け、間違いも少なくなるのです。大規模プログラム開発には必須と心得てください。
その他モジュールの履歴管理ツールなどがあります。