世界を動かす技術を、日本語で。

フレーズの起源: なぜ私たちは関数を「呼び出す」のか?

概要

  • プログラミングで使われる「関数を呼ぶ(call)」の語源と歴史的背景の解説
  • 「call」は図書館の「call number(請求記号)」などの用語と関連
  • FORTRAN IIの「CALL」命令が普及のきっかけ
  • 1950年代後半から1960年代初頭にかけて意味や用法が変遷
  • 現代の「call」の使い方に至るまでの流れを整理

プログラミングにおける「call(呼び出す)」の語源と発展

  • プログラマーが「関数を呼ぶ(call)」と言う理由の由来
    • 友人を呼ぶ召使いを呼ぶ電話をかける などの比喩表現
    • 実際には「召喚する(calling up, summoning)」の意味合いが強い
  • 図書館用語との関係
    • call number(請求記号) は図書館で本を特定・取り出すための番号
    • 1876年のMelvil Deweyによる用語使用が初出
    • 図書館で本を「呼び出す」ことになぞらえ、プログラムでもサブルーチンを「呼び出す」と表現
  • 初期コンピュータ用語での「call」
    • 1947年のJohn W. Mauchlyの論文で「サブルーチンを呼び出す」概念が登場
    • サブルーチンの格納場所=「ライブラリ」、呼び出し=「withdrawal(取り出し)」や「call」
    • MANIAC II(1956年)のアセンブラでも、サブルーチンには「call number」が割り当てられていた
    • ただし当初は「call」は実行時動作ではなく、アセンブル時の「呼び出し」を指す
  • FORTRAN II(1958年)による「CALL」命令の普及
    • 「CALL 文」によってサブルーチン名を指定し、 制御をサブルーチンに移す
    • ここで初めて「call」という単語がプログラム命令として明確に普及
    • 「transfer of control(制御の移動)」という表現と混在
  • 1959~1961年の用語変遷
    • Sarbacher(1959年)は「call in」を実行時の制御移動と定義
    • JOVIAL(1960年)は「procedure call(手続き呼び出し)」という名詞を採用
    • Algol 60(1960年)では「procedure statement serves to invoke (call for) the execution」と表現
    • Burroughs Algebraic Compiler(1961年)で「to call a subroutine」が登場
    • 1963年には現代的な「to call X」の用法が一般化
  • まとめ
    • FORTRAN IIの「CALL」命令が決定的な普及要因
    • 「call」は元々「(図書館の本を)呼び出す」から転用
    • 1950年代後半から1960年代初頭にかけて、 assembly時の呼び出し から 実行時の制御移動 まで意味が拡張
    • 現在では「関数・サブルーチンを呼び出す」=「call a function/subroutine」が一般的用語

図書館用語との関連性

  • 「call number(請求記号)」の定義
    • 図書館の本や資料を特定・検索するための番号
    • 申請用紙やリストを使って「call for」する運用
  • プログラミングへの転用
    • サブルーチンや関数の識別子=「call number」
    • プログラムの一部として必要な時に「呼び出す」発想
    • ライブラリの中から必要な部品を「呼び出す」運用
  • 影響
    • プログラミング初期の用語設計に図書館運用の影響が色濃い

「call」命令の普及と現代用法

  • FORTRAN II以降の「CALL」命令
    • サブルーチン名を指定して 制御を移す 命令
    • 以降、多くのプログラミング言語で「call」の用語が採用
  • 用語の拡張
    • assembly時の「呼び出し」から、 実行時の制御移動 まで
    • 現在では「call」は 関数・メソッド・サブルーチンの実行 を指す標準用語
  • 「call」に関する名詞・動詞の使い分け
    • procedure call(手続き呼び出し)、call site(呼び出し箇所)
    • to call a function(関数を呼ぶ)、to call a subroutine(サブルーチンを呼ぶ)

まとめ

  • 「call」は図書館の「call number」や「呼び出し」運用から転用された用語
  • FORTRAN IIの「CALL」命令が普及の決定打
  • 1950年代後半から1960年代初頭にかけて、assembly時から実行時まで意味が拡張
  • 現代では「関数・サブルーチンを呼ぶ」ことを「call」と表現するのが定着

Hackerたちの意見

たまに「invoke」や「execute」って言うのも聞くけど、こっちはちょっと長いし、一般的な表現だよね。ちなみに、「call」を変な使い方するのが気になるんだけど(「コマンドを呼び出す」とか「ボタンを呼び出す」とか)、ESLのCS学生がよく使うフレーズの中で一番イライラするやつだな。

strange misuses of "call" 一番好き(嫌い?)なのは、「return」と一緒に「call」を使うことかな。何度か聞いたことあるけど、「returnキーワードを呼び出すと、関数が終わる」って。

実際、初心者が「コマンド」って言って、ステートメント(あるいは関数の宣言全体)を指すことがよくあるのを見かける。

C#はデリゲートやリフレクションメソッドみたいなものに「Invoke」を使うのが好きみたい。その後、デバッガービューでは「Call Stack」って使ってるね。

「Invoke」はラテン語のinvocō、invocāreから来てて、「呼びかける」って意味なんだ。これは誤用とは思わなくて、むしろ短縮形だと思う。

今や「ボタンをタップするかクリックする」ってのが一般的だから、次の世代が「コール」って使うのもアリかもね。何でもいいけど、「兄弟、ボタンだよ」みたいなのはやめてほしいな。

古いノキアだと、リンクをフォローするにはコールボタンを押すんだよね。

ちなみに、「コール」の奇妙な誤用(「コマンドをコールする」、「ボタンをコールする」)は、ESLのCS学生がよく使うイライラするフレーズの一つだと思う。自分の経験から言うと、プログラミング初心者のネイティブスピーカーもこれをやることがある。彼らは、実際にはそうじゃないのに、いろんなものを「コマンド」と呼ぶんだよね。

... でも、複雑なものはライブラリに入ってるべきだと思う — つまり、以前にコーディングされた価値のある問題が保存されている磁気テープのセットだね。奇妙なことに、今までライブラリって物理的にラベルが付いて整理されたテープの棚から来てるとは思わなかった。

ライブラリが他の名前で呼ばれるのは聞いたことないな。例えば、一般的なファイル拡張子の.libを見てみて。

https://youtu.be/DjhRRj6WYcs?t=338 で、EDSACの元々のリンカー、マーガレット・ハートリーが紙テープの引き出しからライブラリのサブルーチンを取り出すシーンが見られるよ。(でも、もちろん全体を見た方がいいよ!)

音楽の中にも「call and response」ってフレーズがあって、戻り値を参照してるよね。

Hacker Newsで議論の続きを見る