元ネタ != 発明

http://d.hatena.ne.jp/usagidrop/20071202/1196564729

おそらく Objective-C の「プロトコル」という呼び名はここからでしょう)は、はっきりとクラス継承から「インターフェイス」を分離しようとしたものではなかったけれど、れっきとしたエンティティとして存在し(まあ、Smalltalk での実装ですから当然そうなりますわな…(^_^;))、「インターフェイス」が持つべき素養はすでに備えていた、といったようなことのようです。

http://d.hatena.ne.jp/sumim/20071126/p1

これをそのまま信じるとすれば,「Objective-Cにインターフェースがあった」は完全にはYESだともNOだとも言えない.

イデアを思いつくこと,計画を立てること,試作すること,それを実現することの各段階を区別することは,技術開発を評価する時には常識である.(誰がどうやってコンピュータを創ったのか?)

のうち,Objective-Cでは「Interfaceの元となるアイデアを思いつき実現していた」とは言えるが,それをもって「(型としての)Interfaceを実現していた」と断言するのは言い過ぎでしょう.


優れた言語開発者であれば,様々な言語や先駆的な発明を知っているのは当たり前だし,新しい言語を設計する際に他の言語を参考にするのは普通のことです.JavaObjective-Cを参考にしてその影響を受けたことが事実であっても珍しくも何ともないし,それは他の言語の影響を受けなかったことを意味するものでもありません.JavaにおいてもObejective-Cを参考にした部分もあるだろうし,C/C++を参考にした部分もあるだろうし,SmalltalkLISPを参考にした部分だってあるかもしれない.*1他の言語の影響があった/なかったを議論するのは(多寡の差はあっても「ある」に決まっているので)時間の無駄です.

しかし、interfaceを発明したのがJavaが最初であるかのごとき発言(しかもろくに調べもせずに!)は、すでに同じ機能を実装していた他の言語とその開発者たちに対して大変失礼である。

そもそも私は「Java(の開発者)がインターフェース(の概念及び機能)を一から発明した」とか「Javaの開発者がインターフェース(のアイデアも実装も)をすべて実現した」とか「それ以前にはインターフェースは(その類似機能も含めて)全く存在しなかった」などとは言っていませんよ.おそらく一度も.Objective-Cが発明したとも言ってないし,「インガルスたちの Smalltalkが発明した」とも言っていません.発明とは段階的に行われるものなのだから,先駆的発明の無いところにある日突然大発明が現れることは滅多にないのです.*2


たとえばsumim氏の話を元にに整理すると,(注:以下の斜体部分はsumim氏のツッコミに合わせて修整する予定.)

(http://d.hatena.ne.jp/t_yano/20071202/1196601869 及び http://d.hatena.ne.jp/JavaBlack/20071125/p4#c のardbeg1958氏のコメントも参照.それらを踏まえると,この部分は独立した項目として書き直した方が早いかも.)

  1. インターフェイスを実装と分けて考えること自体は静的型言語で比較的以前からなされていた(「インターフェースの切り分け」というプログラミングスタイル)
  2. 「クラスのようなエンティティとしての「インターフェイス」やその継承モデルまで言及し、それを提案したのはこの論文が初めてだ」(「interface型」の提案)
  3. Objective-Cには,機能としてはJavaとほぼ同等の機能が存在していた(類似機能の存在)
  4. Javaによる実現(実用言語による実現と普及)

となるわけだけど,この中で「(型システムとしての)『Interface』の提案/発明」をあえて一つ選ぶならば,2の「インガルスらの試験実装」となるでしょう.それでも,これはいわば「実験室レベルでリニアモーターカーが動くことが確認された」ようなものでしかなく,「リニアモーターカーが従来の新幹線より効率がいいことが示された」や「リニアモーターカーが実用化された」とは大きな開きがあります.*3また「それ以前にリニアモーターカー的なアイデアや類似技術*4が存在していなかった」ことを意味するものでもありません.

大発明とは突然現れるものではなく,それには必ず先駆的な発明があり,それらの積み重ねの上に現れるものである.(誰がどうやってコンピュータを創ったのか?)

自分の間違いを認めるのがなんでそんなにイヤなのだろうか?

間違いを認めるのが「好きな人」なんていないと思いますよ.

しかしそれでも自分が間違っていたという証拠を突きつけられれば,それを認めるのが知的活動に対する誠実な態度だと思うからこそ認めるのです.そして証拠もなしに「間違っていた」と認めるのは,逆に不誠実さの現れだと考えます.

http://d.hatena.ne.jp/minekoa/20071202/1196573094

追記

2については,例えばInterfaceなどというものはJava以前には,まず存在しなかった.兼ねるも何もない.

は、一体どのような意図の発言だったのでしょうか。


「2については」とある通り,

2 は、例えば Java が Interface を導入したのが良い例です。悪い例としては古典的ですが、C のキャストが 型変換 / 型変更 / const 外し の ごった煮であることとか。分けられる概念は整理して分けた方が覚えやすいと思う。

http://d.hatena.ne.jp/minekoa/20071113/1194924935

に対する返答です.このコンテキストに沿って,「主に」C++/CとJavaとを対比させて書かれてます.(その二つの言語しか出てきてないし.)

Java以前にもそんなことやってる人がいたんだよ」「Java が乗っている肩は誰々の肩だよ」

Java以前にも類似技術や先行するアイデアがあった」(可能性が高い)ことについては全く否定していないはずですよ.

通常は,以下の二つは両立するんです.

  • (仮に)技術Aが画期的な大発明である
  • 技術Aには,数々の先行するアイデアや技術が存在した

(最初の突っ込みで猫は、暗に「おまえはOOPのことを何も解っていないバカチンだ」呼ばわりされているのだから、

そんなことは一言も言っていません.

Java の Interface にはなにか新規性があるはずだ」と 一貫して主張なさっているので、

これまた「そんなことは言っていません」.*5
まずは私がどこで「新規制があるはずだ」と主張していたのか示していただきたい.おそらくいずれも勝手な拡大解釈によるものと思われます.

*1:これは他の言語においても同様.

*2:こういう批判をする人は,「発明とは段階的に行われるものだ」ということを理解していないのではあるまいか.だから「それ以前にはほとんど存在していない」=「それ以前には(類似技術は)存在していなかった」=「Javaが一から発明した」と解釈してしまうのだと.

*3:リニアモーターカーが実験線を走ったのはもう何十年も前の話だ.では「今,リニアモーターカーはほとんど存在していない」は間違いか?

*4:例えば回転式のモーターとか発電器とか.

*5:それに「Objective-Cに対してどうか」とか「C/C++に対しあどうか」,「インガルスらの試験実装に対してはどうか」で,「新規性」に関する議論も変わってくるし.