» www.Giftbox.Az - Bir birindən gözəl hədiyyə satışı
ウィキペディアランダム
毎日カテゴリ
共有: WhatsappFacebookTwitterVK

サブルーチン

プログラミングにおけるサブルーチン: subroutine)はプログラム中で意味や内容がまとまっている作業をひとつの手続きとしたものである。別名として関数: function)、ルーチン: routine)、サブプログラム (: subprogram) とも呼ばれる。

繰り返し利用されるルーチン作業モジュールとしてまとめたもので、呼び出す側の「主」となるもの(メインルーチン)と対比して「サブルーチン」と呼ばれる。

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

分類

サブルーチンに相当する処理のまとまりを「結果として値を返すもの」と「処理だけを行い値を返さないもの」に分類・区別することがある。この区分はプログラミング言語の仕様で定められるため、言語により区分や呼称が異なる。以下はその例である。

表. サブルーチンの区分
値を返す 値を返さない
Fortran 関数(: function サブルーチン(: subroutine
Pascal 関数(: function 手続き(: procedure
C言語 関数(: function
Microsoft Visual Basic Functionプロシージャ Subプロシージャ

これらの名称は慣習的なものであり、手続き型プログラミング関数型プログラミングといったプログラミングスタイルあるいはプログラミングパラダイムの分類とは関係がない。

関数

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

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

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

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

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

脚注

  1. ^ 標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合にはvoidを書いて明示しなければならない、という仕様になっている。
  2. ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
  3. ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。
  4. ^ IIf function (Visual Basic for Applications) | Microsoft Docs

関連項目

ウィキペディア、ウィキ、本、library、論文、読んだ、ダウンロード、自由、無料ダウンロード、mp3、video、mp4、3gp、 jpg、jpeg、gif、png、画像、音楽、歌、映画、本、ゲーム、ゲーム。