言語ゲーム

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

Twitter: @propella

A Declarative Model for Defining Smalltalk Programs と ANSI Smalltalk

先日 http://d.hatena.ne.jp/propella/20090709/p1#c1247123822 梅澤さんに教えて頂いた資料を読んでみました。これは面白いです。私がケチを付けた所はすでに10年以上も前から言われていた事だったのです。そりゃそうか。

問題をもう一度書くと、Smalltalk の伝統的な開発手法が副作用に依存しているために、開発が進むにつれて開発環境が阿部さんの秘伝のたれ状態になってプログラムのモジュール性が失われてしまうという物でした。

それを防ぐために、このスライドではいくつかの手法を提案しています。その一つが梅澤さんのコメントにあった Firewall で、開発環境と実行環境を分けてしまおうという話です。スライドの中では 2M ほどの独立したイメージで GUI アプリが組めるとあります。これは大変まともなアイデアだと思います。でも結局これって Eclipseプラグイン開発みたいな感じかも。

肝心な Declarative Model の内容は、宣言的な書き方で Smalltalk プログラムを書けるようにしようという事らしいです。普通 Smalltalk プログラムのロードは、実行環境がファイルを読みながら実行する事ですが、そうするとロード前の環境や実装によってプログラムの意味が変わってしまうので、静的に意味を持たせる方法を考えようという事です。

残念ながら具体的な例が無いので実際の雰囲気はわかりませんでした。でも ANSI Smalltalk http://wiki.squeak.org/squeak/172 の制定で使われたようなので見てみます。ところでこの ANSI Smalltalk 、意外と色々面白いです。特に標準クラス定義に使われる Protocol というアイデアに興味を持ちました。

ANSI Smalltalk では実装に依存するクラス階層やインスタンス変数を決める事はせず、クラスの性質を表す Protocol の外部からの振る舞いだけを決めています。Protocol というのはインタフェースのような物で、多重継承が出来ます。例えばソートされた集合を表す <SortedCollection> は次の Protocol に批准(継承)する必要があります(Protocol は <> で囲って表現し、グローバル変数に束縛されるものだけ先頭を大文字にする)。

  • <extensibleCollection> : オブジェクトを追加、削除可能な集合
  • <sequencedContractibleCollection> : 順序を持ちオブジェクトを削除可能な集合
  • <sequencedReadableCollection> : 順序を持ち読む事の出来る集合

また、メソッド定義にも Protocol が使われていて、sortBlock: の引き数は <dyadicValuable> (この Protocol は value:value: を実装しているオブジェクトを表す) 返り値は <SortedCollection> とされています。

メソッド定義で Protocol を使う利点は、意味がはっきりする事です。Protocol の無い実際の環境では、よく名前で変数の性質を指示します。例えばSqueak の sortBlock: の引き数は aBlock となっていて、Block を引き数にすると暗示しています。普通は確かに Block を渡すので間違っていないのですが、本当に必要な「value:value: を実装するオブジェクト」という情報はここから読み取れません。

という事で Protocol はなかなかナイスな仕組みだとわかりました。でも単に規格内だけじゃもったいないので、実装でも使えたら良いのになと思いました。

追記

ちなみに上の論文も ANSI Smalltalk も 90 年代なので、Objective-C より新しいです。