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

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

概要

  • プログラミングで使われる「関数を呼ぶ(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」ってフレーズがあって、戻り値を参照してるよね。

フィンランド人なんだけど、フィンランド語では「call」を関数の文脈で「kutsua」と訳すんだ。これを英語に戻すと「invite」や「summon」になる。だから、少なくともフィンランド語では「call」は「お母さんが子供たちを庭から呼び戻した」という文脈で使われる意味なんだよね。「Joeが友達に電話をかけた」とか「この色を何て呼ぶの?」みたいな意味じゃなくて。ちょっとシェアしたかったんだ。

関係ないけど、もしヘルシンキにいるなら、地元のHacker Newsのミートアップに参加してみてね: https://bit.ly/helsinkihn

ロシア語でも似たような感じで、逆翻訳すると「電話で呼ぶ」、「召喚する」、「招待する」ってなるよ。

ドイツ語では「aufrufen」って言葉を使うんだけど、これを部分的に訳すと「呼び出す」って意味になるんだ。コンピュータがない時代には、直接目的語と一緒に使われると「誰かを名前や番号で呼ぶ」って意味で理解されてた(例えば、先生が生徒に話すように言う時とか)。電話をかける時の動詞とは別で、「anrufen」って言うんだよ。

「召喚する」って言葉には、コードにちょっとした不気味さが含まれてる感じがして、時にはすごく合ってるよね。「招待する」って言葉も、悪魔や吸血鬼みたいな感じを暗示することができるし、これもいいね!

ノルウェーでは「ファンクションコール」と言って、直訳すると「関数呼び出し」だよ。「コール」はそのまま、何かを呼び出すって意味なんだ。

科学的な理論じゃなくて、観察なんだけど。新しい言葉は「ピンとくる」と広がるんだよね。短いことが多くて、何らかの理由で人々がメンタルコネクションを作って意味を覚えやすくなる。ウイルスみたいに人の間で急速に広がることもある。時には説明が必要なこともあるけど、文脈から理解することもある。その後、人々はそれを覚えて他の人と使うようになって、さらにその言葉が広がるんだ。最近の例で言うと「salty」。短いし、意味を表してる感じがするよね(salty -> 涙 -> 悲しい)。「call」も似たような感じかも。短いから、よく使う専門用語として言いやすいし、「呼び出す」「呼び込む」「召喚する」「魔法の呪文みたいに呼ぶ」など、いくつかの「しっくりくる」使い方がある。人々はそれを聞いて、しっくりくるから広がるんだと思う。競合する用語はあまりなかったと思うけど、「jump」みたいな既存の概念を指す言葉は使われてたはず。電話が流行ってて、魔法のような技術だったから、この時期に広まったんだろうね。誰かを呼び出せるっていうアイデアは人々の頭の中にあったから、当時のプログラマーたちは人を呼ぶこととサブルーチンを呼ぶことのメンタルコネクションを簡単に作ったんじゃないかな。

余談だけど、少なくとも私にとって「salty」は涙とは関係ないんだ。私の言葉では、誰かが「salty」って言うと、悲しいって意味じゃなくて、怒ってるとか気分を害してるってことなんだよね。比喩的には、塩(大量に使うと)味が強くて鋭いってことに関するものだと思う。(これって、比喩が何を指しているかみんなが合意しなくても成功することがあるってことを示してるかもね。「call」もそうだったかもしれないし。)

この「call」の元々の意味(物理的な図書館で本や資料を整理するために使われる「call number」から派生したもの)は、グレース・ホッパーによると「コンパイラ」の造語にも関係してるんだ。「コンパイラと呼ばれるようになった理由は、各サブルーチンに「呼び出し語」が与えられたからで、サブルーチンはライブラリにあって、ライブラリから何かを引き出すときにコンパイルするから。そんなに単純なことなんだ。」

やっとつながった… デューイ十進分類法の識別子数字は「call numbers」って呼ばれてるんだ!

彼らを呼び出すよ :]

Wilkes, Wheeler, Gill [1951] は、サブルーチンを呼び出すために「call in」というフレーズを使ってる。31ページにはこう書いてある: > … プログラマーのエラーの結果、命令Z Fが上書きされない場合、機械はすぐに停止します。これはサブルーチンが正しく呼び出されなかった場合に起こり得る。 > 閉じたサブルーチンは、プログラムのどの部分からでも呼び出すことができることに注意してください。特に、一つのサブルーチンが別のサブルーチンを呼び出すことができます。33ページのプログラムも参照してね。インターネットアーカイブには1957年版の本があるから、1951年版からこの表現が変わったかどうかは分からなかった。1950年頃のEDSACに関する読みやすい論文は見つからなかったけど、EDSACの初期の年のアーティファクトの写真がたくさんあるプレゼンテーションはこちら。1950年の「EDSAC用プログラムの準備とサブルーチンライブラリの使用に関する報告書」の数ページがあって、「補助サブルーチンを呼び出す」というコメントがあるサブルーチンリストが載ってるよ。

図書館学が現代のコンピュータに与えた影響って、私たちが思ってる以上に大きいと思う。例えば、データベースのインデックスを説明する時に、カードカタログの画像をよく持ち出すんだ。人々がインデックスカードを見て、著者で調べるための木製のケースや、デューイ十進法で調べるための別のケースがあるのを見ると、パッと理解するんだよね。 https://en.wikipedia.org/wiki/Library_catalog

地元の図書館で(本の)辞書や木製のカードカタログを使ったことがあるから、25年前にハッシュマップやIDictionaryを学んだ時、そのイメージが概念を理解するのに役立ったんだ。でも、今となってはその比喩はあまり教育的に役立たないね。何度か、カードカタログや(本の)辞書の仕組みを説明したら、「ああ、要するにアナログハッシュマップなんだね」って返されることがあったよ。

まさにその通り!これが教え方の一部だと思ってたんだ。「インデックスに投影された属性」がカードに収まるものだって。こんなに多くの人がこの仕組みについてのメンタルモデルを持ってないのに驚いてるよ。

もしもっと貢献していたとしても、現代のコンピュータに対する貢献はほんとに微々たるもんだよね。

数ヶ月前、なんでターミナルの「標準」幅が80文字なのか考えてたんだ。初期のPCの画面サイズに関係してるのかなと思ったけど、実はパンチカードが80文字幅だったからなんだよね。最初のパンチカードは基本的にインデックスカードみたいなもんだったし。図書館の人たちに感謝だね。これって、車が二頭の馬の尻の幅と同じっていうコンピュータ版の話みたいだ。

本の後ろにある索引が、コンピュータ用語の起源だと思ってたんだけど、「インデックスカード」との関係は全然考えたことなかったな!

もし図書館の「呼び出す」って意味が元々意図されてたものなら、Mauchlyの1947年の記事でも、すでによりオブジェクト指向やアクター指向の「呼びかける」意味にシフトしてるのが見えるね。

その理論の唯一の支持が「呼び出す」って意味よりも10年遅れて現れるっていうのは、大きな「もし」だね。

呼び出し側と呼ばれる側が合意しなきゃいけない唯一のことが「引数」って呼ばれるのは、いつも変だなと思ってる。