- プログラミングで**関数を「呼び出す」**という表現の起源は、図書館で本を「請求」したり「呼び出したり」する概念に近い
- 初期のコンピューティングでは、サブルーチンをライブラリから召喚・呼び出す方式が主流だった傾向がある
- Fortran IIが**
CALL命令**を導入したことで、「関数を call する」という表現が急速に広まった
- その後、Algol や JOVIAL などの言語もこれを取り入れ、「call」という名詞を使うようになった
- 「call」の意味は、実行時の制御の移譲の前・最中・後へと徐々に広がり、定着した
なぜプログラマは関数を「呼び出す(call)」と言うのか?
- StackExchange で、「関数を呼び出す(call)」という表現の起源について質問があった
- さまざまな比喩はあるが、実際には**「call」が召喚する、呼び寄せる**という意味から来ている
- 図書館で本を「請求」するように、サブルーチンを「請求」して使うことから始まった
- 「call number」は図書館で本の場所を示す標識である
図書館用語としての「call」の歴史
- OED によれば、Melvil Dewey が 1876 年に図書館学の用語として「call number」を初めて使用した
- 「call number」は、本の所在や請求依頼に使われる表記である
- 1888 年の Library Journal でも、「call blank」「call slip」「call number」などの用語が日常的に使われていた
- Joudrey & Taylor の解説によれば、「call number」は閉架書庫で資料を呼び出す行為に由来する名称である
- Cutter number のような体系は分類のために導入された
コンピュータサイエンスにおける「call」の初期用例
- John W. Mauchly の 1947 年の論文では、サブルーチンライブラリからサブルーチンを「called in」して使う事例が登場する
- 記録された番号で素早く参照して使うという文脈である
- **MANIAC II のアセンブリルーチン(1956)**でも、各サブルーチンに「call number」を与え、それによって必要時に呼び出すという概念が適用されていた
- 実際のアセンブリ言語では「transfer control」と呼んでいた
- この時期には、実行時の「呼び出し」よりも、コンパイルやリンクの時点でコード片を呼び込む概念が強調されていた
プログラミング言語における「CALL」命令の登場
- **Fortran II(1958)**が
CALL と RETURN 命令を導入
- 「call for」という動作でサブルーチンへ実行制御を渡す
CALL 命令が、実際に「呼び出す」という構文上の行為を指していた
- 次第に、実行時に「control を transfer」することと、リンク/アセンブル時点での「呼び出し」行為があいまいに混ざり始めた
1960 年代における「call」の意味の拡張と定着
- **Sarbacher(1959)**の辞書では、「call in」をメインルーチンからサブルーチンへの制御移動と定義している
- 「call number」や「call word」によって、識別子や呼び出しコードまで説明している
- **JOVIAL(1960)**では、「procedure call」「calls」などが正式に名詞として使われている
- その後、呼び出し地点(site)、引数(argument)、パラメータなど多層的な意味とともに使われるようになった
- **Algol(1959〜1960)**も、「procedure call」「called procedure」「during the call」など、呼び出しの時点を多様に表現している
- Peter Naur の Algol 60 レポートでも、「call for」と「during the call」という時間的な意味の区別が現れる
- **Burroughs Algebraic Compiler(1961)**では、動詞形の「to call」が明確に初めて現れる
- **Corbató ら(1963)**以降、現代的な用法である「to call a subroutine」が一般化した
結論
- Fortran II の
CALL X 命令が、関数/サブルーチン呼び出しに「call」という表現を根付かせた
- それ以前の図書館的な概念(番号で呼び出す)に着想を得ていたが、プログラミング言語の中で新たな意味へと拡張された
- その後、Algol、JOVIAL などさまざまな言語が「call」「call site」などの用語を受け入れた
- 1961 年ごろから、「to call X」という表現が公式なプログラム文書やコミュニティで定着し始めた
- 今日では関数呼び出しは、一時的に制御を渡し、結果を受け取って復帰する一連の作業全体を指し、「call」がその標準用語になっている
1件のコメント
Hacker Newsの意見
callという語の元の意味(物理的な図書館で資料を整理するのに使われていた call number に由来する)が、compilerという用語の誕生にも影響を与えたと説明している。各サブルーチンにはcall wordが与えられ、図書館で資料を取り出して組み合わせるようにプログラムを作るという発想から来ているcall numberと呼ばれていたindexの語源だと思っていた。index cardsと結び付けたことはなかったkutsuaで、英語に逆翻訳するとinviteやsummonに近い。つまり「母親が庭にいる子どもを呼ぶ」ときのような「呼ぶ」の意味で使われ、「Joe が友人に電話をかける」や「この色を何と呼ぶ?」のcallとは使い方が違う。共有したかっただけaufrufenを使い、断片的に訳せば「呼び起こす」に近い。学校で生徒の名前を呼ぶときのように、直接目的語とともに使えば、誰かを名前や番号で呼ぶ意味になる。電話をかける語はanrufenだsummonは、コードにオカルト的な恐怖を呼び込む感じがして、ときにはとてもふさわしい。inviteも、悪魔や吸血鬼を招き入れることかもしれないと感じることがあるfunksjonskallを使い、直訳すると function call だ。単に何かを呼ぶという意味の call であるcall inという表現が使われている。31ページには「サブルーチンが正しく呼び出されないと機械は停止する」「どのプログラムからでも自由にサブルーチンを呼び出せる」とある。1950年の EDSAC 初期報告にもcall in auxiliary sub-routineという注記が残っていることが、このプレゼンテーション で見られるcallよりinvokeやexecuteも使われるが、より長く一般的な語だ。ただしcallという用語が誤って使われる場面(calling a command、calling a button)を英語圏外の CS 学生からよく聞くので、少し気になるinvokeはラテン語の invocō, invocāre(呼び起こす)に由来するので、間違いではなく短縮表現だreturnと一緒に使うものだ。「いまreturnキーワードを呼び出すと関数が終わります」のような表現を聞いたことがあるInvokeをよく使う一方、デバッガではCall Stackを使うcommandと説明するcommandと呼ぶこともよくあるsaltyがそうで、callも同じだ。短くてよく使われ、call up / call in / summon / invoke(呪文のような感じ)も感覚に合っている。当時は電話も新しく不思議な技術だったので、誰かに電話をかけるイメージをサブルーチン呼び出しに重ねて自然に結び付けたのだろう。jumpのような語はすでに別の意味で使われていたので、callが広く普及できたのだと思うsaltyは tears とはあまり関係がない。自分の言語感覚では、誰かがsaltyだというのは悲しいのではなく、いら立っていたり不機嫌だったりする状態だ。つまり塩のように辛く強いイメージから来る比喩だ。解釈が違っても比喩は十分通じるという点で、callもそうやって広まった可能性を示している.libファイル拡張子だcallというキーワードが本当に必要だったわけではない、と私は思ってきた。関数は通常値を返すので、代入文の中で使えばよい。callが必要だったのは subroutine(実質的には名前付きのアドレス/ラベル)だった。実際には GOTO でこのアドレスへ直接飛び、また戻ってくることもできる。CALL キーワードのおかげで実行の流れがより明確になる。社長が Sam に会計を任せ、そのあと Bill に TPS レポートの印刷を任せるような仕事の流れだ。結局すべてが関数に置き換わり、subroutine はspaghettiというあだ名で呼ばれるようになった。ところで、なぜ routine(プログラム)と subroutine という用語があるのだろうcallという用語を使っていた。たとえばcall by value、call by nameなどで、4.7.5.3 には「call by value の場合」という構文が出てくる。今日では procedure / function / subroutine は「call」し、argument / parameter は「pass」すると言うので、pass by value/reference/nameのほうが明確だ。しかしcall by valueなどの古い用語も、いまなお一部の文脈では残っている。argument や parameter を call するという概念自体は消えたが、こうした legacy な用語は生き残っている