Javaについて思うこと¶
いいところ¶
汎用性の高いところ¶
Java言語仕様の第1章は次の文で始まります。
The Java® programming language is a general-purpose, concurrent, class-based, object-oriented language.
日本語訳された「Java言語仕様 第3版」(ピアソン・エデュケーション 刊、 村上雅章 訳)から引用すると
プログラミング言語Java(TM)は、並列処理の可能なクラスに基づく汎用目的のオブジェクト指向言語である。
とあります。
そして、JavaはWindows OS、UNIX系OS(Solaris、HP-UX、AIX、Linux、FreeBSD)、Mac OS Xといった異なるCPU、OSの上で同じナレッジとスキルでGUI、マルチスレッド、ファイルI/O、ネットワーク、データベースアクセス、セキュリティ、国際化などの機能を使うプログラミングを行うことができます。しかも、クロス開発不要(どのCPU、OS上でコンパイルされたバイトコードであっても実行可能)という特徴があります。さらに、プログラムの実行性能は、言語仕様ではなくJava仮想マシンでの最適化(HotSpotVMの能力)によるものですが、C++に匹敵するものがあります。
これはすごいことです。
互換性堅持を貫いているところ¶
1996年に登場したJDK 1.0で作ったプログラム(バイナリ)は今でも動きます(そう、ホームページに貼ったAppletです。当時はWorld Wide Webが広がり始めた頃、まだGoogleはなく、プログラマーはAltavistaで検索するのが通とされた)。@Deprecatedが付けられ将来廃止を宣告されたクラス・メソッドがなぜか残り続けているのもありますが。
実装から切り離された標準APIの提供¶
Javaの標準ライブラリは、APIの標準化と実装が分離しているので、例えばJDBC APIのように複数のRDMBS製品と接続するJDBCライブラリの実装がいずれも標準APIを備えています。APIを利用するアプリケーションプログラムは、どのRDMBS製品を使用しているかでプログラミングを変えなくてもよい設計となっています。
標準ライブラリのカバー範囲も広範に渡っています。一線級のGUI、ネットワーク、マルチスレッド、データベース、セキュリティ、などなど。
そこそこシンプルな言語仕様¶
プログラミング言語の仕様が複雑だと、言語に習熟して製品レベルの品質を織り込んだプログラミングが行えるまでに長い期間を必要とします1。この点、Javaは習熟のしやすさを考えて作られています。
それは、Java言語仕様の第1章の第2文で明確に宣言されています。
It is designed to be simple enough that many programmers can achieve fluency in the language.
日本語訳された「Java言語仕様 第3版」(ピアソン・エデュケーション 刊、 村上雅章 訳)から引用すると
多くのプログラマが本言語を自由に使いこなせるだけの十分な簡潔さを持たせることを設計目標としている。
とはいえ、Javaの登場から10数年を経て言語仕様に大きな追加2がなされているので当初の簡潔さを少し失ってきています。
1 見よう見まねで何となく動くものを作って出来た気になるのとは違います。
2 Java 1.1で追加された内部クラス、Java SE 5で追加されたジェネリックス、Java SE 8で追加されたラムダ式、インタフェースへの実装定義などがあり、徐々に複雑化はしてきていますが、互換性と簡潔さを極力保つような追加となっていると考えます。一方、革新的な言語仕様の進化を望む人にとっては物足りなさを感じるところかと思います。だが、それがいい。
よくないところ¶
T.B.D.
Javaへの批判¶
Javaがマイナーな言語からメジャーな言語となった2000年代半ばころから、Javaは批判の対象となることも増えてきました。もっともJavaも黎明期はよくC++と比較して、ある意味C++を批判していたこともあったので自然なことかもしれません。
全体を考えずに部分だけ考えて他の技術と比較¶
言語仕様の比較を機能のあるなしで行えば、バランスを考えて簡潔に言語仕様を維持しているJavaよりも、なんでも便利そうな機能をごった煮にした言語の方が○が多く付きます。
また、強い型付け言語であるJavaを、弱い型付け言語や型推論の進んだ言語と並べ、タイプ数の多い少ないをソースコード上の文字数で競うような意味のない比較をしているのもよくみかけます。
適用範囲がJavaのスコープと違っている¶
オブジェクト指向プログラミングとはパラダイムの違うプログラミングにJavaを使おうとしても苦しそうです。
互換性不要(開発したらおしまい、新しい機能が必要ならスクラッチ&ビルド)、適用範囲が局所的(Webアプリだけ作れればいい、データベースアプリだけできればいい、Windows用アプリしか作らない)、適用範囲がJavaと違っている(ハードウェアのリアルタイム制御、OS固有の制御)といった用途にJavaを持ち込んでもいいことはなさそうです。
ただ、なかにはJavaを使ったほうがいいのにと思うこともあります。Windows用アプリしか作らないけれど、保守期間が長いとか、派生開発が多いとか。
データベースアプリだけWindowsだけでなくLinuxも対応するとか。