プログラミングにおいて、サブルーチンとは、一連のプログラムをまとめて、それをソースコード上の任意の位置で呼び出せるようにしたものです。
あるプログラミング言語では、サブルーチンは、関数と呼ばれます。
ソースコード上でサブルーチンの名前と処理の内容を決めることをサブルーチンの定義と言います。
例えば、以下は、あるプログラミング言語において、二つの整数を足して、その結果を返すサブルーチンの定義です。詳細は、以降で説明します。
int add(int a, int b){
int y = a + b;
return y;
}
なお、上記のサブルーチンは、addと名前を付けましたが、任意の名前を付けられます。
以下の赤字の変数*を仮引数と言います。
int add(int a, int b){
int y = a + b;
return y;
}
このサブルーチンを呼び出す際、呼び出し元は仮引数に対応した二つの値をサブルーチンに渡す必要があり、渡された値は、青色のaとbに代入されます。
変数の宣言が必要なプログラミング言語では、仮引数は、上記のように変数の宣言を行います。
一方、仮引数がないサブルーチンは、以下のように()の中を空にします。
int test(){
int y = 1 + 2;
return y;
}
サブルーチンの終了時に、サブルーチンの呼び出し元に返す値のことを戻り値と言います。
以下の例では、赤字の変数*yの値が戻り値です。
int add(int a, int b){
int y = a + b;
return y;
}
「return 3;」とすれば、戻り値は、3になります。「return a + b;」のように、戻り値を式にすることもできます。この場合は、a + bの結果が戻り値となります。
return文とは、サブルーチンを終了して、サブルーチンの呼び出し元に戻るための文のことです。以下の赤字がreturn文です。
int add(int a, int b){
int y = a + b;
return y;
}
戻り値の指定は、上記のようにreturn文を使って行います。戻り値が必要ない場合は、「return;」とします。
return文が実行されると、以降に実行できるプログラムがあったとしてもそれらを実行せずに、サブルーチンの呼び出し元に戻ります。
以下の赤字は、戻り値のデータ型です。この場合は、戻り値のデータ型は、整数型の一つであるintです。
int add(int a, int b){
int y = a + b;
return y;
}
戻り値がない場合は、戻り値のデータ型は、voidとします。
void test(){
//何かしらの処理
return;
}
上記で定義したサブルーチンaddは、サブルーチンの定義以降の任意の位置で、以下のように呼び出せます。
int c = add(1, 2);
赤字は、このサブルーチンの引数です。
引数に1と2を指定して、サブルーチンを呼び出すため、このサブルーチンの戻り値は、3です。そして、戻り値の3がcに代入されます。
もし、サブルーチンaddに戻り値がない場合は、以下のように呼び出します。
add(1, 2);
多くのプログラミング言語では、戻り値があるサブルーチンのことを「関数」と呼びます。
戻り値がないサブルーチンは、「関数」「プロシージャ」「サブルーチン」などと呼ばれます。
サブルーチンは、ハードウェアレベルでは、以下の仕組みで実現されています。
・サブルーチンの実体は、メインメモリにあります。サブルーチンの定義を行うことでそのメインメモリが確保されます。
・サブルーチンの呼び出しは、コール命令で実現されます。
・サブルーチンの呼び出し元に戻るのは、リターン命令で実現されます。
・サブルーチンに引数を渡すことは、PUSH命令で引数をプロセッサのスタックにPushすることで実現します。サブルーチンに渡された引数を利用する場合は、ベースポインタを基準とした相対アドレスを使って、ロード命令で引数を読み出します。
・戻り値は、適当なプロセッサレジスタに戻り値を書き込むことで実現します。サブルーチンの呼び出し元で戻り値を利用する場合は、そのレジスタの値を利用します。
・サブルーチン*内の最初と最後に行われるレジスタの保存と復元のプログラムは、コンパイル時に追加されます。