Archive for 5月 2012
どうしてこうなった
ほんと、どうしてこうなったかなぁ。
二分された世界
JVM と .NET、もろに競合なわけですが。少しレイヤーが違うとか、棲み分けできるポイントがあるならともかく、ほんとに2個あってもしょうがない状態。競争があるのはいいと思うものの、どうせ競争するなら最低ラインの仕様そろった中で性能改善とかで競って欲しく。
でも、後発の .NET だけが悪いわけでもないのは今の DalvikVM の状況を見ての通り(Oracle になってひどくなったわけでもなく、Sun の時代も大概)。このままだと仕様が違う第3の仮想マシン(VM)ができてしまってもおかしくない状況…
個人的な意見として、「もしもの話」で、一番よかっただろう道筋は、2000年前後の訴訟がなくて、Microsoft Java VM が生きている状態。.NET が生まれる必要性はないし、今頃、JVM にデリゲート、値型、型消去でないジェネリック、LINQ、DLR、dynamic、async/await が載ってる世界もあり得たのではないかと。
これから一番よいと思う道筋は、いっそ Android も Mono になってしまう状態。2個あってもしょうがないものを一本化する最後のチャンスかなぁと。
まあ、実際にありえそうな未来予想は、もう少し .NET 側が勢力伸ばし、しばらく後に Google が何とか頑張って Java を持ち直して、そのまま JVM と .NET の勢力がほぼ半々くらいで拮抗してしまうこと。第3の VM ができるよりははるかにマシな未来ですが。
Mono な Android
「いっそ Android も Mono になってしまう状態」というのは、そんなに突拍子もない話でもなかったり。
PlayStation Suite が Mono ベースだというのもありますが、こんな話も:
Dalvik は今、ライセンスと性能という2つの問題を抱えてたりするわけです。
ライセンスに関しては以下のような話が。
.NET の場合、Microsoft は Community Promise という条文を出していて、ECMA や ISO に提出している標準仕様に準じる限り、特許を主張しないと言っています。
性能に関しては、Dalvik の性能問題はおおむね以下の2点によります:
- Sun/Oracle の協力もなく、作り直しで、こなれていない
- 値型(struct)、P/Invoke、(型消去でない真の)ジェネリックなどがない
この辺り、Mono なら何の問題もないわけです。Microsoft は協力的ですし、もう Mono 自体も開発歴長いです。それに、値型とジェネリックがあるだけで結構性能変わるはず。
ということで、まああくまで研究プロジェクトですが、Java から C# への機械翻訳を通して、Android をまるごと Dalvik から Mono に移植してしまったそうで。
政治層・経済層の問題
Sun が長らく Java をオープンにできなかったのも、Google が Java もどきを選んだのも、今 Oracle が再び Java がらみの訴訟起こしてるのも、ついでに言うと iOS が VM 持たずに未だ旧時代的な Objective-C なのも、結局のところはお金の問題かなぁとか思ったり…
Java を発表した当時の Sun は、当時今よりはるかに強力で、かつ、攻撃的だった Micorosoft に対する対抗馬として期待されて、それで投資が集まってたってのがあり。Java をオープンにしてしまったら、結局 Microsoft 主導で Java が進歩するという懸念があってオープンにできなかったなんて噂も聞きます。
ハードウェアの多様化や、今後 OS をバージョンアップしていくことを考えると、VM 的なものは必要だと思うものの、そこで .NET を選んでしまうと、Microsoft の方が競争力強いのは明白で。それだと投資家の期待を得られないってのもあるでしょう。
あと、以下の記事で、「Java に足りないのは長期的なビジョンと開発リソース」というような話も出ていたり。開発リソースを割くのはもちろん、こういうインフラに対して長期的なビジョンを持つっていうのも、金銭的に体力ないとできないんですよねぇ。
オープンソースにして「無償奉仕」を期待すればいいってわけでもないですしね。無償で動く範囲だと面倒くさくないところばかりが進んで面倒なところは残るなんてよく言われますし(要はオープン/クローズドの二分論じゃなくて、たぶん一番いいのはバランスとること)。長期ビジョン持って全体の整合性とるには船頭多くちゃダメで、継続して強いリーダーシップも必要で、それは相当な負担ですし。C#の場合、週に3回、2時間ずつ設計に関するミーティングを定期的に続けているそうですし、そんな負担を無償でできるのかという。
1つの世界に
まあ、言語とかの選択肢が多いのはいいんですけども、相互運用はできなきゃダメですよねぇ。.NET が .NET 上で動く言語の範囲ではそうであるように。DLR がメタ オブジェクト プロトコルを決めて動的言語間のやり取りを実現しようとしたように。
XobotOS がやってるみたいに、コード(Java)からコード(C#)への機械翻訳でもいいっちゃいいんですけども。Java → C# みたいに低機能な方から高機能な方への変換は楽でしょうし。
Windows 8 の新 API、Windows Runtime(WinRT)で、共通型システムの仕組みを .NET 以外に広げたのも良い傾向かと。WinMD ファイル、.NET のメタデータ形式を .NET 以外の世界にも広めたものですが、これのおかげでネイティブ(C++)と .NET、それに JavaScript とも、相互運用楽にできるようになっていますし。
この WinMD を介した新しい型システム、Micorosoft としても適用範囲をもっと広げたいみたいですね。Java もこれに対応すれば、二分された世界、少しは1つになれそうですかねぇ。