サブルーチン

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

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

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

呼称[編集]

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

関数[編集]

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

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

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

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

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

脚注[編集]

  1. ^ このためか、『新ANSI C言語辞典』[要ページ番号](平林雅英、技術評論社)など、「Cは関数型言語である」としている文献があるが、誤りである。
  2. ^ 標準化以前(K&R初版時代のC)は返り値の型を省略すると既定でintを返すと解釈される仕様だったという経緯があり、互換性を保つためには値を返さないことをvoid型の戻り値によって明示しなければならない。
  3. ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
  4. ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。

関連項目[編集]