「プログラミング言語の歴史を会話方式で振り返る」を横目で見ながらの会話


この記事は，以下の記事を見ながら書いた。
[プログラミング言語の歴史を会話方式で振り返る - Qiita](https://qiita.com/fisherman3110se/items/36ed9a604e2f0d12c759)
いろいろな言語が挙げられているが，「あの言語も書けばいいのに」というのは誰でも思いつくだろう。しかし，それを言い出すとキリが無いので別記事にした。

作風およびキャラクターは @Yametaro さんによる一連の記事を直接真似ている（許してや〜）。
登場人物は以下のとおり

* やめ太郎：最近どっかの会社に転職したおじさんプログラマー。
* ルビ子：やめ太郎が勤める会社の社長の娘。物マニア（決して monomania＝偏執狂 ではない）というか**オブジェ嗜好**な女子。

なお，筆者はこの記事に出てくる三つの言語はどれも知らん。ツッコミ歓迎やで。

# プロローグ

やめ太郎「つまりこの記事は**パクリ**言うことやな」
筆者「パクリとは人聞きが悪いな，**オマージュ**やがな」
ルビ子「うち，めっちゃ好き！　人形焼も<ruby>最<rt>も</rt>中<rt>なか</rt></ruby>も！」
やめ太郎「それは**おまんじゅう**や！」

やめ太郎「ぼちぼち始めよか」
ルビ子「うち，**C#** と同い年やねん」
やめ太郎「えっ，[**シーシャ**](https://ja.wikipedia.org/wiki/%E6%B0%B4%E3%82%BF%E3%83%90%E3%82%B3)？」
ルビ子「水タバコとちゃうわ！」


# SNOBOL

ルビ子「ちょっとマイナーなとこで **SNOBOL** とか」
やめ太郎「ワイ南国生まれやらウインタースポーツはちょっとなあ」
ルビ子「**スノーボード**ちゃうわっ！　SNOBOL やっ！」
やめ太郎「登場が 1962 年か，古いな」
ルビ子「うち，生まれてへんし」

やめ太郎「なんで SNOBOL なん？」
ルビ子「連想配列ってあるやん」
やめ太郎「Ruby では**ハシシ**いうんやろ？」
ルビ子「大麻吸ってどないすんねん！　ハッシュやっ！」
やめ太郎「せやなー」
ルビ子「あれのルーツが SNOBOL らしいねん」
やめ太郎「ほな，今のほとんどの言語に影響しとるやん」
ルビ子「そやねん」
やめ太郎「すごいな」
ルビ子「組込みで連想配列を持ったんは SNOBOL4 が最初らしいわ」
やめ太郎「へー」

# Occam

ルビ子「次，**Occam** いこか」
やめ太郎「知らんから**ほっかむり**するで」
ルビ子「スルーしたるわ」
やめ太郎「で，なんで Occam なん？」

ルビ子「Occam は**トランスピューター**っていう並列コンピューティング用のマイクロプロセッサーのために開発された言語やねんて」
やめ太郎「え？　ルビ子ちゃん，[**ぴゅう太**](https://ja.wikipedia.org/wiki/%E3%81%B4%E3%82%85%E3%81%86%E5%A4%AA) 知っとるんか，懐かしいなあ」
ルビ子「そうそう，日本語 BASIC で `モシ 〜 ナラバ` ……ってちゃうわっ！」
やめ太郎「まあどっちも 1980 年代前半に登場したんやけどな」
ルビ子「分かっとってボケたんかい！」
やめ太郎「てゆーか，ホンマにぴゅう太を知っとったとは」
ルビ子「Wikipedia で見ただけやで〜」

やめ太郎「そういえばワイの知り合いでもトランスピューターで数値計算しとった奴がおったような」
ルビ子「今の GPU やらマルチコアなんかより遥か昔にこんな時代があったんやで」
やめ太郎「スゴイなホンマ」

ルビ子「Occam は実用的な並列計算機用言語として先駆的やったんやね」
やめ太郎「言語の特徴とかは？」
ルビ子「Wikipedia からのコピペやけど，直列に計算してほしいところはこう」

```occam
SEQ
   x := x + 1
   y := x * x
```

ルビ子「並列に計算してほしいところはこう」

```occam
PAR
   x := x + 1
   y := y * 2
```

やめ太郎「インデントが気になるな〜」
ルビ子「そう，Occam は階層構造をインデントで表すわけ」
やめ太郎「分かった！　そういうのを，アレ，ええと，ユーミンの曲で『何をゴールにするねん』みたいな」
ルビ子「それは『[**ノーサイド**](https://ja.wikipedia.org/wiki/%E3%83%8E%E3%83%BC%E3%82%B5%E3%82%A4%E3%83%89_(%E6%9B%B2))』やろ！　インデントで階層を表すんは**オフサイドルール**や！」
やめ太郎「オフサイドルールと言えば**バイソン**やな」
ルビ子「なんでアメリカの牛やねん！　**Python** やろ！」
やめ太郎「え？　ドイツの掃除機ちゃうんか」
ルビ子「それは Dyson やっちゅーねん！」
やめ太郎「その Python のイメージが強いから 1990 年代かと思った」
ルビ子「オフサイドルール自体は Occam よりもっと前，1960 年代からあるらしいで」
やめ太郎「へー」

# CLU

やめ太郎「CLU って登場が 1974 年か，聞いたこともないわ」
ルビ子「あんまり使われへんかったみたいやね」
やめ太郎「誰が考えたん？」
ルビ子「[バーバラ・リスコフ](https://ja.wikipedia.org/wiki/%E3%83%90%E3%83%BC%E3%83%90%E3%83%A9%E3%83%BB%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95) と学生ら」
やめ太郎「リスコフって，あの？」
ルビ子「そう，『[リスコフの置換原則](https://ja.wikipedia.org/wiki/%E3%83%AA%E3%82%B9%E3%82%B3%E3%83%95%E3%81%AE%E7%BD%AE%E6%8F%9B%E5%8E%9F%E5%89%87)』の人」
やめ太郎「へー」
ルビ子「この人，めちゃめちゃスゴイわ」

やめ太郎「で，なんで CLU みたいなマイナーな言語を取り上げるんや？」
ルビ子「今のいろんな言語にかなり影響を与えてるみたいやねん」
やめ太郎「たとえば？」
ルビ子「**抽象データ型**いう概念を導入して，のちのオブジェクト指向に先駆けたみたい（知らんけど）」
やめ太郎「オブジェクト指向のルーツの一つなんか〜っ」
ルビ子「関数が多値を返したり，複数の変数に多重代入したり，も CLU が先駆やって」
やめ太郎「Ruby とか多重代入あるもんな」
ルビ子「Ruby のは配列を介してて CLU のとは若干違うけど」
やめ太郎「さよか」

ルビ子「Ruby にはもっと決定的な影響を与えてんねん」
やめ太郎「どんな？」
ルビ子「もう，これこそが Ruby の特長！みたいな」
やめ太郎「というと？」
ルビ子「ブロック付きメソッド呼び出し」
やめ太郎「確かにそれのおかげでコードが簡潔に書けるもんな（知らんけど）」
ルビ子「メソッド呼び出しのとき，値は引数として渡すけど，そのほかに処理をブロックとして渡すことができる」
やめ太郎「それ，CLU 由来なん？」
ルビ子「CLU は繰り返しを抽象化する仕組みとして**イテレーター**いうもんを導入してん」
やめ太郎「**いてもうた**（やっつけてしまった）んかいな？」
ルビ子「ハイさよなら〜」
やめ太郎「Ruby との関係はどうなん？」
ルビ子「CLU のイテレーターは名前のとおり繰り返しが目的で，`for` 文でしか使えへん」
やめ太郎「Ruby　のイテレーターとはだいぶちゃうんやな」
ルビ子「matz は CLU のイテレーターと同じようなものを作ろうとしてメソッドにブロックを与えることを思いついたみたい」
やめ太郎「それがブロックの由来かあ」
ルビ子「出来てみたら，繰り返しだけやなくて，いろいろ使えることが分かったんやね」
やめ太郎「ファイルを開いてなんかするのもブロック使うしな」
ルビ子「Ruby が CLU の影響をどんなふうに受けたかは matz の以下の記事が参考になるわ」
[Rubyist のための他言語探訪 【第 2 回】 CLU](https://magazine.rubyist.net/articles/0009/0009-Legwork.html)（Rubyist Magazine 0009 号）

ルビ子「制御構造の構文にも見るべきところがあるねん」
やめ太郎「どういう？」
ルビ子「Pascal や C，JavaScript とかって，`if` の節には〈文〉がつくやん？」
やめ太郎「せやなー」
ルビ子「複数の文からなるコードを与えたいときは？」
やめ太郎「`{ }` でくくるんやな」
ルビ子「そうそう，まあ Pascal の場合は `begin`〜`end` やけど」
やめ太郎「せやなー（知らんけど）」
ルビ子「で，単文のときは `{ }` が要らんねんけど，いわゆる [ぶら下がり else](https://www.google.com/search?client=firefox-b-d&q=%E3%81%B6%E3%82%89%E4%B8%8B%E3%81%8C%E3%82%8A+else&spell=1&sa=X&ved=0ahUKEwi9w532jPviAhXKx7wKHaTtCTwQBQgrKAA&biw=1233&bih=671) 問題が起こりうるやん」
やめ太郎「それって，しゃあないんちゃう？」
ルビ子「いや，Ruby も Rust も Modula-2 もこの問題は起きひんで」
やめ太郎「なんでやのん？」
ルビ子「節は最初から中身が複数の文からなる前提で，終わりを表す記号やキーワードが必ず付くから」
やめ太郎「具体的にいうと？」
ルビ子「たとえば Ruby はこう」

```rb
if cond then

else

end
```

ルビ子「Rust ならこう」

```rust
if cond {
 
} else {

}
```

やめ太郎「Rust の例は C とどこがちゃうねん」
ルビ子「`{ }` が省略できないってとこ，`{ }` も制御構造の一部というか」
やめ太郎「CLU もこういうタイプなわけ？」
ルビ子「そう，上の Ruby の例はそのまんま CLU の例でもある」
やめ太郎「へー，ぶら下がり else 問題は 1970 年代前半に解決済みやったんか〜！」
ルビ子「C は CLU より古いけど，Java とか PHP，JavaScript みたいな後発の言語がなんで ALGOL の<ruby>轍<rt>てつ</ruby>を踏み続けたんか理解に苦しむわ」
やめ太郎「ホンマやな〜（知らんけど）」

ルビ子「ほかにも，変数が任意の場所で宣言できたりとか」
やめ太郎「そんなん当たりまえちゃうん？」
ルビ子「いや昔の言語は先頭でまとめて宣言せなアカンかったんやて」
やめ太郎「へー」

ルビ子「例外処理も当時は画期的やったらしいわ」
やめ太郎「いま当たり前のいろんなもんが CLU で先駆的に導入されてたんやな」