

具体的な言語処理系というわけではありませんが、おそらくこれが元ネタだろうというアイデアが記された論文は見つかりました。もっともゴスリングが Java や Oak（Java の前身…というか初期バージョンそのもの。変わったのは名前だけなので）について書いたものに Java のインターフェイスは○○を参考にして考えた…という記述を見つけられずにいるので、これをＦＡとするには、もう少し調査が必要そうですが、とりあえずということで。







この論文中では、たとえば Point というインターフェイスを定義して、それを実装した polar_point というクラスを定義する例として、仮想言語を用いてこんなコードが示されています。

interface Point x() returns Real y() returns Real move(Rea1, Real) returns Point equal(Point) returns Boolean

class polar_point(x:Real, y:Real) implements Point variable rho:Real := sqrt((x*x)+(y*y)) variable theta:Real := arctangent(y/x) method x() returns Real return rho * sinettheta) method y() returns Real return rho * cosine(theta) method move(dx:Real, dy:Real) returns Point return new myclass(self.x()+dx, self.y()+dy) method equal(p:Point) returns Boolean return (self.x() = p.x()) and (self.y() = p.y())



クラスに対するインターフェイスの実装の宣言に implements を使っているあたりに Java への影響の片鱗が見られると思うのはうがちすぎでしょうか。これは有名な Inheritance Is Not Subtyping (1990) [PDF] の元になった論文みたいなので、使われているサンプルコードや主張は両者でよく似ています。ロハで読みたいという人はこちらをどうぞ（ただ、のっけから式が出てきたりで、平易な Interfaces for... より少々難解です。ご注意あれかし）。

ところで、私のような Smalltalk ファンにはたいへん興味深いことに、どうやらこのクックらの「インターフェイス」のさらに元ネタのところで、なんと Smalltalk が一枚かんでいるらしいのです。と言うと、動的型付けの権化のような Smalltalk で「インターフェイス」？といぶかしがる人も多いでしょうね。もちろん当時の Smalltalk-80 そのものずばりではなく、それに静的型チェックを導入した 1982 年の実験的な実装についてです。これは Smalltalk の中の人であるインガルスと ThingLab（インスタンスベースな言語で有名な SELF の元ネタになったソフトウエア）の中の人であるボーニングによる仕事です。







追記：ここでことさらに「中の人」を強調すると誤解があるといけないなとあとで気づいたので念のため書きますが、Smalltalk は通常の言語処理系での常識とは違い、エンドユーザーレベルで言語仕様を変更できるちょっと（いやかなり…）変わった性格を有する処理系なので、こうした拡張をするのにいわゆる「中の人」である必要はまったくありません。具体的にどんなふうにしたらできるのかについては（ちょっと古いバージョン向けではありますが）Squeak Smalltalk に、くしくもインターフェイスそのものずばりを追加する話を umejava さんが書いてくださっている（Happy Squeaking!! -オブジェクト指向再入門- 第四回：メタ機能との出会い）ので、そちらをぜひ参考になさってください。Squeak2.2 は 本家アーカイブ などから入手できます。

Interfaces for... の既往研究のセクションに、この Smalltalk の「インターフェイス」についての言及がありますので抜粋して引用します。



