サブルーチン
サブルーチンとは、随時利用される、目的の決まった小さなプログラムのことである。プログラムを記述する際の基本的な技法の一つで、さまざまな場面で利用できる処理手順をひとまとめにしたものにあたる。
同じ目的の処理を何回か行わせる場合、その部分を一つのプログラム(サブルーチン)として独立させ、あとから呼び出して(サブルーチンコール)使えるようにすれば、同じ処理のプログラムを何回も書く手間が省け、プログラム全体も見やすくなる。
このようにすることにより、プログラム全体の開発効率が向上するだけでなく、デバックが容易になり、記憶領域の容量の節約にもつながる。
なお、サブルーチンには、オープンサブルーチンとクローズドサブルーチンの2つがあるが、一般にはクローズドサブルーチンをサブルーチンと呼んでいる。これに対して、全体のプログラムを構成する基本的な流れは主プログラム(メインルーチン)と呼ばれる。
サブルーチン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2023/10/21 16:13 UTC 版)
プログラミングにおけるサブルーチン(英: subroutine)は、プログラム中で意味や内容がまとまっている作業をひとつにまとめたものである。サブプログラムあるいは副プログラム(英: subprogram)[1]とも呼ばれ、単に「ルーチン」(英: routine)と呼ばれることもある。プログラミング言語によっては、関数(英: function)やプロシージャあるいは手続き(英: procedure)とも呼ばれる。
注釈
- ^ C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。
- ^ 標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合には
void
を書いて明示しなければならない、という仕様になっている。 - ^ http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。
- ^ オセロゲームの盤面先読みのコードは、以前、基本情報技術者試験に出題されたことがあり教科書や問題集などでも掲載されるようになっていた。
出典
- ^ a b c d 大滝みや子『2020年版 基本情報技術者 標準教科書』オーム社、2019年。pp.95-96「手続きと関数」「再帰呼び出し」の章
- ^ 電子情報通信学会『知識の森』 - 6 群「基礎理論とハードウェア」 - 3 編「アルゴリズムとデータ構造」 - 1 章「アルゴリズムとアルゴリズム解析」
- ^ 問49 変数を引数として渡しても、サブルーチンの実行後に変数の値が変更されないことが保証されているものはどれか。 | 日経クロステック(xTECH)
- ^ Calling Conventions | Microsoft Learn
- ^ Argument Passing and Naming Conventions | Microsoft Learn
- ^ x64 calling convention | Microsoft Learn
- ^ Overview of ARM ABI Conventions | Microsoft Learn
- ^ Working with DLLs | Microsoft Learn
- ^ Developing DLLs | Microsoft Learn
- ^ 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".
- ^ Writing a property procedure (VBA) | Microsoft Learn
- ^ Property プロシージャ - Visual Basic | Microsoft Learn
- ^ IIf function (Visual Basic for Applications) | Microsoft Docs
- ^ 自分から自分を呼ぶ? Pythonで「再帰呼び出し」の不思議を体験 | 日経クロステック(xTECH)
- ^ 『令和04年 栢木先生の基本情報技術者教室』技術評論社、2021年、p.209「再帰的な関数の例」
- ^ .NET TIPS [ASP.NET]データベースからツリー・メニューを生成するには? - C# VB.NET Webフォーム - @IT
- ^ Chess programming
- ^ 将棋ソフト作成入門
- ^ 再帰呼び出し
- ^ 囲碁プログラムの作り方(基本編)
- 1 サブルーチンとは
- 2 サブルーチンの概要
- 3 概説
- 4 歴史
- 5 脚注
サブルーチン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2017/12/08 14:07 UTC 版)
「Simulation RPG Construction」の記事における「サブルーチン」の解説
シナリオに組み込んで使用するファイル。拡張子は「.eve」であり、シナリオ同様テキストファイルであるためテキストエディタでの編集が可能。シナリオのシステムを拡充するために利用されている場合が多く、第三者が流用可能なようにして配布されているものも多い。 旧バージョンでは「インクルード」と呼ばれており、現在でもこちらの呼称を使用するユーザーは多い。
※この「サブルーチン」の解説は、「Simulation RPG Construction」の解説の一部です。
「サブルーチン」を含む「Simulation RPG Construction」の記事については、「Simulation RPG Construction」の概要を参照ください。
サブルーチン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/08/16 13:57 UTC 版)
PDP-8では汎用スタックをアーキテクチャ上サポートしていないため、サブルーチンを呼び出すときや割り込みが発生したときのコンテキスト(プログラムカウンタやACなどのレジスタ値)をセーブする方法が確立されていない。その代わり、リターンアドレスとしてのプログラムカウンタ値がターゲットサブルーチンの先頭ワードに格納される。従って、間接ジャンプ命令でサブルーチンから戻ることができる。 以下のプログラムはサブルーチンを使うように改造した "Hello world" である。JMS命令でサブルーチンに飛び込むと、OUT1:の位置にある0が書き換えられる。 *200 / Set assembly origin (load address) HELLO, CLA CLL / Clear the AC and the Link bit TAD (DATA-1) / Point AC just *BEFORE* the data (accounting for later pre-increment behavior) DCA 10 / Put that into one of ten auto-pre-increment memory locations LOOP, TAD I 10 / Pre-increment mem location 10, fetch indirect to get the next character of our message SNA / Skip on non-zero AC HLT / Else halt at end of message JMS OUT1 / Write out one character JMP LOOP / And loop back for more OUT1, 0 / Will be replaced by caller's updated PC TSF / Skip if printer ready JMP .-1 / Wait for flag TLS / Send the character in the AC CLA CLL / Clear AC and Link for next pass JMP I OUT1 / Return to caller DATA, "H / A well-known message "e / "l / NOTE: "l / "o / Strings in PAL-8 and PAL-III were "sixbit" ", / To use ASCII, we'll have to spell that out, character by character " / "w / "o / "r / "l / "d / "! / 015 / 012 / 0 / Mark the end of our .ASCIZ string ('cause .ASCIZ hadn't been invented yet!) リエントラント性や再帰呼び出しを実現しようとすると、プログラマは自分でコールスタックを用意し、リターンアドレスをスタックにセーブしなければならない。また、ROMを使うのも困難である(プログラムが書き換え可能でないとサブルーチンを使えないため)。ROMにプログラムを格納する場合、以下のような回避方法があった。 実行時にはRAMにコピーする RAMも一部内蔵したROMを使い、各ワードにフラグを設定してRAMを代替に使用するかどうかを指定する(要するに非常に特殊なメモリを使用する)。 サブルーチンを全く使わない。またはJMS命令の代わりに次のようなコードを使い、書き換え可能なメモリにリターンアドレスを置く。 JUMPL, DCA TEMP / Deposit the accumulator in some temporary location TAD JUMPL+3 / Load the return address into the accumulator: hard coded JMP SUBRO / Go to the subroutine, and have it handle jumping back JUMPL+4 / Return address JMS命令を使用するとデバッグが難しくなる。例えば、リターンアドレスの書き換えによって無限ループに陥ることもあるし、サブルーチンのアドレスを間違うとサブルーチンの先頭ではないワードをリターンアドレスで書き換えてしまうこともある。こういった誤りは実行してみないとわからないこともある。
※この「サブルーチン」の解説は、「PDP-8」の解説の一部です。
「サブルーチン」を含む「PDP-8」の記事については、「PDP-8」の概要を参照ください。
サブルーチン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/07/23 09:22 UTC 版)
詳細は「サブルーチン」を参照 サブルーチンには、手続き、ルーチン、プロシージャ、関数(特に値を返す場合)、メソッド(特に何らかのクラスに属する場合)など様々な名称がある。 1950年代、コンピュータのメモリは非常に小さかったため、サブルーチンの第一の目的はプログラムのサイズを削減することにあった。サブルーチンとして書かれたコードをプログラム内のあちこちから使用することでプログラム全体のコードサイズを削減したのである。現在ではサブルーチンはプログラムを構造化するために使われる。すなわち、特定のアルゴリズムを分離したり、特定のデータにアクセスするメソッドを隠蔽したりする。多数のプログラマが共同でプログラム開発をする場合、サブルーチンはある種のモジュール性を提供し、仕事の分割点の役割も果たす。 サブルーチンに引数があればさらに便利になる。多くのプログラミング言語には平方根を求めるサブルーチンが組み込まれており、引数として平方根を求めたい数を与えることができる。 プログラミング言語によっては再帰呼び出しが可能である。つまり、サブルーチンが直接的あるいは間接的に自分自身を呼び出すことができる。クイックソートや木構造を探索するアルゴリズムなどは再帰を使った方が素直に表現できる。 サブルーチンを使用すると、引数の受け渡し、サブルーチン呼び出し、コールスタック処理、サブルーチンからの復帰などのオーバヘッドによりプログラム性能が若干低下する。実際のオーバヘッドはハードウェアおよびソフトウェアのアーキテクチャに依存する。コンパイラによってはインライン展開を効果的に使用してオーバヘッドの低減を図るものもある。 プログラミング言語によってはサブルーチンの物理的な最後尾に到達しないとサブルーチンから復帰できない方式のものもある。他の言語には return や exit 文がある。これはサブルーチンの最後尾への分岐と等価であり、制御構造を複雑化するものではない。必要に応じて複数のそれらの文をサブルーチン内に置くことができる。
※この「サブルーチン」の解説は、「制御構造」の解説の一部です。
「サブルーチン」を含む「制御構造」の記事については、「制御構造」の概要を参照ください。
サブルーチン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/02/16 16:17 UTC 版)
「レジスタ (コンピュータ)」の記事における「サブルーチン」の解説
サブルーチンとの情報のやりとり(引数と返り値)は、プログラムをモジュールに分割してコンパイルできるようにするために、あらかじめ定めておく必要があり、呼出規約と言う。呼出規約にはいろいろあるが、レジスタが多数あるマシンであれば、レジスタでやりとりするのが効率的であり、レジスタ渡しと言う。バークレーRISC(w:Berkeley RISC)に影響されたSPARCなどのRISCプロセッサやEPICアーキテクチャには、アーキテクチャ的にこれを支援するレジスタ・ウィンドウを備える。レジスタ渡しに対し、スタックで渡すものをスタック渡しと言う。引数をスタックに積んでサブルーチンを呼び出すが、返り値はレジスタ(アキュムレータ)で返すことが多い。(同じような「何々渡し」という語を使うが、評価戦略と直接の関係は無いので注意) PCでポピュラーなx86の場合(w:X86 calling conventions)、IA-32およびそれより前のプロセッサでは、コンパイラの生成するコードではスタック渡しが多かったが、最適化の進んだコンパイラではMicrosoft Cの__fastcall構文でレジスタ渡しを明示したり、可能な限りレジスタ渡しをするコードを生成するLSI C-86もある。x64にはMicrosoft x64とSystem V AMD64の2種類があるが、どちらもレジスタ渡しが基本である。 可変長引数をレジスタ渡しするのは困難であるため、可変長引数の場合にはスタック渡しにすることも多い。但し、呼び出し規約等で引渡し方法をきちんと定義し、またそれに沿ったプログラミングを行わないと、齟齬が生じてプログラムの誤動作を引き起こす。例えばC言語において、ヘッダーを適切にincludeせずにプロトタイプ宣言なしでprintf関数を呼ぶと暴走し、hello worldすら動かない事例を引き起こす。
※この「サブルーチン」の解説は、「レジスタ (コンピュータ)」の解説の一部です。
「サブルーチン」を含む「レジスタ (コンピュータ)」の記事については、「レジスタ (コンピュータ)」の概要を参照ください。
サブルーチン
「サブルーチン」の例文・使い方・用例・文例
- サブルーチンのページへのリンク