背景と経緯
どうやら僕の頭の中には査読者が住んでおられるようです(※1).これは性分としか言いようがないのですが,なにがしかの文章を書いているときはほとんどかならず査読チェックが入ります.
つい今しがたも,初学者用の資料に「関数から返ってくる値のことを”出力引数”または”戻り値”という...」なんてことを何の気なしに書こうとしてしまったので,査読者から「それってほんとに同じものなの?中途半端な自分の知識だけで書こうとしてない?馬鹿なの?死ぬの?」というご指摘を受けてしまいました.もうしわけありません.
さっそく「出力引数」と「戻り値」という二つのキーワードでググってみると,「“引数”とは関数に渡す値(=私が入力引数と認識しているもの)で,“戻り値”は関数から戻ってくる値」という説明が多いように思います.たとえば,こちらのサイト.
はて,私がプログラミングをかじり始めたのはかれこれ20年も前ですが(かじり続けて20年),そのときには「出力引数」とか「入力引数」とかって言ってた気がするんだけど,あれは幻だったのかしらん...自分の記憶に一抹の不安(唐松の文様,十四松の寝袋)を覚えたので,改めて「"出力引数"」で調べてみました(結果).
なんだ,あるではないか.引っかかってきたのは,MATLABやらScilabやらFortranやらの公式っぽいドキュメントですね.「出力引数」という日本語が存在していることは確認できましたが,「出力引数」と「戻り値」の関係はさっぱりわからん.というわけで,私なりに調べてみました.
まとめ
書いているとわりと長くなってしまったので,最初にまとめておくと以下のようになります.
出力引数と戻り値はおなじというのが現時点の結論です,しかし,引数には入力・出力とかの区別があったり,仮引数・実引数とかの区別があったりして,出力引数や戻り値たちの立ち位置はちょっとあいまいです.英語のほうは,入出力および仮・実の区別がはっきりとしていて,2つの軸に沿って言葉が使い分けられてわりとわかりやすいのです(以下参照).
一方,日本語は入出力および仮・実の区別を同時に行っていないようなので,曖昧さがうまれているように思います.とりあえず,ワタシの理解を,英語における区別と対応させて表にしました.
ここで,実引数および戻り値を「入力引数」と「出力引数」にそれぞれ対応させたのは,MATLABドキュメンテーションで,input arugumentの対訳が入力引数,output argumentの対訳が出力引数になっているのを参考にしました.
そもそも,日本語で「引数」とした場合には「仮引数」なのか「実引数」なのかわかんないので,もういっそのこと
ってしちゃえばいいんじゃない?
めんどくさいですね...すみません.
しらべてみたよ
といっても,googleとwikipediaをあたってみただけなのですが.
最初の手がかりにしたのはMATLABのドキュメンテーション.なぜMATLABかっていうと,僕が日常的によく使っているってのと,ドキュメンテーションがしっかりしている(商用なので無責任なことは書きますまい)という期待からです.んで,そのドキュメンテーションには「出力引数」の英訳として「output argument」っていうんがあるわけです.たとえば,こちら(日本語)とこちら(英語)を比較.
んで,google検索して引っかかってきたwikipediaのページが"Parameter (computer programming)"というページです.Wikipediaのサイト内検索で"output argument"を探しても,トップに出てくるのはこのページ.英語でも"output argument"は駆逐されてしまったのかと不安になりながら,件のページで"outpt argument"に関する記述をさがすと...ありました.
うーん.いまいちピンとこないです."output argument"と対になる"input argument"の記述を見てみると,
An input argument (the argument to an input parameter)
とあります.ということは,アナロジーを駆使すると,
An output argument = the argument to an output parameter
と類推できますね.
じゃあ,argumentとparameterの違いってなんやねんということになりますが,同じページに書いてありました.
なんだか,英語のほうがスッキリ区別できるような気がします.上記の記事によると,
・parameter (formal argument) = "variable"
・argument (actual argument or actural parameter) = "value"
ということらしいです.paramterは特定の値がassign(=代入)される(されうる)「入れ物」,argumentはassignされる値そのものという理解です.
こうして理解すると,少なくとも英語には"value or not"と"in or out"という2つの軸がありそうです.表にするとこんな感じ.
スッキリ.
いやいや,僕が知りたかったのは日本語の「出力引数」なのでもうちょっとがんばります.上記の「parameterとargumentの違い」は日本語の「仮引数と実引数の違い」に対応しそうです.こちらでは仮引数と実引数の違いが解説されています.仮引数が"parameter"に対応し,実引数が"argument"に対応するようです.このように英語と日本語の対応を考えると,かねてからの懸案であった「出力引数」は,英語の"output argument"の対訳としてまったく問題がなさそうです.
そして,「戻り値」のほうですが,こちらでは,「関数が渡す値」となっております."output argument(出力引数)"が意味するものと同じと考えてよさそうです.
つまり,「出力引数」=「戻り値」
よかったよかった.おかえりなさい,出力引数.
これでワタシのなかの査読者にも納得してもらえる.
僕の記憶もあながち捨てたもんじゃなかったのね...
あれ???
さきほどのページでは,「引数」という言葉は「関数に渡される」という意味で解説されています.関数から戻ってくるものへの言及は避けられています.冒頭で紹介したページも同様です.じゃあ,"output parameter"に対応する日本語ってどうなってんのでしょうか?
どうしよう.どなたかご存知でしたら教えてください.
さいごに
「出力引数」問題についてはワタシの頭の中の査読者をなんとか納得させることができました.でも,朝の貴重な原稿書きの時間の全てをこの記事に費やしてしまったために,ワタシの頭の中の指導教官に「進捗はどうした?」と詰められています.
生きづらい...
脚注
※1)しょせんワタシの中の査読者なので諸々の指摘抜けが発生します.この投稿に不正確な部分があっても怒らないでくdさい.やさしく教えて.