わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

関数とは

昨日は,情報処理科目の「C」に関する授業の最終回でした.次回からはVBAです.
5つのクラスで学習内容を統一するため,授業当日まで,スライドや使用するサンプルプログラム,また発展課題の動作確認コードを教員間でチェックしています.
それで,前日に行われた意見交換の一つに,「関数とは何かを,書くべきか否か」というのがありました.
そのときの資料案は,関数とは何かを明記することなく,それまでmain関数を書いたり,printfなどを使用したりしてきたのが「関数」で,時間をとって,定義の仕方や呼び出し方を学びましょうという,というスタンスだったのでした.*1
メールで返答をするにあたり,手持ちの書籍で「関数とは」がどのように書かれているか,調査しました.出版年の新しいものから順に,並べてみます.

  • 林晴比古『C言語クイック入門&リファレンス』(2010)

(p.116)
Cプログラムは関数の寄せ集めとして構成されます。実行文はすべて、どれかの関数にふくまれていなければなりません。

  • 川俣晶『C言語教科書(入門編)』(2009)

(p.167, 12章の章題)
関数はソースコードから重複を取り除くための重要な機能です。
(p.169)
このような手間は避けられるものなら避けたいものです。
そのためのさまざまな手段が、どのプログラミング言語にも用意されています。Cでは、関数(function)と呼ぶ機能を使うことができます。関数はすでにライブラリ関数とmain関数を使ったことがあるので、お馴染みでしょう。

(p.180)
関数とは何か
これまでのレッスンで,私たちは関数atoiや関数printfや関数randを使ってきました。特に関数printfには本当にお世話になっていますね。これらはC言語関数と呼ばれています。
(p.181)
C言語の関数を簡単に説明すると「0個以上の引数をもち,0個か1個の戻り値をもち,まとまった仕事を行うプログラムの一部分」となるでしょう。よろしいですね。

  • 村山公保『Cプログラミング入門以前』(2006)

(p.272)
9.1.1 数学の関数のおさらい
C言語の関数を学ぶ前に、数学の関数を理解していることはとても大切です。Cの関数は数学の関数に似ている面があるからです。でも、違う面も多いので注意しなければなりません。この項での説明は、厳密な数学の話ではなく、Cを学ぶための話だと思って読み進めてください。
数学の関数は次のような意味があります。
yはxによってただ1つの値が定まるとき、yはxの関数と呼ぶ。
(p.273)
9.1.2 Cの関数
Cの関数も数学と似ています。階乗のプログラムではfactorialという関数が使われていました。

x = factorial(n);

これはfactorialという関数に引数nの値を渡し、factorial関数に書かれたプログラムにしたがって演算処理を行い、処理結果をxに代入するという意味です。関数から返される値を「戻り値」と言います。Cの関数は、「引数」を与えると、「処理」をして、「戻り値」を返してくれます。

  • 林晴比古『新・C言語入門 シニア編』(2004)

(p.198)
Cプログラムは関数の寄せ集めとして構成されます。実行文はすべて、どれかの関数に含まれていなければなりません。

(p.114, 6-1 関数とは)
main関数
これまで示した全てのプログラムは,Fig.6-1に示す形をしています。水色部分は『おまじない』であり,「それ以外の部分のみを自分でプログラミングする」という方針にもとづいてきました。
図中,赤で示した部分をmain関数(main function)と呼びます。原則として,C言語のプログラムには,ただ一つのmain関数が必要です。
プログラムの実行時は,main関数の本体部が実行されます。したがって,C言語プログラミングは「とにかくmain関数を作ること」から始まるのです。

  • 内田智史ら『C言語によるプログラミング スーパーリファレンス編』(2000)

(p.346)
C言語のプログラムは一般に多くの関数(function)から構成されます。(略)

  • 山本喜則, 松井洋子『情報処理のための例解Cプログラミング』(1996)

(p.98)
■関数とは
プログラムを作成する場合、プログラム中で何度も使う処理または計算の部分は、主プログラムとは切り離して独立させて、一つのプログラムの部品として利用できるような形にしておいた方が便利である。C言語では、この部品としての形を関数と呼ぶ。C言語のプログラムは関数の集まりとして構成され、この関数一つ一つが大きな実行単位となっている。

(p.82)
大きな計算処理を小さな仕事に分割し,最初ゼロから始める代わりに他人の作成したものを組み合わせてプログラムをつくるには関数を使うのがよい。関数をうまくつくれば,知る必要のないプログラムの各部の操作の詳細を隠すことができるし,全体を明確化し,プログラム変更を容易にすることもできる。
Cは,関数を効率よく,使いやすくするように設計されている。Cのプログラムは多数の小さな関数から構成されるのが普通で,数個の大きな関数からなることは少ない。プログラムは,便利さに応じて,一つあるいはそれ以上のソース・ファイル上に置いてよい。ソース・ファイルは別々にコンパイルでき,すでにコンパイル済みの関数と共にひとまとめにしてロードできる。これ以上のことは各システムによって異なるのでここでは論じない。

  • Kernighan, B. W. and Ritchie, D.: C Programming Language (1988).

(p.67)
Functions break large computing tasks into smaller ones, and enable people to build on what others have done instead of starting over from scratch. Appropriate functions hide details of operation from parts of the program that don't need to know about them, thus clarifying the whole, and easing the pain of making changes.
C has been designed to make functions efficient and easy to use; C programs generally consist of many small functions rather than a few big ones. A program may reside in one or more source files. Source files may be compiled separately and loaded together, along with previously compiled functions from libraries. We will not go into that process here, however, since the details vary from system to system.

ここまでの書籍の詳細を:

C言語教科書(入門編)

C言語教科書(入門編)

新版C言語プログラミングレッスン 入門編

新版C言語プログラミングレッスン 入門編

Cプログラミング入門以前

Cプログラミング入門以前

新・C言語入門 シニア編 (C言語実用マスターシリーズ)

新・C言語入門 シニア編 (C言語実用マスターシリーズ)

新版 明解C言語 入門編

新版 明解C言語 入門編

C言語によるプログラミング―スーパーリファレンス編

C言語によるプログラミング―スーパーリファレンス編

情報処理のための例解Cプログラミング

情報処理のための例解Cプログラミング

プログラミング言語C 第2版 ANSI規格準拠

プログラミング言語C 第2版 ANSI規格準拠

C Programming Language (Prentice Hall Software)

C Programming Language (Prentice Hall Software)

*2

Webの英語情報から,ひとつ:

  • Burgess, M: C Programming Tutorial (K&R version 4) (1987).

(http://www.iu.hio.no/~mark/CTutorial/CTutorial.html#Functions)
A function is a module or block of program code which deals with a particular task. (snip)

これらから,明快な結論を出すのは難しいのですが,「関数とは」で説明しているとは限らず,むしろ,これまで使ってきた関数を,ここできちんと学びましょうというスタンスのほうが多いことは,挙げておいても差し支えないと思っています.
また,林晴比古氏の2冊の本のほか,自分がCプログラミングの授業を担当し始めたころから依拠していた『スーパーリファレンス編』に見られる,「Cのプログラムは関数の集まり」は,K&Rの"C programs generally consist of many small functions"が元ネタなのを知ることもできました.
ところで「寄せ集め」という表現も,興味深いものです.思い浮かぶ英単語はcollectionですが,K&Rにはこの語は見当たりません.
「寄せ集め」あるいはcollectionの何が興味深いのかというと,その書き方によって,関数1つ1つが対等であるように見えるのです.言い換えると,関数の中で関数を定義すること,すなわち入れ子関数が,認められない*3ことを示唆しています.
前の授業では,for文の中にfor文を書いたり,反復の中に分岐やその逆などによって,制御文を組み合わせて(中に入れるなどして)書くことができると,解説していました.
授業担当者どうしの協議の結果,関数を説明する最初のスライドに「Cプログラムは関数の集まりとして構成される」を書き,関数の定義の中で他の関数を定義しないよというのは,口頭で伝えました.関数について「写像(入力と出力が対応づけられたもの)」や「手続き(一連の処理をまとめて,名前をつける)」といった見方は,別のスライドにしました.

(最終更新:2015-11-24 朝)

*1:演算子」も同様です.「配列とは何か」は,予習の課題とし,授業中に解説しました.「変数」は,「変数とは」と題するスライドを作っていたものの,定義になっていない書き方でした.

*2:Amazonの著者表記に間違いがあります.書影で見ることのできる人名が正しいです.「デニス・カーニハン」って誰やねん.

*3:入れ子関数を含め,GCCにおける「ANSIの標準Cにはない特徴的な言語機能」は,http://www.asahi-net.or.jp/~wg5k-ickw/html/online/gcc-2.95.2/gcc_4.htmlに詳しく書かれています.