手順立て型のプログラム言語では、プログラムは計算機にさせる仕事をその 順序にしたがって記述するのが原則だが、基本的に同じだが小さい部分で違う 仕事がたびたび出てくる場合には、それを「手続き」としてまとめておいた ほうが見通しがよい。さらに、多くのプログラムから呼ばれる手続きは、 あらかじめまとめてコンパイルして「ライブラリ」にしておくのが便利である。 (プログラミングの話題で「ライブラリ」と言えば、このようにコンパイル された手続きの集まりをさすのがふつうである。)
Pascalには、procedure (手続き)と function (関数)がある。 functionは値を返すものである。必ずというわけではないが、代入文の右辺に 使われることが多い。これに対してprocedureは値を返すものではなく、 その名前を書くだけで呼び出される。
procedureとfunctionのいずれも、引き数をもつことができる。 呼ぶ側と呼ばれる側の引き数の対応は、変数名と関係なく、出てきた順序で 決められる。引き数は呼ぶ側から呼ばれる側に値を渡すだけで逆に返さない のが原則だが、VARというキ−ワ−ドをつけた場合は手続きで変更された値が 返される。
Pascalの標準的文法では、procedureとfunctionのいずれも、 主プログラムの中(宣言部と実行部の間)に入れ子状に作られて いっしょにコンパイルされるものとされていて、別にコンパイルしておいた ものを呼び出す方法が決められていない。 実用的にはプログラムライブラリを使えないと不便なので、 それぞれのPascalコンパイラの拡張機能として分割コンパイルやプログラム ライブラリの利用の方法が用意されていることが多い。
Fortranでは、subroutine(サブルーチン)とfunction(関数)がある。 サブル−チンはPascalのprocedureに相当するが、呼び出すときには CALL文を使う。 Pascalと違って、メインプログラムの中に書かれるのではなく、 別のEND文で終わるプログラム単位として書かれる。サブルーチンからサブ ルーチンを呼ぶという意味での実行上の入れ子構造は可能である。
サブルーチンは引き数をもつことができる。SUBROUTINE文の引き数とCALL文の 引き数は、名前に関係なく、引き数リスト中に出て来る順序で対応づけられる。
対応する引き数の型は同じであるべきである。ただし多くのFortran処理系では このチェックをしない。特に、実数の単精度(REAL, REAL*4)と倍精度(DOUBLE PRECISION, REAL*8)の区別、配列変数と単純変数の区別などはユーザ側で注意 すること。
呼ぶ側と呼ばれる側で共有されるのは引き数とCOMMON変数というもの(説明省略) だけである。その他の変数はプログラム単位(サブルーチン、関数あるいはメイン プログラムのそれぞれ)の中でだけ有効である。
Fortranの引き数は、呼び出しのときと帰るときの両方向に値が渡される。 メインプログラムで定数であるものをサブルーチンで値を変えたりしてはいけない。
Unixで、複数のプログラム単位からなるプログラムをコンパイルする方法と しては、次のようなものがある。
INCLUDE 'ファイル名'すると、f77でいっしょにコンパイルされる。 INCLUDE文だけのファイルを作ってメインもINCLUDEしてもよい。
f77 main.f sub1.f sub2.f
f77 -c sub1.f f77 -c sub2.f f77 main.f sub1.o sub2.o
f77 main.f -lsub
makeで実行可能プログラムの作成までする。
なお、INCLUDE機能 は、このbのような使い方を目的に作られたものではなく、 複数のプログラムで共通に使う宣言文などを1か所にまとめて用意するため に作られたものである。bの方法は標準的なものではなく、プログラムの 規模がわりあい小さい場合に限った便法だと考えてほしい。
Cでは、ここで「手続き」と言っているものはすべて関数(function)と呼ぶ。 ただし、functionというキ−ワ−ドを使わず、引き数のない場合も 引き数リストをかこむカッコを使うことで関数であることを示す。 PascalのprocedureやFortranのサブル−チンのように値を返さない手続きは、 「void型」の関数として宣言する。 Cでは引き数の値は呼ぶ側から呼ばれる側に渡されるだけで返されない。 ただし、変数へのポインタを渡すという方法で、実質的に値を返すような プログラムを書くことができる。
Cでソ−スプログラムが複数のファイルにわたるものをコンパイルする方法は 上にFortranについて述べたのとほぼ同様である。 特に、dやfのようなやりかたをすることが多い。 ただし、コンパイラを呼び出すコマンドは cc である。
なお、include機能については別記事参照。