このブログの更新は Twitterアカウント @m_hiyama で通知されます。
Follow @m_hiyama

メールでのご連絡は hiyama{at}chimaira{dot}org まで。

はじめてのメールはスパムと判定されることがあります。最初は、信頼されているドメインから差し障りのない文面を送っていただけると、スパムと判定されにくいと思います。

参照用 記事

ソフトウェアの意味論は何のため/誰のために必要か

Catyを素材/具体例として、表題のような話をします。



Catyの用途はWebフレームワークだけど、構造としてはCatyスクリプトインタープリタの形になっています。スキーマ言語だのテンプレート言語だのもあるんですが、これらの言語もCatyスクリプトを補助する役割だと言えます。実装言語であるPythonでさえ、Catyスクリプトのプリミティブ・コンポネントである“コマンド”を書くための言語だと位置づけることができます。

Catyシステム内で支配的な立場にあるCatyスクリプトは、たいそうな言語かというと、実に低機能なんです。自分では何も出来ない王様であるCatyスクリプトのもとで、コマンドが兵隊、スキーマが参謀、テンプレートが交渉人といった役割でしょうか。これら配下の者達がそれなりに頑張るので、王様は大雑把な短い指示をすれば済む、というわけ。

こういう構造なので、Catyスクリプトは、プログラミング言語としては珍しい要求のなかにいます -- それは「できるだけ低機能であれ」です。Catyスクリプトが計算や制御の能力を持つと、厳密分離の原理が破れてしまうので、低機能にとどめる必要があるのです。結果的に、Catyスクリプトの言語仕様はオモチャ(Toy Language)のように単純です。

実用システムの中核部が単純なプログラミング言語になっているという状況は、なかなかに興味と食指をそそられます。(自分でそういう状況にしているのだろう、と言われれば、まーそうですけど。)プログラミング言語が単純だと、普通では出来ないことが出来る可能性があります。例えば、完全な意味論(semantics)を提供することです。

プログラミング言語がある程度の規模と複雑性を持てば、意味論を構成するのは大変な労力となります。しかし、Catyスクリプト程度に単純であれば、意味論を完全に書き下すことも出来ない作業ではありません。実際、僕はやるつもりです。

さて、そんなことして何かいいことあるのか? まず仕様が明確になります。これは、テストを作る指針を与えます。CatyのテストはCatyスクリプト(の機能拡張版)で書ける(はず)なので、自分の正しさを自分で書き下せ、自分で確認できます。インタプリタが動き出せば*1、自己完結的で実行可能な correctness の定義が得られます。

正しさの基準が「形式的な記述」と「実行可能なモノ」として存在することは、技術的/実用的に望ましいことです。しかし、僕が「より重要だ」と思うのはメンタルな効果です。ソフトウェアに意味論(モデル)が在るということは、不安を解消し自信を持つために絶大な効果があります。

ソフトウェアの設計と実装には、常に不安が付きまといます。それを払拭する方法は色々あります。精神論と根性論はまったく何の役にも立ちません、むしろ有害です。経験と勘は役に立ちますが正しい保証がありません。歪んだ経験と間抜けな勘だとたぶん失敗するでしょう。イチかバチかに賭ける人もいますが、そんなことで博打を打つのは僕はイヤです。無鉄砲と勇気を混同しちゃいけない。

適切な手順で作成された意味論は、万能完璧ではないけれど、ある範囲内で正しさの保証を与えてくれます。「ある範囲内で正しさが保証」されていれば、自信と余裕が生まれます。周辺部分で遊びや実験を入れてもいいだろうし、負けてもダメージのない(勝てば十分うれしい)博打を打つことだってできます。

すべてが曖昧であやふやな状況下で、不安と戦い続けるのは心理的にキツすぎます。僕には耐えられそうにありません。いや、耐えられない。耐えられなかった。だからもうイヤなんです。ほんとに二度とゴメンだ。

つまり、拠り所となる意味論を構成することは、僕が(たぶんKuwataさんも)不安に苛<さいな>まれず、穏やかな精神状態でいるために必須の作業なのです。



今書いたことは当事者の問題で、大部分の人には興味がないことでしょう。特に、Catyがほんとのターゲットにしている人々=プログラマではないWeb制作者には、まったくどうでもいい余計な話です。

ある人にこう忠告されました; 僕がCatyの意味論やら何やらを書いたり話したりすると、難解な印象を振りまいて、Catyのプロモーション上は悪影響がある。はい、そのとおりだと思います。困ったもんだ。

*1:インタプリタの作成途中では、手作業+目視か、実装言語によるテストコードを使うことになります。