プログラムは関数の塊まり

 今回は「プログラムの進み方」について見ていきます。ちなみにこの「進み方」のことを「流れ」とか「フロー」とか言います。プログラムはもう強烈な激流みたいなものですから心してください。

プログラムのスタート!!
 アプリケーションを実行したとき、必ずどこかから、プログラムはスタートします。このスタートとなる部分を「エントリーポイント」と呼ぶことがあります。
 C言語系ではmain()という関数からスタートします。ただし、ウィンドウズプログラミングの場合にはWinMain()という関数からスタートしたり、ぱっと見ではどこからスタートしたのか解らない場合もあります。
 Pascalの場合には、何もないbeginの直後からスタートします。
 Visual C++やVisual Basic、Delphiといった「ウィンドウズ開発環境系」の場合には、このスタートの部分が隠されているので実際には見えません。が、でもどっかにはあるんです。
 JAVAスクリプトやVBスクリプトの場合には、一応ホームページの頭から読まれていき、関数の中に入っていない部分の最初の行から実行されます。そういう行がない場合もあります。
 JAVAの場合にはアプリケーションクラスのmainメンバ関数からスタートします。

 これを読んで頭がうにょうにょにならなかった人は、この講座読まなくても大丈夫です。うにょうにょになった人は、とりあえず自分の使う言語のところをちょっとだけ読んで、頭の片隅に入れておいてください。
 で、このスタート地点はたいがいの本に載っています。「一番簡単なプログラム(Hello, world!!)」を組んでみれば、たいがいは解るでしょう。ただし、「ウィンドウズ開発環境系」は基本的に解らないようになっているのでその辺は無視して構いません。

行の中では?
 プログラムは行ごとに上から下へと進んでいきます。では、行の中ではどのように進んでいくのでしょうか。
 そこで出てくるのが記号の優先順位です。例えば

	a = 3 - 4 / ( 2 + 5 )
	

 という行があった場合、記号の優先順位の順に実行されます。まず最初に小カッコの中の足し算が実行され、次にわり算が実行、引き算が実行されたあと、変数に代入される、というわけです。
 この優先順位は基本的に数学のものと一緒です。それに、ほとんどの言語で共通のものなので、これは本などを読んでしっかり憶えましょう。

関数という存在
 「関数」という単語がいっぱい出てきました。でも、どんな存在なんでしょう。
 サンプルをいくつか試しているのであれば、おそらく皆さんは何度となく「関数」に出逢っているはずです。関数は予約語、つまり初めから存在する単語で、最後に()(小カッコ)があるものです。C言語系ならprintf()とかMessageBox()とか、JAVAスクリプトならdocument.write()とか、そういうものを使っているでしょう。これが、関数と呼ばれる存在です。

 こういった「最後に小カッコ」の単語を呼び出すと、何らかの機能が実行されるでしょう。例えば文字を出力したり、複雑な計算をしたり。こういう「機能をパッケージ化して、簡単に呼び出せるようにしたもの」「関数(Function)」とか「手続き(Procedure)」と呼びます(この講座ではこれらをまとめて「関数」と呼びます)。
 この関数、実はプログラムの中で勝手に作ることもできます。作り方は言語によって違います。

/*	C言語系の場合。	*/
int	TestFunc( int TestVar )
{
	/*ここが関数の中身。*/
}

//	JAVAスクリプトの場合。
function TestFunc( TestVar )
{
	//ここが関数の中身。
}

{	Pascal系の場合。	}
function TestFunc( TestVar : integer )	: integer;
begin
	{ここが関数の中身。}
end;

'	Visual Basic系の場合。
Public Function TestFunc( TestVar As integer ) As Integer
	'ここが関数の中身。
End Function
	

 こんな感じで作製することで、あとでTestFunc()と簡単に呼び出せるわけです。

 この「関数」という存在はプログラムの最小単位だと考えてください。つまり、関数がいっぱい集まってプログラムが構成されているというわけです。いくつかの言語(主にスクリプト系)を除いて、関数の外にプログラムは存在し得ません。関数を渡り歩くことによって、プログラムが成り立っているというわけです。
 だから、最初に説明した「エントリーポイント」のほとんどは、関数に存在するわけですね。

変数のスコープ
 前回説明した「変数」、データを入れるための箱だか部屋だか、そんな感じに説明しました。この変数を関数の中で使いたいという場合、関数の中で変数を作製します。この作製することを「変数を宣言する」と言います。「この変数使いたーい!!」と叫ぶような感じですか。
 C言語系は関数の最初で、Pascal系は特別な範囲の中で変数の宣言を行います。これ以外の言語は関数の中ならどこででも宣言できます。また、Visual Basic系では宣言すら必要なかったりします(でもした方が分かりやすいのでしましょう)。

 ところが、この変数、その関数の中でしか使えません!! えー、そんなの不便だよーと思われるかもしれませんが、考えてみましょう、いろんな関数で使えちゃうと、勝手に中身が変えられてないかとても心配です。簡単なプログラムなら目も行き届きますが、プログラムがとっても大きくなったり、いろんな人が同時に作っていたりした場合には、「ホントにこの変数中身変えられてないかなぁ」と不安たらたらです。
 それに、関数は「機能をパッケージ化したもの」と説明しました。関数の中に変数もパッケージ化してしまうことで、「関数は呼び出すだけ、その中へは干渉できない」とすることができるのです。そうすることで、関数が正しく機能することへの信頼性が高まるというわけです。
 実は、変数にも「関数の中だけ」ではなく、アプリケーション全体でどこででも使えたり、もっと小さな範囲しか使えないものもあります。こういった「この変数はどこからどこまで使えるのか」ということを「変数のスコープ」と言います。でも、はっきり言って最初はこの「関数の中だけ」の変数だけを使用しましょう
 じゃぁどうしましょう、「でも、関数をただ実行しただけじゃ意味がないじゃない」、そうです。そのために、特定の「渡したい値」だけ渡せる機能が関数にはあるのです。

変数もどき、戻り値
 関数の例の中で、関数名の前後に型名(ここでは整数、Integerになっています)があるでしょう。これは、戻り値の型です。例えば、

	a = TestProc()
	

 という風に書くと、TestProc()が実行されたあと、その関数は戻り値に置き換えられます。もし3が返ってきたとしたら、

	a = 3
	

 と同じ意味になるというわけです。このように、戻り値とは関数に変数の機能を持たせるものなのです。
 自分で作った関数にこの機能を付けるのは簡単です。C言語系とJAVA系はreturnという予約語を使うことで値を返すことができます。注意して欲しいのは、returnを使った時点で関数が終了するということです。関数を終わらせたいときにこの単語を使う、とも憶えておいてください。
 Visual Basic系とPascal系では、関数の中にその関数名と同じ変数があって、その変数に値を代入すると、関数が終了したときに戻り値となる仕組みになっています。これは単なる変数への代入と同じに扱われるので、関数が終了したりはしません。
 このように戻り値を使うことで、関数から値を返すことができます。では、関数に値を渡すときにはどうするのでしょうか。

引数、値渡しと参照渡し
 サンプルを試しているのであれば、おそらく戻り値よりも引数の方を先に使っているでしょう。
 関数の最後の小カッコ、その中に値を入れることで関数から関数へと値を渡すことができます。関数の最初で、変数が値を入れるのを待っているような感じです。この変数を引数(ひきすう)と呼びます。英語で書くとParameter、こっちの方が直感的に分かりやすいかもしれませんね。でも引数の方が一般的に使われています。

 引数を自分で作った関数で使うときには、小カッコの中に変数名とその型名を入れます。要するに、小カッコの中で変数を宣言すればいいわけです。宣言することで、その関数の中で引数を変数として使用できます。で、その変数の中には、呼び出しもとの関数から渡された値が入っているというわけです。

 というわけで、関数の中で引数を使い、結果を返しました。でも、ふたつ以上の結果を返したいときにはどうすればいいのでしょう。そこで出てくるのが参照渡しです。
 引数に値が渡されるときは、基本的に値渡し(ねわたし)と呼ばれる方法を取ります。これは変数の中身だけ代入することで、例えば

	b = 3
	a = TestFunc( b )
	

 とした場合、引数の中身を関数の中で変更したとしても、bの値は3のままです。これは、単に3という値を代入しただけだからです。これを値渡しと言います。値だけ渡す、そのままですね。
 これとは別の方法が参照渡しと呼ばれるものです。これは変数を引数に渡すと、中身ではなく変数そのもののアドレスが渡されるのです。アドレスというとちょっと分かりにくいかもしれませんが、要するに変数のある場所、住所、郵便番号、そんな感じです。また、「32ページを参照してください」みたいな使い方もするので、そういう風に取ると分かりやすいかもしれません。

 参照渡しされると、関数の中の引数は、あたかも外にある変数(ここではb)と全く同じように振る舞います。というのも、名前は違っていても外の変数そのものだからです。住所を教えられたのですから、その住所の先に行って値を取得して、その部屋をついでに変数代わりにするわけです。
 そのため、引数を変更すると、外にある変数の中身も変えられます。この機能を使うことで、ふたつ以上の値を関数から返すことができるというわけです。

 この参照渡しにはもうひとつ大きな意味があります。例えばあなたが知り合いに自分のホームページを見せたいということでメールを送るとします。ここで、ホームページを添付ファイルとして全部送ってしまうことが値渡しです。でも、そんなことをしたらいい迷惑ですね。
 そこで、URLだけを送る、これが参照渡しです。つまり、引数として渡したい値が無茶苦茶大きい場合などには参照渡しを使うといいというわけです。関数を作るときに「参照だけれども、関数の中で中身を変えられない引数」を指定することもできますから、こういった使い方もできるわけです。

 さて、言語ごとの差ですが、C言語ではビギナーズキラーと冠されるポインタを使うことで、参照渡しを使うことができます。でも要勉強。C++、JAVA系ではそのまま参照という機能があるのでそれを使えばOK。
 Visual Basic系では引数は参照渡しがデフォルトになっていて、ByValという予約語を引数の前に置く事で値渡しになります。
 逆にPascal系はデフォルトが値渡しvarを引数の前に入れることで参照渡しになります。

関数の簡単なまとめ
 関数について簡単にまとめてみましょう。関数は……
・小カッコが最後に付いた単語
・引数から値を渡して、戻り値から値を返してもらう
・引数には値渡しと参照渡しがあって、参照渡しは値を返してもらえる(もらえないこともある)
・プログラムは関数を渡り歩いて進んでいく
 といったところでしょう。では最後。

プログラムの終了
 プログラムの終了は、すべての関数から抜けたときです。と言っても「関数から出たら、呼び出したところに戻る」ので、最終的には一番最初の関数(エントリーポイント)が終了したらプログラムが終了するということです。C言語ならmain関数が終了したらプログラムの終了、というわけですね。
 でも、一部の言語では、この「スタートとエンド」が隠されていたり見え辛かったりします。これは主に「イベントドリブン」と呼ばれるシステムに寄るものです。というわけでそれは次回。

(C)KAB-studio 1998 ALL RIGHTS RESERVED.