制御構造
サブルーチンには、手続き、ルーチン、プロシージャ、関数(特に値を返す場合)、メソッド(特に何らかのクラスに属する場合)など様々な名称がある。
1950年代、コンピュータのメモリは非常に小さかったため、サブルーチンの第一の目的はプログラムのサイズを削減することにあった。サブルーチンとして書かれたコードをプログラム内のあちこちから使用することでプログラム全体のコードサイズを削減したのである。現在ではサブルーチンはプログラムを構造化するために使われる。すなわち、特定のアルゴリズムを分離したり、特定のデータにアクセスするメソッドを隠蔽したりする。多数のプログラマが共同でプログラム開発をする場合、サブルーチンはある種のモジュール性を提供し、仕事の分割点の役割も果たす。
サブルーチンに引数があればさらに便利になる。多くのプログラミング言語には平方根を求めるサブルーチンが組み込まれており、引数として平方根を求めたい数を与えることができる。
C言語の for 文や Common Lisp の do のような汎用性の高い繰り返し要素を使えば、前述の各種ループもその他のループも実現できる。例えば、複数のコレクションを並列に回したりできる。もっとも、個別のループ構造がある場合、そちらを使った方がコードの目的をより明確に表現できるとも言える。
制御構造(せいぎょこうぞう)は、コンピュータ・プログラミング言語、特に手続き型プログラミングや命令型プログラミングにおいて、ループや飛び越しなどといった、手続き(プロシージャ)中の実行順を順次実行から変化させたり、サブルーチン呼出しやその戻り、などといった制御を行う「文 」などの構造(言語の構成要素)である。
制御構造の種類は言語によって様々だが、典型的には以下のようなものがある(用語「ブロック」については、ブロック の記事を参照)。
無条件に実行箇所を移動する(無条件の分岐命令、ジャンプ)
何らかの条件の成立・不成立に従い、ブロックの実行・不実行を選択する(条件付き分岐命令、選択)
ブロックを繰り返し実行する(ループ)
ジャンプの一種だが、その続きに戻れるもの(サブルーチン呼出、コルーチン)
継続(特にcall/cc)
プログラムの停止(理論的には重要だが(停止性問題を参照)、実際的にはexitシステムコールなど、OSのプロセス制御機構を使うことが専らであり、言語機能として制御構造で持つ意味は無い)
割り込みとシグナルは制御フローを変化させる別の機構であり、サブルーチンに似ているが、通常は言語内からではなく外部のイベントなどの結果として非同期に発生するものである(言語内から外部のイベントを引き起こし、結果として発生させることもできる例もある。たとえば、ゼロ除算などでそのようになるシステムがある)。自己書き換えコードも副作用によって制御フローを変化させることができる。