プログラミング言語の進化とノスタルジー

古い時代のプログラミング言語は型に意味を見出すが、最近の言語は変数名に意味を見出す。一時変数の命名が関数の命名と同じくらい重要な時代になったと感じる。

// 最近の言語(Java/Swift/C#)
var string = "";
list.push(token)

// 昔の言語(C言語/Objective-C)
String *s = "";
push_token(&a, tk);
[self pushToken:t];

変数名の明確な命名は、とりわけメソッド呼び出しの際に有効に働く。push(tk)では処理の意味や目的が不明瞭となるが、push(token)なら「トークンをプッシュする処理」だということが明白となる。まるで文章のように明確なコードであり、まさに見たままの処理が行われる。

これはとてもスマートな発想だと思う。美しく合理的で、哲学的でさえある。

ちなみに、私はC言語文化やあの時代の泥臭さが嫌いではない。Objective-CはこのC言語の泥臭さを愚直に受け継いでいると思う。Go言語にも似たような泥臭さを感じる。Obj-CやGoはあの時代へのノスタルジーみたいなものが感じられて面白い言語だと思う。ちなみにGoは「21世紀のC言語」などと評されている。たぶんこれには皮肉が込められているのだろう。

ところで最近の言語の、合理性を極限まで追求したような機能や作法、思想は嫌いじゃないけれど、オーバロード、あれは欠陥品だと思う。

ただ「名前付き引数」これはいいものだ。名前付き引数はあのオーバロードのややこしさや欠点を解決してくれる。

self.push(token: tk);
self.push(token: this.that.token);

self.find("", from: 0);
self.find("", ignoreCase: true);

もっともObjective-Cは遥か昔から同じことを既に体現していた。

[self pushToken:tk];
[self pushToken:this.that.token];

[self find:@"" fromIndex:0];
[self find:@"" ignoreCase:true];

昔の時代も今の時代も、やろうとしていることや実現しようとしていることはそれほど変わっていないように思える。近年のプログラミング言語の発展は、ただ多様性を生み出し続けているだけにすぎない。

どんなに新しさを追求しても、結局あの時代に収束してしまう。プログラマが本当に必要としている物のヒントは全てあの時代が教えてくれるのかもしれない。

新しい言語にしか目のないロリコンどもは今すぐ C と Lisp と Smalltalk を学ぶべきだ。

“大切なことはすべて C言語 が教えてくれる。Smalltalk はプログラミングに対する考え方を変えてくれる。Lisp は君に新しい世界を見せてくれるだろう。そして最後にまた、近代のプログラミング言語を学び直すといい。そうすれば、君はプログラミングが実に愚かな行為であったということに気づくはずだ。”

広告