ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
Hello, ANOTHER world!

大きなプログラム

プログラムのサイズが大きくなってきたら、いくつかの部分に分割しますね。 でもそれはどうして?
もし分割しないで大きなプログラムを作ったら、きっとたくさん間違いますね。でもそれはどうしてなんでしょう?
それは、我々が人間だからです。人間たるもの、必ず間違いを犯すのです。そして間違える可能性は、行う作業がどれほど困難であるかに大きく左右されます。たっぷり休憩を取るなどして十分な集中力を保つようにするなら、小さなプログラムで間違える可能性は低いでしょう。一方、大きなプログラムではどんなに集中していても間違える可能性があります。なぜなら、人間が一度に注意を払うことができる範囲に限界があるからです。ある程度規模が大きくなると、十分注意を払って作業をするのが不可能になります。だから分割が必要になるわけです。
プログラムを分割するときは、サブルーチンにしますね。今回は、サブルーチンの基本を押さえることにしましょう。
サブルーチンには、大きくわけて次の2種類があります。
  • プロシージャ
    一連の手順を記述した命令の集まりです。つまり、単にプログラムの一部を抜き出して名前を付けたものです。実行するときには、1つ以上のパラメータを渡すことができます。パラメータとは、つまり、プロシージャの挙動にバリエーションを与えるための変数です。
  • ファンクション(=関数)
    戻り値を持つプロシージャのことです。数学で使う y=f(x) のような関数と同じような意味です。つまり、何らかのパラメータ(変数)を渡して計算させ、その結果を戻り値として受け取るわけです。ただし数学とちょっと違うところは、パラメータを持たない場合もあるということです。
これら2つの違いを意識することはあまりないと思います。私も普段はあまり気にしていません。が、自然に使い分けているのではないでしょうか。どのように使い分けるかというと、プロシージャは単なる実行手順の一部として使用し、ファンクションは値を計算することを目的として使うのです。

C言語では、プロシージャとファンクションを区別する文法がありません。それで、ちょっとややこしいのですが、どちらもまとめてファンクション(関数)と呼びます。戻り値のないファンクションには void という型を指定しますが、これがプロシージャにあたります。

ちなみに Pascal にはこれら2つの区別があります。もともと教育用に開発された言語であることと関係があるのでしょう。

さて、実際のプログラムはそんなに美しいものではありません。プロシージャ的なファンクションがたくさん必要になります。どういうことかというと、「副作用(side effect)」を伴う場合にそうなりやすいのです。副作用とは、プロシージャやファンクションを実行する間に、それらの外側にある何かに影響を与えるような操作のことです。たとえば次のようなものがあります。
  • グローバルな変数の値を変更する
  • パラメータとしてポインタを受け、そのアドレスに格納されている値を変更する
  • 画面に何か描画する
  • 音を出す
  • ファイルを読み書きする
  • 何かのハードウェアを操作する
  • 副作用を持つ別のサブルーチンを内部で呼び出す
そう、"Hello, world" プログラムも副作用を使っているのです。printf などを使って文字を表示するのは副作用です。
副作用はエラー判定を伴う場合が多く、その結果を呼び出し元に戻す必要が生じます。そのため、プロシージャ的なファンクションが使われます。例えば printf 関数の戻り値にはエラーが起こったかどうかを判定するための情報が含まれています。こういう場合、形式上はファンクションですが、実質的にはプロシージャです。
分割によって自分で作ったサブルーチンを呼ぶのと同じように、既に用意されているサブルーチンを使うこともあります。たとえば printf などのような標準関数はほとんどの環境で使うことができます。
では、標準関数の実体はいったいどこにあるのでしょう?自分で作った関数がどこにあるかはなんとなくわかると思います。プロトタイプも宣言しているでしょうし、ソースコードも実装しているので、コンパイルすればそこにあるというのはわかる気がするでしょう。でも具体的にどうなっているのか想像できますか?次回はそこらへんを説明します。知っている人にはちょっと退屈な話になってしまいそうですが、基本なので押さえておくことにします。

("Hello, ANOTHER world!" は2001年11月から2002年11月にかけて作成されたコンテンツです。)