Re: interface と型チェックの有無 #2

なんというかなぁ、sumim さんの紹介された論文のタイトルが「Interfaces for Strongly-Typed Objecect-Oriented Programming」だというのを忘れていませんか。

interface と型チェックの有無 #2 - odz buffer

いつから、suminさん紹介の論文に関する話題になったんでしょうか。


もともとは Gosling のプレゼン資料にあるように、また中の人の証言にあるように、JavaのinterfaceはObjective-Cが元ネタになっているよね、という話であり、またJavaのinterfaceとObjective-Cのprotocolは本質的に同じもんじゃね?という話です。「intefaceは型チェックを行うべきである」という意見はあってもいいと思いますが、それはここで扱っているのとは別の話ですよね(関連はしてますけど)。


正直、odz氏が何を焦点に話をしているのかよく分かりません。「interfaceでは型が重要である。だからJavaのinterfaceとObjective-Cのprotocolは本質的に違うものだ。」というのでしたら、はいそうですか、自分とは違いますね、で終了です。正直、それ以上コメントしようがありません。ゴメンナサイ。


あと気になったのですが、Javaのinterfaceはその論文をもとに設計されたのでしょうか。もしそうならまだ話は分かるのですが、Goslingがその論文を読んだという確実な証拠がないのに、「Javainterfaceでは型が本質的に重要」という主張の根拠としてその論文を出すのはどうでしょうか(suminさんはそういう意図でその論文を紹介したわけではなく、あくまで「Javaより前にinterfaceという考え方は存在した」ことを示すために紹介されたんですよね)。


それに対し、JavaのinterfaceはObjective-Cを参考にしているというのは証拠があるわけです。自分としては、Objective-Cの機能をJavaに取り込むときに、Javaなりにアレンジして取り込んだのだろうと思います。そして型チェックもそのアレンジのひとつなんじゃないでしょうか(静的な言語であるJavaに取り込むなら、誰が考えてもそのほうが自然ですから)。つまりObjective-Cの機能を取り込むことが先にあり、型チェックはその付随事項だったと考えることはできませんか。

Java における interface の立ち位置も基本的にこれとあまり変わらないと思う。interface inheritance を導入することで、implementation inheritance の関係が無くても subtype polymorphism が実現できるから、型チェックがありながらも Smalltalk のように柔軟なプログラミングができる、と(本当に Smalltalk 並に柔軟なのか、とか、それなら nominal subtyping より structual subtyping のほうが柔軟じゃないのかとかあるけど)。

interface と型チェックの有無 #2 - odz buffer

変わらないどころか、そのまんまですね。いちおう確認しておきますけど、その論文の趣旨は「interfaceをtypeとして使えばstrong typingな言語でも柔軟なプログラムができる」であって、「typeとinterfaceは分けて考えることはできない」とか「typeとして使えないとinterfaceやprotocolに意味はない」とか「strong typingでない言語にinterfaceやprotocolを導入する意味はない」ではないですよね?

だから、「オブジェクト同士が比較可能である」型を表現/宣言できるところが Java の interface の重要な点なわけ。そりゃ、視点を変えれば比較のためのインターフェースを備えたオブジェクトは比較できるという性質を持っていると言えるだろうけど。

interface と型チェックの有無 #2 - odz buffer

ちょっと変えてみましょうか。


だから、「オブジェクト同士が比較可能である」ことを表現/宣言できるところが Java の interface や Objective-C の protocl の重要な点なわけ。そりゃ、視点を変えれば比較のためのインターフェースを備えた型を宣言していると言えるだろうけど。

というより、単に性質を宣言するだけなら、それってただの marker だよね*1。

interface と型チェックの有無 #2 - odz buffer

『marker』って、marker interfaceのことですよね。でもmarker interfaceはメソッド宣言のないインターフェースのことですよね。もしComparableがmarker interfaceなら、どのメソッドで比較するのか分からないですよね。比較するためのメソッドをinterfaceやprotocolで宣言しているからこそ、比較することができるんですよね。静的な型チェックのない言語でも、「比較するときはcompareToメソッドを使う」ということが分かるのは、大きな利点ですよね。


型チェックがないと本当にinterfaceやprotocolに意味はないですか?

あと、PHP5 は type hinting が導入されていたりするので、型チェックがないということはない。

interface と型チェックの有無 #2 - odz buffer

type hintingは強制ではないし指定できるデータ型が限定されるので、この指摘は今の議論には無意味だと思う。