サブルーチン 概説

サブルーチン

出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/10/21 16:13 UTC 版)

概説

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

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

呼び出しと入出力

サブルーチンが結果として値を返す場合、その値は戻り値(もどりち)または返り値(かえりち)と呼ばれる。

プログラミング言語によっては、サブルーチンに相当する処理のまとまりを、「結果として値を返すもの」と「処理だけを行ない値を返さないもの」に分類・区別することがある。この区分はプログラミング言語の仕様で定められるため、言語により区分や名称が異なる。例えば、Pascalでは戻り値があるものを関数と呼び、戻り値がないものを手続きと呼ぶ。C言語ではいずれも関数と呼ぶ。ALGOLではいずれも手続きと呼ぶ。これらは慣習的なものであり、手続き型プログラミング関数型プログラミングといったプログラミングスタイルあるいはプログラミングパラダイムの分類とは関係がない。サブルーチンが属するスコープなどの特性によって名称を変えているものもあれば、特に区別せず同じ名称を与えているものもある。

日本の情報処理推進機構 (IPA) が運営している基本情報技術者試験で使われる疑似言語では、サブルーチンを戻り値の有無により「関数」と「手続」(てつづき)に分類している。戻り値があるほうが関数であり、戻り値が無いほうが手続である[1]。これはPascalの慣習と同じだが、もともとアルゴリズムの記述にはALGOLやPascal系の構文をもとにした疑似言語が使われることが多かった、という事情もある[2]

なお、サブルーチンは呼び出し時に入力として引数(ひきすう)を受け取り、サブルーチンの中で宣言された「仮引数」と呼ばれる変数を通じて内部処理に使うことができる。引数の渡し方には、一般的なものとして以下の2つがある[3]

  • 実引数を渡すときにその値だけを渡して、記憶場所(アドレス)は渡さない方法を「値呼び出し」または「値渡し」という。値呼び出しで変数を渡す場合、メインルーチンとは別にサブルーチン側で変数の記憶領域を確保し、そこにいったん値(データ)をコピーする。そのため、サブルーチン側で変数の値を変更しても、メインルーチンに戻ったときには元の値のままになる。
  • 実引数を渡すときにその記憶場所(アドレス)を渡す方法を「参照呼び出し」または「参照渡し」という。参照呼び出しで変数を渡す場合、メインルーチンとサブルーチンとで、変数の記憶領域が共有される。そのため、サブルーチン内でその変数に対して行なった変更操作は、メインルーチンに戻ってもそのまま反映される。

一般的には戻り値によって単一の結果を出力として返すが、参照呼び出しを使うことによって複数の結果を出力として返したり、受け渡しの際のデータコピーのコストを低減したりすることもできるようになる。

なお、Pascalでは関数/手続きの内部に、それらの中でのみ呼び出し可能な別の関数/手続きを記述することもできる。関数内関数やローカル関数などと呼ばれることもある。

一般的にサブルーチンにはプログラムソースコード上で識別可能な何らかの名前が付けられ、呼び出しの際にはその名前をもとに参照されるが、名前を持たないサブルーチン(無名関数、ラムダ式)を定義できる言語もある。

通例、サブルーチンとその呼び出し元の間での引数および戻り値の受け渡しや、サブルーチンが終了したときに呼び出し元にフロー制御を戻すための復帰位置(リターンアドレス)の一時記憶、サブルーチン内のローカル変数の割り当てには、コールスタックやレジスタが使われる。引数がスタックに積まれる順序やメモリレイアウトなどの呼び出し規約は、プログラミング言語やプロセッサ (CPU) のアーキテクチャにも依存するが、コンパイラ固有の修飾子(キーワード)によって指定できる環境もある[4][5]x64ARMのように、特定の条件を満たす引数についてはスタックではなくレジスタを経由して受け渡しされるアーキテクチャもある[6][7]

環境によっては、呼び出し規約を規定し、また引数と戻り値のデータ型を基本数値型やポインタ型などのPOD英語版型に限定することで、異なる言語間で相互運用可能なABI互換性のあるサブルーチンを定義することができる。例えばCで書かれた関数をダイナミックリンクライブラリ (DLL) や共有ライブラリ (so) にエクスポートし、Pascalの関数または手続きとして呼び出したりすることも可能となる。別の例として、Microsoft Excelでは、C/C++やPascalやVisual Basicなどを使ってDLLに実装された関数を、Visual Basic for Applications (VBA) のコードモジュールからプロシージャとして呼び出したり、ワークシートから直接利用したりすることができる[8][9]

数学の関数との違い

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

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

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

オブジェクト指向言語の場合

多くのオブジェクト指向プログラミング言語では、何らかのオブジェクトあるいはクラスに属するサブルーチンは、メソッドと呼ばれている。Cから発展し、Simulaの影響を強く受けたC++では、クラスや構造体に属する関数はメンバー関数と呼ばれている。

JavaC#など、サブルーチンはクラスや構造体などの型に属するメソッドもしくはメソッド内のローカル関数として記述しなければならず、どこにも属さない関数(フリー関数)は定義できないオブジェクト指向言語もある。一方、C++Swiftのように、必ずしもクラスや構造体に属する必要はなく、名前空間スコープに関数を直接定義できるオブジェクト指向言語もある。


注釈

  1. ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
  2. ^ 標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合にはvoidを書いて明示しなければならない、という仕様になっている。
  3. ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。
  4. ^ オセロゲームの盤面先読みのコードは、以前、基本情報技術者試験に出題されたことがあり教科書や問題集などでも掲載されるようになっていた。

出典

  1. ^ a b c d 大滝みや子『2020年版 基本情報技術者 標準教科書』オーム社、2019年。pp.95-96「手続きと関数」「再帰呼び出し」の章
  2. ^ 電子情報通信学会『知識の森』 - 6 群「基礎理論とハードウェア」 - 3 編「アルゴリズムとデータ構造」 - 1 章「アルゴリズムとアルゴリズム解析」
  3. ^ 問49 変数を引数として渡しても、サブルーチンの実行後に変数の値が変更されないことが保証されているものはどれか。 | 日経クロステック(xTECH)
  4. ^ Calling Conventions | Microsoft Learn
  5. ^ Argument Passing and Naming Conventions | Microsoft Learn
  6. ^ x64 calling convention | Microsoft Learn
  7. ^ Overview of ARM ABI Conventions | Microsoft Learn
  8. ^ Working with DLLs | Microsoft Learn
  9. ^ Developing DLLs | Microsoft Learn
  10. ^ a b c d Brian W. Kernighan / Dennis M. Ritchie "The C Programming Language, Second Edition", 1988. ISBN 0-13-110362-8, pp.24-27 "Functions".
  11. ^ Writing a property procedure (VBA) | Microsoft Learn
  12. ^ Property プロシージャ - Visual Basic | Microsoft Learn
  13. ^ IIf function (Visual Basic for Applications) | Microsoft Docs
  14. ^ 自分から自分を呼ぶ? Pythonで「再帰呼び出し」の不思議を体験 | 日経クロステック(xTECH)
  15. ^ 『令和04年 栢木先生の基本情報技術者教室』技術評論社、2021年、p.209「再帰的な関数の例」
  16. ^ .NET TIPS [ASP.NET]データベースからツリー・メニューを生成するには? - C# VB.NET Webフォーム - @IT
  17. ^ Chess programming
  18. ^ 将棋ソフト作成入門
  19. ^ 再帰呼び出し
  20. ^ 囲碁プログラムの作り方(基本編)


「サブルーチン」の続きの解説一覧



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「サブルーチン」の関連用語

サブルーチンのお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



サブルーチンのページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
All text is available under the terms of the GNU Free Documentation License.
この記事は、ウィキペディアのサブルーチン (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。 Weblio辞書に掲載されているウィキペディアの記事も、全てGNU Free Documentation Licenseの元に提供されております。

©2024 GRAS Group, Inc.RSS