19 ポイント 投稿者 GN⁺ 2025-07-10 | 1件のコメント | WhatsAppで共有
  • プログラミングで**関数を「呼び出す」**という表現の起源は、図書館で本を「請求」したり「呼び出したり」する概念に近い
  • 初期のコンピューティングでは、サブルーチンをライブラリから召喚・呼び出す方式が主流だった傾向がある
  • 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)**が CALLRETURN 命令を導入
    • 「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件のコメント

 
GN⁺ 2025-07-10
Hacker Newsの意見
  • Grace Hopper は、call という語の元の意味(物理的な図書館で資料を整理するのに使われていた call number に由来する)が、compiler という用語の誕生にも影響を与えたと説明している。各サブルーチンには call word が与えられ、図書館で資料を取り出して組み合わせるようにプログラムを作るという発想から来ている
    • 私はこれらの用語を実際に使っている
    • 今になってようやくパズルのピースがはまった気がする。デューイ十進分類法の識別番号は call number と呼ばれていた
  • 図書館情報学は、現代コンピューティングに私たちが想像する以上の貢献をしてきたと思う。たとえばデータベースのインデックスを説明するとき、カードカタログのイメージをよく持ち出す。著者名、デューイ十進分類、主題別で探せる木製の引き出しを見せると、みんなすぐ理解する。図書館カタログの概念
    • 私は地元の図書館で木製の引き出しや紙の辞書を使ったことがある世代だ。25年前にハッシュマップや IDictionary に初めて触れたとき、このイメージのおかげですぐ感覚をつかめた。でも今ではこの比喩はそれほど役に立たない。カードカタログや辞書がどんなものだったかを説明しなければならない場面がよくあり、若い人たちは「なるほど、つまりアナログのハッシュマップなんですね」と言う
    • 数か月前まで、なぜターミナルの標準幅が 80 文字なのか不思議に思っていた。昔の PC 画面サイズのせいだと思っていたが、実際にはパンチカードが 80 文字だったからで、そのパンチカードの始まりも結局はインデックスカードだった。図書館情報学にもう一度敬意を表したくなった。自動車の幅が馬の尻 2 頭分に由来する、というようなコンピューティング史の話に近い
    • 1〜2年前、図書館の隅にあるほこりをかぶった木製の引き出しをデータベースになぞらえて説明したことがある。文脈と事前理解は本当に重要だ
    • 私はいつも、本の巻末にある索引がコンピューティング用語としての index の語源だと思っていた。index cards と結び付けたことはなかった
    • 今の若い世代はカードカタログそのものを見たことがないかもしれない。私はハードディスクが 0 と 1 の並んだリストであり、何かを探すには構造が必要だという点を推測してもらうようにしている
  • 私はフィンランド人だ。フィンランド語で「関数呼び出し」に当たる語は kutsua で、英語に逆翻訳すると invitesummon に近い。つまり「母親が庭にいる子どもを呼ぶ」ときのような「呼ぶ」の意味で使われ、「Joe が友人に電話をかける」や「この色を何と呼ぶ?」の call とは使い方が違う。共有したかっただけ
    • ドイツ語では aufrufen を使い、断片的に訳せば「呼び起こす」に近い。学校で生徒の名前を呼ぶときのように、直接目的語とともに使えば、誰かを名前や番号で呼ぶ意味になる。電話をかける語は anrufen
    • summon は、コードにオカルト的な恐怖を呼び込む感じがして、ときにはとてもふさわしい。invite も、悪魔や吸血鬼を招き入れることかもしれないと感じることがある
    • ノルウェーでは funksjonskall を使い、直訳すると function call だ。単に何かを呼ぶという意味の call である
    • ロシア語も似ていて、逆翻訳すると「電話で呼ぶ」「召喚する」「招待する」などになる
    • 直接の話題ではないが、もしヘルシンキにいるなら、現地の Hacker News ミートアップ に参加するとよい
  • Wilkes, Wheeler, Gill(1951)の本では、サブルーチン実行に call in という表現が使われている。31ページには「サブルーチンが正しく呼び出されないと機械は停止する」「どのプログラムからでも自由にサブルーチンを呼び出せる」とある。1950年の EDSAC 初期報告にも call in auxiliary sub-routine という注記が残っていることが、このプレゼンテーション で見られる
  • ときどき call より invokeexecute も使われるが、より長く一般的な語だ。ただし call という用語が誤って使われる場面(calling a commandcalling a button)を英語圏外の CS 学生からよく聞くので、少し気になる
    • invoke はラテン語の invocō, invocāre(呼び起こす)に由来するので、間違いではなく短縮表現だ
    • いちばんよく聞く(あるいは嫌いな)誤用は return と一緒に使うものだ。「いま return キーワードを呼び出すと関数が終わります」のような表現を聞いたことがある
    • C# は delegate や reflection まわりで Invoke をよく使う一方、デバッガでは Call Stack を使う
    • 私の経験では、プログラミングを学び始めたばかりのネイティブ話者も似たような用法をする。彼らは command ではないものまで command と説明する
    • 初心者が statement や関数宣言全体を逆に command と呼ぶこともよくある
  • 科学理論というほどではなく、ただの観察だ。新しい用語は、何か通じる接点があると広まりやすい。たいてい短く、意味やイメージを簡単に連想・記憶できるので、素早く定着する。ときには説明が必要でも、文脈だけで人々は覚えて広めていく。たとえば salty がそうで、call も同じだ。短くてよく使われ、call up / call in / summon / invoke(呪文のような感じ)も感覚に合っている。当時は電話も新しく不思議な技術だったので、誰かに電話をかけるイメージをサブルーチン呼び出しに重ねて自然に結び付けたのだろう。jump のような語はすでに別の意味で使われていたので、call が広く普及できたのだと思う
    • 私にとって salty は tears とはあまり関係がない。自分の言語感覚では、誰かが salty だというのは悲しいのではなく、いら立っていたり不機嫌だったりする状態だ。つまり塩のように辛く強いイメージから来る比喩だ。解釈が違っても比喩は十分通じるという点で、call もそうやって広まった可能性を示している
  • 「…複雑なものはライブラリ、つまり磁気テープのセット(以前に書かれた価値ある問題が保存されている場所)に置かれるべきだ」という文を見て、library という単語が本当にラベル付き資料棚から来ているのだとは考えたことがなかった
  • 関数に call というキーワードが本当に必要だったわけではない、と私は思ってきた。関数は通常値を返すので、代入文の中で使えばよい。call が必要だったのは subroutine(実質的には名前付きのアドレス/ラベル)だった。実際には GOTO でこのアドレスへ直接飛び、また戻ってくることもできる。CALL キーワードのおかげで実行の流れがより明確になる。社長が Sam に会計を任せ、そのあと Bill に TPS レポートの印刷を任せるような仕事の流れだ。結局すべてが関数に置き換わり、subroutine は spaghetti というあだ名で呼ばれるようになった。ところで、なぜ routine(プログラム)と subroutine という用語があるのだろう
    • routine という語の由来は、1947年の Goldstine と von Neumann の文書に「問題のコード化された一連の命令を routine と呼ぶ」と明記されている(参考
  • 音楽にも「call and response」という表現がある。return value の概念ともつながると思う
  • Algol 60 では関数だけでなくパラメータについても call という用語を使っていた。たとえば call by valuecall 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 な用語は生き残っている