first-class function

nanasi さんのコメントで, first-class function という言葉が出てきて,
知らなかったので調べてみた記録.
英語版 wikipedia の内容をエキサイト翻訳とか使いながら, 訳してみた.

http://en.wikipedia.org/wiki/First-class_function

貼ろうかどうか迷ったけど,
いつもヒドイ訳の Emacs NEWS を貼っつけてんだからということで, エントリにする.
英語は, 全然得意では無いので, 間違って部分もあると思われ.


コンピュータサイエンスでは, プログラミング言語は, first-class object と
して, 関数を扱うならば, first-class function をサポートすると言われる.
特に, これは, 関数がプログラムの実行中に作られ, データ構造に蓄えられ,
その他の関数への引数として渡され, その他の関数の値として返され得ること
を意味する.


これらの機能は, functional programming スタイルでは必要である. (例えば,)
higher-order function の使用は, その場合では, 標準的技法である.
higer-ordered function の簡単な例は, map や mapcar 関数です. それらは,
その引数として関数やリストを取り, リストのお互いのメンバーにその関数を
適用することにより, 形成されたリストを返します. 言語が map をサポートす
るには, 引数として関数を渡せることをサポートしなければなりません.


引数として関数を渡せることや結果として関数を返せることにある実装の困難
さがあります. 「function argment」から名付けられ, funarg problem と呼
ばれました. プログラムが実行時に関数を作成することができるとき, 異なっ
た問題が起こります. プログラムがコンパイルされるならば, 実行環境自体が,
コンパイラを含んでいることを意味します.

Availability

Lisp, ML, Hasckell のように first-class function をサポートする全ては,
functional programming と強く結びつけられた言語です. first-class
function をサポートするその他の言語はまた, Io, Python,
ECMAScript(Javascript), Lua, Ruby, Nemerle, Scala を含みます. また,
Perl も first-class function をサポートします. (リファレンスを使用する
ことで, 渡される.)


現代の, ネイティブコンパイルプログラミング言語は, コンパイル時に静的に
定義された関数をサポートします. それらのほとんど, C や Pascal は, さら
に, データ構造に蓄えられ, 引数としてその他の関数に渡され得る, 関数ポイ
ンタをサポートします. にもかかわらず, first-class function をサポートし
ていると考えられません. 一般に, 関数は, プログラムの実行中に動的に作成
され得ないためです. 最も近い類似物は, just-in-time コンパイラにより作成
された動的にコンパイルされた関数でしょう. それは, メモリに機械語命令の
列としてコンパイルされ, 次に関数ポインタにキャストされます. しかしなが
ら, この技術は, 基本的なハードウェア構造に特定であり, それゆえに, 一般
的でもなければ, ポータブルでもありません. C++ プログラミング言語は, ()
オペレータを含むことで, ユーザ定義のオペレータをサポートします. そのオ
ペレータは, 関数として first-class object を扱わせます. これらのオブジェ
クトは, C++ におけるその他の first-class オブジェクトを操作することがで
きますが, そのような操作は, 実行時に関数自身を変更することを含んでいま
せん. また, 本当の Lambda は, 最後の C++ 標準における言語サポートであり
ません. (C++0x ではあるかもしれませんが.)


こんな感じ.
functional programming は, 関数プログラミングでも良かったかも.
higer-ordered functional は, 高階関数でも良かったかも.
まあいいや.
なんとなくどういうものか分かった.
それにしても, 英語版の Wikipedia は, 充実してるなあ.
また, 別の記事でも時間かけて訳して読んでみるかなあ.

更新時刻

2007年, 3月15日, 23:25