言語ゲーム

とあるエンジニアが嘘ばかり書く日記

Twitter: @propella

世界は言葉で繋がっている。

小説を読んでいて、ああ、さっきの登場人物の何気ない所作が、ここに関係があったのか!と見事に思う事がある。伏線というやつである。死亡フラグとか言われるやつも、広い意味で伏線と言える。なぜ伏線って何故か面白いのだろう。現実世界でも伏線という物がある。ここから今さっき感じたハックに関する伏線を書く。

1+1ができない子と線形論理 という記事を以前読んで、難しいけど何となく印象に残る話だなと思っていた。

一方別の日に、以前大島さんやアレックスと GC に関する議論をしていた。GC はプログラミングに必須だというのが我々の常識なのだが、近頃はずっと C でばかりプログラミングしていて、メモリ管理もパズルと考えたら結構楽しいやんと思っていたので、もしかして GC 無しでも勝手にメモリ管理をする言語が作れるのでは無いかと提案していた。

これらの何気ない日常の一コマには関係があった。

Joy 言語の動作を理解する為にわざわざ自分でインタプリタを作り始めたわけだけど、どうもイマイチな仕様がある事が分かった。それは主に条件文などで使われる使用でこういう物だ。

  • [1 2 <] ["yes"] ["no"] ifte.

ifte 文は最初の を実行し、真なら二つ目の を、偽なら二つ目の [] を実行する。この場合 1 < 2 は真なので "yes" が一つスタックに積まれる。ではこの場合どうなるだろう。

  • 1 [2 <] ["yes"] ["no"] ifte.

条件を構成する 1 が [] の外側にある。この場合でも答えは "yes" だが、スタックの状態を詳しくみると微妙に違って、1 がそのまま残り、1 "yes" となる。

関数 < はスタックから二つの値を取り出し結果を積むという仕様のはずなので、1 が残っているのは妙だ。ifte は条件に関しては副作用を残さないで複製されたスタック上で判定を行う。この仕様の動機は良く分かる。条件文が副作用を起こすが為に分かりにくいバグが紛れ込む事は容易に想像出来る。一方で、折角な単純な世界を壊す醜い仕様なのでは無いかとググると、やはりそのような議論はすでになされていた。 http://osdir.com/ml/lang.concatenative/2005-10/msg00008.html

ここで、Linear という単語が登場する。一本のスタックしか使わないという禁欲的な態度を守る純粋な Joy を Linear Joy と呼ぼうという話だ。ここから私の理解の及ぶ外の話になるが、どうやら世の中には Linear Logic という学問があって、ちょうどそこでの議論が一本のスタックの話に対応しているとの事だ。 http://home.pipeline.com/~hbaker1/ForthStack.html

ここで伏線が明らかになる。Liner Logic 、訳して線形論理、は 1 + 1 が出来ない子供が GC を使わずにメモリ管理を行うスタック言語を作成する話そのまんまである事が分かった。これらはここ数ヶ月全くランダムに身の回りで起こった事なので、繋がりについて全く気にしていなかった。が、あとで考えると必然だと思ってしまう。必然とはこのように適当に起こる物である。