重複の可能性:
「関数」と「手順」の違いは何ですか?
この質問に対する答えをオンラインで検索したところ、関数は値を返したり、値を変更したりできますが、サブルーチンはできないという答えが得られました。しかし、私はこの説明に満足しておらず、違いは用語の問題以上のものであるべきだと私には思えます.
だから私は質問に対するより概念的な答えを探しています。
重複の可能性:
「関数」と「手順」の違いは何ですか?
この質問に対する答えをオンラインで検索したところ、関数は値を返したり、値を変更したりできますが、サブルーチンはできないという答えが得られました。しかし、私はこの説明に満足しておらず、違いは用語の問題以上のものであるべきだと私には思えます.
だから私は質問に対するより概念的な答えを探しています。
関数は、1つ以上の入力から値へのマッピングである関数の数学的定義を反映しています。1
サブルーチンは、明確なエントリポイントとエグジットポイントを持つコードのチャンクの汎用用語です。
ただし、これらの用語の正確な意味は、コンテキストごとに異なります。
プログラミング言語における関数の一般的な定義は、0 個以上の入力値を受け入れ、0 個または 1 個の出力値を返すコードの一部です。
サブルーチンの最も一般的な定義は、何も返さず、通常は何も受け入れない関数です。これは、名前が付けられた単なるコードです。
実際、ほとんどの言語では、関数の宣言方法に違いはありません。したがって、サブルーチンは関数と呼ばれることがありますが、関数は必ずしもサブルーチンと呼ばれることはありません。
また、関数とサブルーチンを別の名前で同じものと見なす人もいます。
@Oliの回答への補遺として、関数は数学的な意味で「明確に定義」されている必要があることに注意してください。つまり、出力は入力によって一意に決定されますが、プログラミング言語ではそうではありません。
これを保証する (そしてその関数が副作用を引き起こさない) ものは、 純粋関数型言語 と呼ばれ、 Haskellがその例です。それらには、関数の動作が証明可能であるという利点があります (とりわけ)。これは、関数が外部状態に依存している場合や、副作用がある場合は一般的に不可能です。
関数は何らかの値を返す必要があり、グローバル変数または関数本体の外部で宣言された変数を変更してはなりません。この状況では、関数はその数学的対応部分 (数学的オブジェクトを別の数学的オブジェクトにマップするもの) のみを模倣できます。
サブルーチンは何も返さず、グローバルな状態または変数を変更する必要があるため、通常は不純です。それ以外の場合は、それを呼び出す意味がありません。サブルーチンに数学的な類似点はありません。