月別アーカイブ: 2013年9月

Javaの設計思想が少し見えてきました。

Java のコードを本格的に書き始めてまだ数日ですが、少しずつ Java の設計思想が見えてきたような気がします。

以前は一貫性のないメソッドやコレクションや配列の間の変換のやりにくさに辟易していましたが、今では、「まあこういうのもありかな」ぐらいに感じています。

結局、目的に応じて配列やコレクションの類いは使い分ける必要があるわけで、場当たり的に選択するのではなく、よく考えて適切なものを選択し、自分のコードの中で一貫性を持たせていれば大きな問題はおきないようです。

Integer などの Number から派生したクラスが、内部の状態を更新できないのは参りますが、マルチスレッドのこととか考えるとこのほうがよいのかもしれませんね。

少し、Java のことを見直しました。

Androidの仕事はもうなくなる。

NTTドコモが iPhone を採用することになったため、少なくとも国内では iOS が席巻することになりそうです。Android はシェアを奪われ、結果、Android の仕事は今後激減するのではないかという話を知人から聞きました。

Android も当面なくなりはしないでしょうが、仕事が減ることはある程度間違いないでしょうね。そうなったらなったで、Android の技術者も減ってくるわけですから、場合によっては技術者に希少価値が出てくる可能性もなきにしもあらずです。

私の場合、Android を今になって少しかじりはじめたわけですが、おそらく今後はそんなに深入りすることもなくフェードアウトしていくことになるのだと思います。

WordPressのタグには「C++」と書けない。

今回初めて知ったのですが、WordPressのタグには「C++」と書くことができないようです。

どうやら + の文字が使えないようで、しかたがないので全角文字を使って「C++」と書くことにしました。おそらく他の記号も使えないものがあるはずで、編集中は使えるようなそぶりを見せておいて、公開ボタンを押したあと、それが消えてしまいます。

らしくない。

リニューアル後のブログの記事を見たところ、Java や Android の記事はあっても C や C++ の記事がありません。以前のブログであれば、Java や Android の記事はまったくなかったので大違いです。

我ながら「らしくない」というのが率直な感想です。今後も Java や Android の記事は書いていくつもりですが、C や C++ の記事がないのは一過性のものですので、そちらを期待して来られた方はもうしばらくお待ちください。

Javaプログラマーが知らないJava言語仕様

実際のところどうなのかはわかりませんが、Java に関してタイトルのような状況があるとかないとか。以下、その内容を具体的に書いていきます。

  • ビット演算やシフト演算は C ならできるけれど Java ではできない。
  • 同じファイルの中でクラスを複数定義できない。
  • クラスに属さない列挙型は定義できない。

これらはすべて間違いなのですが、迷信的なことがまかり通っているようなのです。上記はすべて Java でできることばかりです。

少し補足すると、同じファイルの中では、public なクラスはひとつしか定義できないのであって、public ではないクラスであればいくらでも定義することができます。

列挙型は一種のクラスのようなものなのでしょうね。どのクラスにも属さない列挙型を定義できますし、結果として列挙型の定義のみを含むファイルというのもありです。

結局徹夜作業に

出張の初日は、最初に出鼻をくじかれたこともあり、深夜まで現地作業を行うことになりました。よそ様の会社で作業をさせていただいている関係上、あまり遅くまで継続するわけにもいかず、23:00すぎにいったん中断してホテルに引き上げました。

0:00ごろにホテルにチェックインしたあと、近くのすしやで夕食&打ち合わせを行いました。それから部屋に戻って作業の続きを行いました。

結局 4:00 前まで作業した上で作業を切り上げることにしました。実質的な徹夜です。3:00 すぎまで仕事をすることは普段から少なくありませんが、さすがに出張先だと疲れも出るというものです。

結果は、必ずしも上手くいったとはいえませんが、やるだけのことはやったのでしかたありません。週明けから挽回するしかありませんね。

いきなり出鼻をくじかれました。

当初の予定では、10:30ごろに現地入りして作業を開始する予定でした。ところが、新横浜~小田原間が豪雨のために新幹線が一時的に止まったようで、30分近く東京に着くのが遅れてしまいました。

さらに、東京に着いてからも、地下鉄に乗り間違えた結果、本来地下鉄に乗るべき時間の4倍ぐらいを費やしてしまいました。

結局1時間ぐらい遅刻して現地入りしたわけですが、そうなると午前中に終わらせようと思っていたことがずるずる遅れてしまいます。

こんな調子でいきなり出鼻をくじかれた出張初日でした。この調子だと、終わるのは深夜になりそうです。

明日から東京に出張です。

明日から2日間、東京に出張に行きます。横浜や川崎といった神奈川県には頻繁に足を運んでいますが、東京は久しぶりです。ゆっくり東京見物できるような時間はまったくないでしょうけど。

具体的な内容は書けませんが、現在開発中の物件に関して、ひとつめの大きな山場を迎えることになります。ここを何とか成功させたいものですが、現時点で積み残しの部分もいくつかあり、必ずしも楽勝とはいえない状況です。

たまにはこうした緊張感があるのも、刺激になってよいかと思います。来週からは新しいフェーズに入ることになると思うので、後腐れがないようにきっちり決めたいところです。

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

先日から 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 の高速化についてはいろいろ語られているようですが、静的な最適化については意外に軽視されているのではないかという感が否めません。それならしそれで、腕の見せ所がいろいろあるわけで、私としてはある意味歓迎ではあるのですが。