お行事のよさが好きになれない

先日から Java についての調査を始めたことを書いています。その中で感じるのは、Java というプログラミング言語の設計思想は、C や C++ とはまったく違うということです。C# なんかと比べてもやはり違います。

何が違うかというと、ひとことでいうなら、その「お行儀のよさ」です。お行儀がよいのは悪いことではありません。しかし、ときには泥臭いことに手を染めなければならないこともあるのです。そんな状況では Java お行儀のよさはデメリットにしかならないことがあります。

例えば、Java ではメソッドの結果は必ず返却値で返すことを前提としていることがあります。実際には、引数で渡したインスタンスを更新することはできますが、では int 型などのプリミティブな型の引数を更新して呼び出し側に結果を返せるかというと、それはできません。インスタンスそのものを再割り付けした結果を返すこともできません。

これが C や C++ であればポインタを使えば簡単に実現できます。C++ なら参照を使ってもよいでしょう。C# なら out を使えばやはり簡単に実現できます。ところが、Java にはそういった手段がないようなのです。

確かに、メソッドの入力を引数に集約し、出力を返却値に集約するのは正しいことです。しかし、その方法では無駄に動的なメモリ割り付けを行うことを避けられなくなります。私の目下の関心はパフォーマンスの改善にありますから、これは大問題です。

このようなお行儀のよさが随所に見られます。これは、C が「プログラマーは間違うことがないので信用する」ことを前提としているのに対し、Java が「プログラマーは馬鹿で間違いばかり犯すので信用しない」ことを前提にしているからでしょう。

パフォーマンスがそれほど大きな問題でないならそれでもよいのです。しかし、もしそうであれば私が重い腰を上げて Java に関わることなどなかったでしょう。現実には、パフォーマンスを改善するためにあらゆる手を尽くす必要がありますし、そのたびに Java の余計なお世話が行く手を阻むのです。