プログラムに関するテキストによくファイルという用語をみかける。ファイルとは、一般にはデータの集合やプログラムをある規則によって蓄積されたものと解釈してよい。このようなデータの集まりやプログラムなどは、外部記憶(フロッピーディスクやハードディスク)に保存され、計算機の電源を切っても残っている。ファイルという用語は、データファイル、プログラムファイルなどのように、さまざまな場面で使われ、プログラムそのもの,データの集まり,さらにはフロッピーディスクをさすこともあるので気を付けて欲しい。
Step1 | xに数値を与える。 | |
Step2 | nとsの値をそれぞれ0にする。 | |
Step3 | nの値に1加える。 | |
Step4 | (x^n)/(n!)を求めsを加える。 | |
Step5 | Step3へ行く。 | |
Step6 | sの値を出力する。 | |
Step7 | おわり。 |
例2−2では、Step3,4,5 をループして永久に終らない手順である。そこで入力データの条件を満たすようなすべての数値を与えても、有限回のステップを実行後に終了するような条件を手順に加える。これをアルゴリズム(algorithm)といい、手順が正しければ有限時間で答が得られ停止するという保証がある。例2−2をアルゴリズムにするには、Step5 を
Step5 もしnが10以下ならば Step3 へ行く。
に変更すれば、nが11になったときには必ずStep6へ行くため、停止することが保証される。
計算機では工夫しだいでさまざまな種類のデータを扱うことができる。データがどのような構成要素で構成され、何を表現しているのかを明確にしておく必要がある。例えば、従業員に関するデータを扱うことを考えた場合、氏名,年齢,住所,従業員番号などの構成要素から従業員個人のデータが構成されている。平面座標上の点を考えた時、x座標とy座標が組になって1点の座標を表現している。このように扱うデータは異なった目的の異なった構成要素の組から成っており、それぞれの用途にあった構成をしている。この構成がまさに「データ構造」である。
また、データが何を表現しているかという意味付けをすることが大切である。2つの整数の組が1つのデータと考えた時、それが平面上の整数座標を表現しているのか、それとも複素数を表現しているのか、もしくは全く別のものを表現しているのか分からない。このように単に2つの整数の組のデータであっても、何を表現しているのか明確にされていないと全く別の種類のデータとして、扱ってしまうことになる。このようにデータが何を表現しているのかという意味付けが「データタイプ」である。データタイプは、別の側面も持っている。計算機内部では、データは1章で述べたように2進数で表現されている。そのためプログラムもしくはユーザが、どんな種類のデータを扱うかを決めなけらばならない。例えば、5は整数型(int type),aは文字型(char type)のように扱うデータのタイプを決めなければならない。
実際の問題をプログラミングするためには、問題に合致した状態をプログラムの中で模倣しなければならない。そのために適したプログラム言語を決め、そこで利用できるデータ構造をよく理解しその上でデータ構造を決め、どんなタイプのものを使うかも決める必要がある。例えば、地下鉄の路線図と運賃に関するプログラムを作成するとき、計算機の内部で路線図を表現することを考えると、データ構造,データタイプの選び方により様々な構造が考えられる。実際の現象とプログラムとのギャップを埋めることができるのが、このデータ構造であり、プログラムの良し悪しの原因となる。実際のプログラミング例を用いた例は後章で紹介する。
信頼できるプログラム作成法の1つに、構造化プログラミングと言われる手法がある。これを用いて作成したプログラムは、一般的には誤りが少なく誤りの修正や機能の変更・拡張が容易でプログラム作成に費やす時間と労力が節約できるといわれ、多くのプログラム開発に用いられている。構造化プログラミングの具体的な手段として、次のようなことが考えられる。
- 2.1節の手順に従ってソースプログラムを書く。
- コンパイラと呼ばれるプログラムによってソースプログラムの文法チェックを行い、エラーがなければ計算機の理解できる言葉に翻訳する。コンパイラで生成されたプログラムをオブジェクトモジュール(オブジェクトプログラム)と呼ぶ。もしここでエラーが検出されると、コンパイラはエラーのリストを出力し、エラーの場所と症状を知らせてくれる。エラーがなくならないと、次の処理に進むことができない。
- リンケージエディタと呼ばれるプログラムによって、2で生成されたオブジェクトモジュールとすでに用意されているオブジェクトモジュールを結合し、一つの実行型プログラム(ロードモジュールまたはロードプログラム)をつくる。すでに用意されたモジュールとは、よく利用される関数などをライブラリとして集めたものである。ライブラリについては後で詳しく解説する。
- ローダと呼ばれるプログラムにより、ロードプログラムをメインメモリ上にロード(コピー)する。
- ここで、はじめて1で作ったプログラムが実行される。
1つは、コンパイル時に発見され、文法に合わない記述やプログラムのタイプミスなどにより発生する虫である。初心者のプログラマによく住みつく虫で、ある程度プログラミングに慣れて来るとこの虫はすぐに退治できるようになる。
2つめの虫は、リンク時もしくは実行時に発見される虫で、本来はタイプミスであってもプログラムは文法的には全くただしく、運よくか運悪くかコンパイル時に見つけられず、この時点になって異常な動きをして発見される。また、プログラマの考え違いにより発生することもあるため、アルゴリズムの設計等に戻って考え直す必要がある。
3つめの虫は、最も面倒で見つけるのが大変な虫で、プログラムの実行結果が得られているにもかかわらず、意図した結果が得られない時に、潜んでいる虫である。上記2種類の虫は、計算機を通して何等かのエラーメッセージで我々に知らされるのに対して、この種の虫については全く知らされない。そのため、プログラマはアルゴリズムの考え方や入力データなどこと細かににチェックする必要がある。
2,3の虫を発見するこつは、虫の潜む場所をいち早く特定することである。そのために実行の途中結果を逐次出力するなどして、プログラムを多少細工する必要がある。これについては、後に実際例を用いて解説する。
”プログラムは一日にしてならず”ですね。