「サブルーチン」の版間の差分

削除された内容 追加された内容
Bokurama (会話 | 投稿記録)
編集の要約なし
5行目:
 
== 呼称 ==
[[プログラミング言語]]の仕様として、サブルーチンに相当する処理のまとまりを、結果として値を返すものと、処理だけを行い値を返さないものに分類・区別することがある。その場合例えば[[Pascal]]では、前者を'''関数'''({{lang-en-short|function}})、後者を'''手続き'''({{lang-en-short|procedure}})と呼んで区別する。[[プログラミング言語Fortran]]の仕様では、前者を'''関数''' (function)、後者を'''サブルーチン''' (subroutine) して呼んで区別する。[[C言語Microsoft Visual Basic]]のようにどちらかの呼び方のみでは、前者採るもの'''Functionプロシージャ'''、後者を'''Subプロシージャ'''呼んで区別する。一方、[[PascalC言語]]のようにでは両者を区別するものがあるせず、常に'''関数''' (function) と呼ぶ
 
これらの名称は慣習的なものであり、[[手続き型プログラミング]]や[[関数型プログラミング]]といったプログラミングスタイルあるいはプログラミングパラダイムの分類とは関係がない。
 
=== 関数 ===
17 ⟶ 19行目:
 
== 各種プログラミング言語におけるサブルーチン ==
{{ページ番号|section=1|date=2016年9月}}
* サブルーチンという考え方は、ことさら新しいものではない。[[アルゴリズム]]などにおいて、問題を部分問題に切分けて解くという[[分割統治法]]はコンピュータ以前からあり、コンピュータプログラミングについても、[[EDSAC]]のプログラミングについて出版された、この分野の世界最初の書籍とされる ''The Preparation of Programs for an Electronic Digital Computer''(1951)においても part one, chapter 2 がサブルーチンに関するチャプターである。
* [[Microsoft Excel|Excel]]での関数は、主に、計算をしたり、データの検索や集計をしたり、表示を変換するものである。合計値を求めるSUM関数や、平均値を求めるAVERAGE関数など、100を超えるワークシート関数が存在する。IFに似た働きをするIIFといった[[VBA]]関数もある。
* [[C言語|C]]では、値を返さないものも含め全て「関数」である。また、実行したいコードは全て何らかの関数定義の中に記述しなければならない<ref>このためか、『<span style="font-size:small;">ANSI/ISO/JIS対応</span> ANSI C/C++辞典』p.83(平林雅英、技術評論社)など、「Cは[[関数型言語]]である」としている文献があるが、誤りである。</ref>。また、歴史的な理由から、値を返さない関数を宣言および定義する場合は、関数の型(返戻値の型)を書く場所に<code>void</code>([[void (コンピュータ)|void型]])と書く<ref>標準化以前(K&R初版時代のC)は、省略した場合のデフォルトとしてintを返すと解釈される仕様だったという経緯があり、互換性を保つためにそれが標準とされたため、値を返さない場合には<code>void</code>を書いて明示しなければならない、という仕様になっている。</ref>。
* [[Pascal]]では、値を返すものは関数、値を返さないものは手続きであり、それぞれ<code>function</code>または<code>procedure</code>という[[予約語]]を使って宣言する<ref>C言語と違い、中身の記述すなわち定義まで含むものもPascalでは「宣言」と言う。</ref>。
* 古典的な[[BASIC]]では、GOSUB 命令によるサブルーチンがあった。インタプリタは GOSUB 命令を見つけると、GOSUB 命令の終わりの場所(アドレス)をインタプリタ内の[[スタック]]にプッシュして保存し、命令で指定された行に飛び、実行を続ける。その後、実行中に RETURN 命令を見つけると、スタックから先ほど保存しておいた呼び出し元の場所をポップして取り出し、そこに飛び、GOSUB 命令の次の命令から実行を再開する。サブルーチンを作成したい場合は、ユーザは「この行からこの行まではサブルーチンとする」と決めてプログラムを作成した。以上のように「RETURN できる GOTO」でしかない(引数も返り値もローカル変数もない)ため、(グローバル)変数を経由する、配列をユーザスタックとして使うなど、技巧を必要とした。比較的高機能な実装では、DEFFN 命令により、式一個で記述できる範囲という制限ながらも、引数と返り値のあるユーザ定義関数の追加(拡張)が行えるものもあった。
* [[Java]]や[[C Sharp|C#]]等、[[オブジェクト指向プログラミング|オブジェクト指向プログラミング言語]]では、[[メソッド (計算機科学)|メソッド]](特定の[[オブジェクト (プログラミング)|オブジェクト]]あるいは[[クラス (コンピュータ)|クラス]]に属するサブルーチン)として記述しなければならない(ず、どこにも属さない関数というもの(フリー関数)定義できないというものもある。
* [[LISP]]では関数と呼ばれることが多く、[[Common Lisp]]でも関数と呼ぶ。しかし[[Scheme]]の仕様では手続きという用語を使っている。なおLispにはサブルーチンを[[マクロ (コンピュータ用語)|マクロ]]で実装するという重要な手法もある。
* [[FORTRAN|Fortran]]ではサブルーチン (<code>subroutine</code>) と、値を返す(すなわち式の項になれる)関数 (<code>function</code>) を区別する。通常は副作用を持つが、[[FORTRAN#Fortran 90|Fortran 90]]以降ではPURE属性により副作用を持たないことを明示できる。
* [[Perl]]では、ユーザ定義のものはサブルーチンであるが、引数を渡すことができ、値を返すこともできる。サブルーチン内からは、渡された引数には特殊変数からアクセスし、値を返すにはreturn文<ref>http://perldoc.perl.org/perlsub.html には return statement とあるが、return 自体の解説は http://perldoc.perl.org/functions/return.html のように関数扱いになっている。</ref>を使う。
* [[Microsoft Excel]]における関数は、主に、計算をしたり、データの検索や集計をしたり、表示を変換したりするものである。合計値を求めるSUM関数や、平均値を求めるAVERAGE関数、[[条件演算子]]に相当するIF関数など、100を超える組み込みの「ワークシート関数」が存在する。一方、[[Visual Basic for Applications|VBA]]コードからのみ利用可能な「VBA関数」もある。例えばIIf関数<ref>[https://docs.microsoft.com/en-us/office/vba/language/reference/user-interface-help/iif-function IIf function (Visual Basic for Applications) | Microsoft Docs]</ref>はIF関数に似た働きをするが、ワークシート上の数式内では利用できず、VBAからのみ利用可能である。ワークシート関数およびVBA関数はいずれもユーザー定義の関数を登録して利用することもできる。
 
== 脚注 ==