「Javaで書いてあるからどのOSでも動く」の話

僕はWrite once, debug anywhere に賛同しているので,「Java で書いてあるからどの OS でも動く」と聞くたびにモヤモヤする. Java で書かれたソフトウェアが「どこでも動く」というのは,「開発者がわざわざどこでも動くようにしなくても動く」 という意味というより,「開発者が手間をかければどこでも同じバイナリで動かせるようになる」という 意味だと思う.

実際 Java で「Windows では動くけど他の OS だと動かない」ソフトを書くのは簡単で,

InputStream strm = new FileInputStream("C:\\Users\\username\\foo.txt");

(しばらく書いていないのでこれでファイル開けるんだったか忘れた)って感じで書けばいい. Java の外の世界に非互換の原因を作るのは簡単で,Java で書いたならどのOSでも動く ということにはならない. あと jar ファイルの中にプラットフォーム依存のネイティブライブラリが入っていることも 珍しくない.

逆に C++ の同一のコードベースからあらゆる OS 向けのバイナリを作り出すこともできる ・・・・・・けどかなり非互換が面倒臭い. まあ Java ってそこそこ速いし Oracle JDK か OpenJDK に統一している 限り標準ライブラリの非互換に悩まされることもないし,便利っすよね. でも「Java だからあらゆる OS で動く」ってのにはかなり違和感がある,という話でした.