カテゴリー別アーカイブ: 技術情報

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

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

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

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

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

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

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

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

 

Javaについて調査中

Android アプリの開発に携わることになった関係上、Java についていろいろ調べています。大まかなことは以前から知ってはいたのですが、本格的に調べていくといろいろなことがわかってくるものです。

今後は、Java について調査したり実験した結果を自分自身の備忘録をかねて投稿していくことにします。ですので、ベテランの Java プログラマーの方々にとっては目新しい情報はないかもしれません。

現在は、Java でいかに高速なコードを書くかについて調査を行っています。というのも、現在関わっているプロジェクトが、パフォーマンスに関してかなりシビアだからです。Android ですが、実行速度がかなり要求されます。

おおざっぱに調べた感じでは…

  • Java コンパイラの静的な最適化はほとんど期待できない。
  • メソッドをインライン置換するには、private, final, static のいずれかにする。
  • 配列の範囲チェックなど、ランタイムチェックが大きなコストを払っている。

といったところでしょうか。もちろん、インスタンス生成のコストなど、Java に限らずどんな言語でも問題になる部分は上記には含んでいません。

JIT を初めとした VM の高速化についてはいろいろ語られているようですが、静的な最適化については意外に軽視されているのではないかという感が否めません。それならしそれで、腕の見せ所がいろいろあるわけで、私としてはある意味歓迎ではあるのですが。