素人の私が考える「デスクトップで利用されない」理由は、
1.起動時間の重さ
2.メモリ食い
3.デスクトップから浮いた感じのGUI
4.逆コンパイルのしやすさ
などがある気がします。
(1)
Javaのソースをコンパイルしても生成されるコードは中間コードと呼ばれるもので、それをJavaVMで解釈しながら処理が進みます。
このJavaVMの起動や、Javaの高速化手法であるJITによる前処理によって(←今は改善されているかもしれませんが)起動が重くなりがちです。
一般的なユーザはアイコンをクリックして、なかなかアプリケーションが立ち上がらないと非常にイライラします。
逆に一旦起動してしまえば365日24時間ずっと走り続けるようなサーバプログラムにおいては、起動時間などどうでもよいのです。
(2)
Javaは結構メモリを食います。
デスクトップに積まれるメモリ量も512MB~2GBと年々増えています(増えているというより、ソフトウェアが要求するスペックの向上で増やさざるを得ない?)が、起動しているアプリケーションが全てJavaプログラムとなるとかなりきついものがあると思いますし、軽量にこしたことはありません。
サーバ等につまれるメモリは一桁、二桁上のメモリ量ですので、別にJava程度ならびくともしないでしょう。
(3)
JavaのGUIコンポーネントとしてswingがあり、かなり柔軟にそして容易にGUIアプリケーションの開発が出来ます。
がしかし、出来上がったアプリケーションはデスクトップ環境とは独立した浮いた感じのGUIになり、思った以上に気持ち悪いです。
Look and Feelを変えて本来のGUIの見た目に似せることは出来ますが、やはりなんとなく違和感があります。
SWTを使えばこの点は改善できますが、各OS毎にアプリケーションパッケージを用意し、数MBのライブラリを同梱しなければならず結構めんどうです。
サーバアプリケーションとかだとあまりGUIも使わないので、この欠点も気になりません。
(4)
これは結構大きいと思うのですが、つまりコンパイルした生成物から元のコードを復元しやすいということです。というか復元するための逆コンパイラがJavaの開発ツールキット群に含まれているくらいです。
オープンソースは別としてソフトウェアを作って飯を食べている企業にとって、ソフトウェアの「ソース」は財産そのものですし、他企業に知られたくない方式やアルゴリズムがソースコード中に埋まっていることがあります。
それがあっさり他人にばれてしまってはいけません。
逆コンパイルを困難にする(逆コンパイルして復元されたソースが人間にとって非常に醜いような形式になるようにソースを変換する)ツールもありますが、C++等のネイティブコードを吐くコンパイラと比べればやはり復元しやすいらしいです。
とまぁ素人ながら考えたことを書いてみました
お礼
ありがとうございました