今日のは自分の思考を整理するためのちょっとしたポエムです。
そもそも、コンピューターは停止性問題やらゲーデルの不完全性定理やらのせいで、無限ループに陥る問題を正しく処理することができません。
我々にとってわかりやすい問題は、「私は嘘つきです」と言った人は嘘つきなのか正直者なのか? という問題です。
この言葉が真実であれば、彼は嘘つきであるが、それだと彼は真実を言っていることになるので、矛盾する。
この言葉が嘘であれば、彼は正直者であるが、それだと彼は嘘を言っていることになるので、矛盾する。
という具合です。
この類の問題には、コンピューターは正しく対処できません。
というわけで、コンピューターには(にも?)不可能なことがあるので、コンピューターに仕事をさせる場合には、人間が予めそうならないようにする必要があります。
ところがプログラミングをしようとしたとき、無限ループ的な問題はありとあらゆる場所で牙を剥きます。
おそらく最初の大問題は、メモリ管理についてだったのではないかと勝手に考えています。
最も基本的なメモリ管理手法である、参照カウント方式には欠陥があります。
オブジェクトが参照を持ち合っていると、循環参照が発生してメモリ漏れが起きます。
でも、思うにこれはコンピューターの宿命というか、致し方ない仕様であり、本来人間が注意するべき領域だと思います。
(ここで批判を言いたくなったのは分かりますがとりあえず抑えて)
まあいつまでも漏らしているわけにもいかないので、我々はどう対処したかというと、マーク&スイープとかコピーGCという仕組みを発明しました。
ですが、詳しくは触れませんが、これについても、パフォーマンスを犠牲にした上に漏れるときは漏れるので根本的解決だとは思いません。
(まあ抑えて抑えて)
しかし大問題はまだ残っていました。並列処理についてです。いわゆる「デッドロック」の問題です。
これはあからさまな無限ループであり、かつ発生の特定が難しく、自分はプログラムにおける最凶のバグではないかと思っています。
これに我々はどう対処したか。
並列処理を諦めたのです。
GPUなどには既に数千もの小さいコンピューターを載せられる時代に、CPUのプログラムは未だにマルチスレッド対応だの非対応だの言っています。
これは冷静に考えてもったいないと思います。
このような状態を招いたのはすべて、コンピューターの限界から目をそらすor覆い隠すことをし続けた結果だと思います。
ですから、我々がすべきは、コンピューターの限界という現実から逃げることではなく、限界を把握しやすく、理解しやすくすることだったのではないでしょうか。
具体的には、循環参照やデッドロックが起きる場所を簡単に見つけられるようにすることです。
で、その方法は既に思いついているので、そのうちどこかに書きます。