HN 日本語サマリー

← 一覧へ戻る
プログラミング

「else」キーワードはおそらくドイツ語からの直訳である (2020年)

The 'else' keyword is probably a literal translation from German (2020) (github.com)

67 pointsby theanonymousone44 コメント

要約

この記事は、プログラミング言語における「else」というキーワードの起源を探求しています。著者は、現代の英語では「else」を接続詞として自然に使わないことから、その由来に疑問を呈しています。調査の結果、このキーワードは1958年のALGOL言語の設計段階で、ドイツ語の提案書を英語に翻訳する際に、おそらく古風なドイツ語の単語が誤って翻訳された可能性が高いと結論付けています。

全文翻訳

if-then-else.md

ビデオ


[画像: 01]

こんにちは、エリックです。一見すると馬鹿げたアイデアについてお話しします。それは、if-then-else が発明されなければならなかったということです。


[画像: 02]

if-then-else は、プログラミング言語で条件について話す方法です。何か真であれば、あることを行い、そうでなければ、別のことを行います。

それは単なる英語ですよね?ただし、そうではありません。私は「else」を通常の会話では接続詞として使用できません。コンピュータープログラムでのみ使用できます。

この else はどこから来たのでしょうか?それは謎です。プログラミング言語の歴史に関する書籍に載るには、あまりにも微細な詳細です。


[画像: 03]

調査や法的手続き、あるいはコンピューターが存在する前に書かれたアルゴリズムからは来ていないようです。「if yes」や「if no」、「if however」は見つかりますが、「else」は見つかりません。


[画像: 05]

前の計算の結果に応じて異なる命令を実行できた最初のコンピューターは、Eniac のようです。1946年に、Haskell Curry と Willa Wyatt は、関数を反転させるプログラムを記述したこのレポートを書きました。彼らは、2つの数値のうちどちらが大きいかに基づいて決定を下す機能を「discrimination(識別)」と名付けました。


[画像: 06]

Eniac には「discriminate」という命令はありませんでした。それはプラグボード上のワイヤーとダイヤルでプログラムされており、決定のための計算を行う命令の制御パネルは、それに続く命令に物理的なワイヤーで接続されていました。

すぐにコンピューターは十分なメモリを持つようになり、プログラムは配線ではなくメモリに格納できるようになりました。物理的な命令シーケンスの代わりに、数値シーケンスがありました。いくつかの特別な命令により、コンピューターはシーケンス内の別のポイントにジャンプさせることができました。


[画像: 07]

例えば、これは最初の商用コンピューターの1つからの条件付きジャンプ命令です。最後の計算結果が負かどうかをチェックしました。もしそうなら、制御フローを指定されたメモリ位置に転送しました。そうでなければ、制御は次の命令に続行されました。

これは特定の用途パターンを意図していました。例えば、タスクを10回実行したい場合、プログラムはこれまでに何回実行したかをカウントし、10を減算しました。結果が負であれば、タスクは実行されていないため、別のラウンドを実行するようにジャンプしました。


[画像: 08]

このアイデアは、Halcombe Laning と Neal Zierler の Whirlwind 用言語のような、最初の高水準プログラミング言語に引き継がれました。彼らの条件付きジャンプは同じように機能しましたが、プログラムの番号付きステップは単一の機械命令ではなく、代数式でした。


[画像: 09]

最初の人気プログラミング言語である Fortran は、計算結果が負、ゼロ、または正であるかどうかに応じて、一度に3つの場所にジャンプを指定することで、このアイデアを一般化し、「if」という名前を付けました。

3方向の「if」は、単に負かどうかをチェックするよりも強力でしたが、おそらくより混乱を招きました。なぜなら、すべての決定が制御フローの不連続性を意味し、プログラマーは通常のケースが継続し、異常なケースがジャンプするということを考えるだけでよかったからです。


[画像: 10]

Grace Murray Hopper の COBOL の前身である Flow-Matic は、数値の符号ではなく、2つの数値を比較することについて話すことで、3方向の if を少し考えやすくしました。それは、探している比較ではなかった場合のために「otherwise」という名前を導入しました。


[画像: algol]

これらのプログラミング言語はすべて、特定のメーカーの特定のコンピューターに関連付けられていました。1958年に、2つのアメリカとドイツのコンピューティング組織が、特定の機械での実装ではなく、人々が話すのに自然な、機械に依存しない標準言語を開発するための共同プロジェクトを開始しました。各グループは共同会議に草案を提出しました。


[画像: 11]

ドイツの著者は、「if」ステートメントの作成において2つの大きな概念的飛躍をしました。

1つ目は、より小さい/等しい/大きいという形式に特別な優先順位を与えるのではなく、任意のブール式で条件を制御できるようにしたことです。


[画像: 11]

2つ目の大きな飛躍は、急激な制御フローのジャンプを引き起こすのではなく、彼らの「if」ステートメントは制御フローを一時的に迂回させるだけだったことです。条件の終わりに、条件が真であったか偽であったかに関わらず、プログラムはブロックの終わりの「always」ステートメントで再開されました。唯一の違いは、補助ステートメントが実行されたかどうかでした。

画面上の例は、単一のブロック内の2つの「if」を示しており、2番目の「if」が現在の「else if」のように機能することを意図していたと考えるかもしれません。しかし、彼らは、最初の条件によって制御されるステートメントが、2番目の比較が依存する値を変更した場合でも、両方のステートメントブロックが実行される可能性があるため、すべての条件が評価されることを期待していました。


[画像: 12]

ドイツの提案に「else」に似たものがあったのは、「case」と呼ばれる、完全に異なる2番目の条件付き形式でした。現在の「case」とは異なり、彼らの「case」はブール条件を記述する別の方法であり、条件は制御するステートメントから分離されたブロックに配置されていました。より複雑な比較にはこの形式がより簡単だと考えられていたようです。

そしてここに、「else」という言葉の最初の出現があります。他のどのケースも適用されない場合のためです。


[画像: 13]

なぜ彼らはそれを「else」と呼んだのでしょうか?彼らは何も言っていません。

彼らが言っているのは、この文書は元々ドイツ語で書かれ、急いで英語に翻訳されたということです。精心に選ばれたドイツ語の単語がおそらく古風な英語の単語に翻訳され、その後再検討されなかったのだと思います。残念ながら、元のドイツ語のテキストを参照することはできません。


[画像: 14]

アメリカの提案にも、ブール式でステートメントを制御するというアイデアがありました。それは「if」というキーワードさえ持っていませんでした。代わりに、式が矢印の後に続いた場合、その式は矢印の後に続くステートメントを制御しました。

表記からは明らかではありませんが、ドイツの if ブロックとは異なり、アメリカの形式では、1つの式が真と評価された場合、それはショートサーキットして後続の式をスキップしました。これは現在の「else if」と同様です。


[画像: 15]

両組織は共同会議を開催し、彼らの提案を「International Algebraic Language」と呼ばれる単一の文書に統合しました。まもなく、この言語は Algol と改名されることになります。

統合された文書の「if」ステートメントはドイツの提案とよく似ていますが、ブロックを終了する「always」ステートメントが削除されています。代わりに、各「if」は単独で機能し、同じ式で複数のステートメントを制御したい場合は、「begin」と「end」を使用してそれらをグループ化できます。

この「if」の形式には「else」のようなものはありません。


[画像: 16]

しかし、Algol 58 には「if either」と呼ばれる2番目の条件付き形式もありました。この形式では、「or if」と言うことで、現在の「else if」と同じことを行うことができました。しかし、「else」単独で、別の「if」なしで機能するものは何もありませんでした。


[画像: 17]

翌年、Algol に関するいくつかの論文が会議で発表されたとき、物語は曖昧になります。そのうちの1つは、以前 Fortran プロジェクトを率いていた John Backus が、プログラミング言語の形式文法のアイデアを導入した論文でした。

彼が説明する Algol には「if either」という条件付き形式はありません。代わりに、「converge」というキーワードがあり、これによりブロック内のトップレベルの「if」が「else if」のように動作します。これが「if either」の改良版として意図されていたのか、それとも「if either」を支持して既に却下された古いアイデアだったのかは明らかではありません。


[画像: 18]

いずれにしても、「if either」はすぐに置き換えられることになります。1957年に MIT の John McCarthy は、今日でも存続している非常に古いプログラミング言語である LISP のプロジェクトの提案書を書いていました。彼の提案は、条件付きステートメントとは対照的に、条件付き式のアイデアを導入しました。

重要な違いは、式は常に値を持たなければならないのに対し、ステートメントはそれを制御する条件が真でない場合に実行されない可能性があるということです。

したがって、彼の「if function」は常に「otherwise」という句で終わり、他のどの条件も真と評価されなかった場合の式の値を提供します。


[画像: 20]

McCarthy の条件付き式は、Klaus Samelson に1959年末に Algol の2つの別々の条件モデルを整理して統一するよう促しました。彼は「if either」形式を完全に削除し、プレーンな「if」だけを残しましたが、対応する「if」を制御する式が偽だった場合に実行される「else」という句を追加しました。

以前の「if either」が「or if」で可能だったように、「else if」で条件を連鎖させることができましたが、どの条件も真でなかった場合に実行される最後のステートメントセットのために、「else」単独で使用することもできました。


[画像: 20]

「If-then-else」は、翌年の Algol 60 レポートに登場した単一の条件付き形式であり、ほとんどすべての後続のプログラミング言語が従った形式です。

現在では明白に思えますが、1960年の人々にとっては理解するのが困難であり、レポートは、この矢印図を含め、それがどのように機能するかを説明するために1ページ半を費やしています。


[画像: 21]

前述したように、「else」を接続詞として使用することは奇妙に聞こえます。Christopher Strachey の CPL プログラミング言語は C の祖であり、したがってほとんどの現在のプログラミング言語の祖先ですが、彼は「else」の使用を拒否し、「ignorantely incorrect English(無知で間違った英語)」と呼んでいました。彼は代わりに「test … then … or」と書くべきだと考えていましたが、これもあまり自然に聞こえず、普及しませんでした。


[画像: 22]

MAD プログラミング言語も独自の道を歩みました。それは非常に長いキーワードで知られており、「whenever」を「if」の代わりに、「otherwise」を「else」の代わりに、「or whenever」を「else if」の代わりに使っていました。

MAD マニュアルの例のインデントに注目する価値があります。ほとんどの他のプログラミング言語がこのスタイルの条件インデントを採用するまでには何年もかかりましたが、今では他の方法では考えられないほどです。


[画像: 24]

しかし、CPL と MAD が「else」という言葉を避けていた間も、彼らはその形式を維持し、語彙だけを変更しました。言語設計者は今でも完璧な for ループの書き方を探していますが、完璧な条件付き形式の探求は1959年に終わったようです。私たちに思考のためのツールと、謎解きの言葉を与えてくれた Klaus Samelson に感謝します。