関数の呼び出しについて

これは公開用ではありませんので、ググってきた方は戻ることをおすすめします。

 

関数の呼び出しについて


何気なく使っている関数ですが、どうして関数は処理を終えた後、無事呼び出し元に戻れるのでしょうか?

関数の呼び出しとはいわば、呼び出した地点から、関数の本体へジャンプして、処理をして、元の場所に戻ることです。

 

これを説明するには、関数がコンピューターの中で実際にどのように呼ばれているのかを考える必要があります。

難しい説明は抜きにします。

 

プログラムというのはコンピューターのメモリ上に展開されます。メモリには番地というのがあって、それを用いて、メモリ上の任意のデータにアクセスすることができます。

コンピューターはプログラムを実行する際に、メモリ上の十分な場所に、プログラムを一続きになるように展開します。

 

そのあとに、コンピューターはプログラムカウンタという現在実行している番地を記録する場所に、実行したいプログラムの一番最初の番地を登録します。

 

後は簡単です。コンピューターはプログラムカウンタの示す番地のデータを取ってきて処理をします。処理が終わったら、プログラムカウンタの指す番地を一つ先に進めます。つまり、今実行している番地の次の番地を指すようにします。

 

このロジックを繰り返すことで、コンピューターはプログラムを順々に実行していきます。

プログラムの終了を示すデータの入った番地のデータを読み出した地点で、コンピュータはプログラムの実行を終了させます。

 

ところで、コンピューターにはプログラムカウンタのほかに、様々な記憶領域があります。その一つに、積みゲーのごとく、番地を積んでおいておくスタックという場所があります。つまり、最近積んだ番地が一番上にあって、それをとってどうこうすることができます。どうこうした番地はスタックから取り除かれて、その一個下に積んであった番地が、一番上にきます。

 

関数はこのスタックを利用しています。

プログラムカウンタの指す番地のメモリに関数の呼び出しをする命令が書かれていたとします。

コンピュータはこのときプログラムカウンタの内容を(つまり指し示している番地を)スタックに積みます。あとは関数の始まりのデータのある番地を指すようにプログラムカウンタを書き換えます。そうすればコンピュータはその関数を実行することができます。

 

コンピュータはreturn命令のある番地を読み込んだときに関数を終了します。PHPにおいてはreturnのない関数でも、関数の最後にreturnが自動的に書かれます。

 

return命令を読み込んだとき、コンピュータはスタックから番地を取り出します。取り出した番地の一つとなりの番地をプログラムカウンタに書き込みます。これはどういうことかというと、呼び出し命令の書かれていた番地の隣の番地を実行するようにしたと言うことです。

 

こうして無事に関数から帰ってこれたわけです。

 

つづく