読者です 読者をやめる 読者になる 読者になる

なるようになるかも

力は多くの場合、その人の思いを超えない。

Javaと偽Javaの話。

qiita.com

これの話。ブコメに書こうとしたら4000字は入らなかった。

Microsoft Java VM

かつての WIndows には MS 製の Java VM が搭載されていました。

古代の Java は「Write once, run anywhere」を掲げていた通り、クライアントサイドで Java アプレットとして利用されるのが主流でした(サーバーサイドで動くようになって、真価を発揮した感じがあります)。

しかし Java VM の仕様は、パフォーマンスについての記述は曖昧になっており、OS ごとの実装の違いによって、実行速度に顕著な差がありました。

Windows の Sun 純正の Java VM は性能が悪かったため、MS は独自の Java VM を開発し、Internet Explorer にバンドルしました。調子に乗った MS は Windows GUI ライブラリを利用できる、Sun Java VM と互換性のない Java 統合開発環境 Visual J++ をリリースしたりしていました。

これが 1997年に「Java の互換性を破壊した」として訴訟に発展、2004年に和解に至りましたが、現在 MS の Java VM は頒布されなくなりました。

Visual Studio 2015 で Android がサポートされ、Java モドキを再び書けるようになったとき、J++ の面影を思い出した人は少なくないはずです。J# は知らんです。

Apache Harmony

Apache 財団が開発を進めていた、オープンソースライセンスフリーJava 実装でした。

「自由な Java」を求めた IBMIntelGNU Classpath に関わってきたフリーソフトウェア開発者たちが一同に介して開発を進めた夢のプロジェクトでした。

プロジェクトの開始以来、多くの企業や団体がJava SEのオープンソース実装に対する賛同を示し、協力を申し出てきた。例えばIBMがコア・クラスやクラスライブラリ/VMのインタフェース、Eclipseプラグイン等の実装への協力を申し出ているほか、IBM developerworksは評価ライセンスでのJVMの提供に同意している。また、Intelはセキュリティや認証系、正規表現RMIなどの実装に協力すると表明している。オープンソース団体ではクラスライブラリの実装を行っているGNU Classpathプロジェクトが、Apache Harmonyとの提携を開始している。その他多くの協力を得た結果、現在はプロジェクトの大部分において実際に動作するコードが集まっているという。

JavaOne 2006 - オープンソースのJava実装「Apache Harmony」に期待

JavaOne というのは Sun が主催していた Java の祭典です。Sun のお膝元でプロジェクトの進捗が公表されていた Apache Harmony ですが、悲劇的な末路を辿ります。

Sun が JSPA(Java Specification Participation Agreement)の供与を拒否したため、Java テクノロジ互換キット (Technology Compatibility Kit) と呼ばれる「Java 互換を名乗る資格を得るためのテスト」を受けられませんでした。

Apache 財団は Sun に公開書簡を送りましたが、Sun からの返答はありませんでした。

やがて、Sun 自ら Javaオープンソース化する OpenJDK プロジェクトを始めると、それまで Apache Harmony に関わってきた開発者たちは撤退し、OpenJDK へ移行しはじめました。

IBMApple(当時の AppleCocoa Java Bridge など Java テクノロジに熱心だった)が OpenJDK への参加を表明したことで、Apache Harmony プロジェクトは事実上終結しました。

Android

Apache Harmony は、「Java 互換」を名乗ることができない偽 Java として天命を迎えるはずのプロジェクトでした。

その成果を利用したのが Google です。Android の当初の Java 標準ライブラリは Apache Harmony が採用されており、このため「本物の Java」と挙動が違いました。貧弱な端末で動作させるために機能を制約した Dalvik VM 上で動作していながら、JIT もなく性能面で大きく劣っていたりしました。

歴史の流れを見ると、Sun を買収した Oracle が「Java の互換性を破壊した」として Google と訴訟に至るのは疑問の方が強いです。なぜオープンソース指向へ変わりつつあった Sun の意思が失われたのか、また Google が MS の取った行動をなぞるかのごとくリスクを犯したのか。

APIフェアユースが認められた今回の裁判結果が一つの契機となってくれることを願うばかりです。

Android N 現在の Java 標準ライブラリは Apache Harmony を捨て、Open JDK を採用しています。Dalvik VM は ART ランタイム(Java のクラスファイルを、Dalvik VM 向けに変換して APK 化した後、更に端末上で AOT コンパイラが走り、ネイティブなコードに変換している)に置き換えられました。

その他の Java

Oracle Java VM は唯一絶対な Java VM ではありません。

たとえば、IBM の WebSphere で利用されている IBM J9 VM のように、公式にライセンス供与された Java VM が存在しています。

ガラケー時代に流行ったアプリは Java ME で書かれており、Sun とのライセンス契約が締結されていました。

これらの中には、MIDP(Mobile Information Device Profile)に従っていた EZアプリや S!アプリも存在していましたが、当時主流だった iアプリは DoJa プロファイルという互換性のない Java で動作していました。ただライセンス料金を徴収されていたので非互換の偽 Java ですが、正式なサブセットという扱いでした。

歴史との diff

Android 登場以前までは、業界関係者が皆協力しており、Oracle といえども JCP に則って仕様策定を進めていました。

MS のような Java の破壊者は Android 以前にもいました。

仕様を策定する際には、RI (Reference Implementation) (リファレンス実装) と TCK (Technology Compatibility Kit) (テスト群) も同時に用意します。これは、策定した仕様が現実的に実装可能であるかどうかを確認するため、および、第三者が仕様に則って実装をおこなったときにその実装の互換性を確認できるようにするためです。

API デザインの互換性を担保する上で、TCK を公開することの重要性は、「Practical API Design: Confessions of a Java Framework Architect(API デザインの極意)」などでも説かれていますが、Oracle は自社のビジネスの都合で TCK の利用に制約を掛け、「正当な Java」として認定する対象を選別しています。

それが Oracle のビジネスモデルだと思うので、しょうがないですね。

一方 Oracle は、JCP に則り、エキスパートを集めて Java API の仕様策定作業をしています。時間はかかりますが、Java の新バージョンで追加される言語仕様や API の設計が洗練されているのは、そういう理由です。

かつて OpenJDK を支えていた AppleIBM も今は Swift を盛り上げる方向にいっていますし、Java の進化が遅くなったのは仕様策定が綿密というよりも、業界の巨人の Java 離れが進んだ結果なんじゃないかなーと個人的には思っているのですが、どうなんでしょう?

JCP についてはまったく詳しくないので、的外れなのかも。

Oracle 提供の JDK / JRE に比べ、Android の品質はどうでしょうか? こちらは、平気でゴミクズのような API が公式 API として追加されます。

AndroidAPI の品質が悪いのは関係ないだろ!!!!

往年の HttpURLConnection とか SecureRandom とか酷かったですよね。Fragment も酷い(Fragment in Fragment の闇は深い)。

TCK のような互換性維持のためのテストセットもありませんから、String.indexOf(String,int) という基本 API に実装不具合があっても、それを事前に検出できずにリリースが行われることがあります。

現在の標準ライブラリの実装は OpenJDK ですのでご安心ください。N 以降だけですが!

Android 新バージョンの発表があると思うから、Google 主催の次のイベントが楽しみ!」と思っている時点で、Google に振り回されていることに気付くべきです。

今では Google I/OWWDC が盛り上がっていますが、かつては Java の祭典である JavaOne が活発でした。

ところで、あまり知られていない(?)ですが、JavaOneWWDC は日本でも開催されていました。(WWDC は世界開発者会議の略称なので、日本語版は JDC ですが)

最後に開催された JDC の大きなトピックは、「Cocoa on Windowsライセンスフリーで提供」(実現しなかった)だったので、いかにバブルな時代だったかというのが伺えるでしょう。

つまるところ、Sun や Apple に振り回されていたのが、GoogleApple に振り回されるようになっただけですね。