サブルーチン

出典: フリー百科事典『ウィキペディア(Wikipedia)』
移動先: 案内検索

サブルーチンテンプレート:Lang-en-short)は、コンピュータプログラミングにおいて、プログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものである。ソースコード上ではコードブロックを形作る。繰り返し利用されるルーチン作業モジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。サブプログラム (subprogram) とも呼ぶ。

プログラムのソース中で、繰り返し現れる作業をサブルーチン化することで、可読性や保守性を高く保つことができる。繰り返し現れる作業でなくても、意味的なまとまりを示すためにサブルーチン化することもある。また、キャッシュのような階層的メモリの設計を持つコンピュータ(現在のパソコンワークステーションなどほぼすべて)では、よく使われるサブルーチンがキャッシュに格納されることで高速な動作を期待できる。

呼称

サブルーチンを、結果として値を返すものと処理だけを行い値を返さないものに分類することがある。その場合、前者を関数(かんすう)、後者を手続き(てつづき)と呼んで区別する。プログラミング言語の仕様としてCのようにどちらかの呼び方のみを採るものと、Pascal のように両者を区別するものがある。

関数

サブルーチンが返す値は戻り値(もどりち)または返り値(かえりち)と呼ばれる。引数をとり、値を返すという、数学における関数との類似性から関数 (function) と呼ばれるわけであるが、一般にプログラミング言語における関数は、数学におけるそれとは以下のような点が異なる。

  • 引数が同じでも状況に応じて戻り値が異なる(状態を持つ)
  • 関数の処理の実行によってシステムに変化が発生する(副作用を持つ)
  • (「手続き」を区別しない言語では)戻り値が存在しない場合がある

これに対し、関数型言語では状態や、プログラム自身に影響するような副作用をもたないことを基本とするなど、数学の関数に近い性質を持つ。特に純粋関数型言語では数学の関数と同等であり、同様の性質(参照透過性など)を持つことが利用される。

各種プログラミング言語におけるサブルーチン

  • Excelでの関数は、主に、計算をしたり、データの検索や集計をしたり、表示を変換するものである。合計値を求めるSUM関数や、平均値を求めるAVERAGE関数など、100を超える関数が存在する。IFに似た働きをするIIFといった関数もある。
  • Cでは、値を返さないものも含め全て「関数」である。また、実行したいコードは全て何らかの関数定義の中に記述しなければならない[1]。歴史的な理由から[2]、値を返さない関数は返り値の型としてvoid型を使って宣言および定義する。
  • Pascalでは、値を返すものは関数、値を返さないものは手続きであり、それぞれfunctionまたはprocedureという予約語を使って宣言(C言語と違い、中身の記述まで含むものもPascalでは「宣言」と言う)する。
  • 古典的なBASICでは、GOSUB 命令によるサブルーチンがあった。インタプリタは GOSUB 命令を見つけると、GOSUB 命令の終わりの場所をインタプリタ内のスタックにプッシュし、命令で指定された行に飛び、実行を続ける。その後、実行中に RETURN 命令を見つけると、スタックから先ほど記憶しておいた呼び出し元の場所をポップし、そこに飛び、GOSUB 命令の次の命令から実行を再開する。サブルーチンを作成したい場合は、ユーザは「この行からこの行まではサブルーチンとする」と決めてプログラムを作成した。以上のように「RETURN できる GOTO」でしかない(引数も返り値もローカル変数もない)ため、(グローバル)変数を経由する、配列をユーザスタックとして使うなど、技巧を必要とした。比較的高機能な実装では、DEFFN 命令により、式一個で記述できる範囲という制限ながらも、引数と返り値のあるユーザ定義関数の追加(拡張)が行えるものもあった。
  • Java等、オブジェクト指向プログラミング言語では、メソッド(特定のオブジェクトあるいはクラスに属するサブルーチン)として記述しなければならない(どこにも属さない関数というものはない)というものもある。
  • LISPでは関数と呼ばれることが多く、Common Lispでも関数と呼ぶ。しかしSchemeの仕様では手続きという用語を使っている。なおLispにはサブルーチンをマクロで実装するという重要な手法もある。
  • Fortranではサブルーチン(subroutine)と、値を返す(即ち式の項になれる)関数(function)を区別する。通常は副作用を持つが、Fortran 90以降ではPURE属性により副作用を持たないことを明示できる。
  • Perlでは、ユーザ定義のものはサブルーチンであるが、引数を渡すことができ、値を返すこともできる。サブルーチン内からは、渡された引数には特殊変数からアクセスし、値を返すにはreturn文[3]を使う。

  1. このためCは関数型言語である、としている文献などがあるが誤りである
  2. 昔は返り値の型を書くのを省略すると、デフォルトとしてintを返すと解釈されたため、互換性を保つために、値を返さないことを明示しなければならない
  3. http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている

関連項目