プログラミング言語マスターへの道


Java(1)

Javaとは、狭義ではオブジェクト指向プログラミング言語Javaであり、広義ではプログラミング言語Javaのプログラムの実行環境および開発環境を指します。ここではプログラミング言語としてのJava、および関連する技術や設計思想、Java言語の実行環境としてみたJavaプラットフォームについてまとめました。

Javaは、従来のさまざまな言語の良い部分を引き継ぎ、欠点を克服するよう設計されました。次のような特徴をもっています。

Java

プログラミング言語JavaおよびJavaプラットフォームは、1990年代前半にサン・マイクロシステムズでジェームズ・ゴスリン、ビル・ジョイなどの人々によって開発されました。現在はJava技術の標準化作業は、Java Community Process (JCP) というプロセスを経て行われています。

Javaの技術って?

現在、Javaの技術は、情報技術のローエンドからハイエンドまで幅広く使われている。 組み込みシステムや携帯機器(携帯電話・PHSやPDA・スマートフォン等)のシステムから、企業の情報システムを担う大規模なサーバやスーパーコンピュータまで、非常に多くの分野で活用されている。

Javaの意味って?

Javaに関わる呼称とその意味内容は、文脈に応じていくつか使い分けられています。サン・マイクロシステムズは、「Javaテクノロジ」(Java技術、Java technology)という呼称を使い、一方でJavaのさまざまな技術の形容詞として「Java」の呼称を使ってきました。多くのプログラマは、プログラミング言語の意味で「Java」の呼称を使っています。Javaの実行環境は、Java実行環境 (Java Runtime Environment; JRE) と呼ばれます。Javaの基本的な開発環境は、Java開発キット (Java Development Kit; JDK) と呼ばれます。

Javaをもっと教えて?

Javaはクラスベースのオブジェクト指向プログラミング言語です(#オブジェクト指向プログラミング)。Javaのプログラムは複数のクラスから構成され、プログラムの実行は、各クラスが実体化したオブジェクト群が相互にメッセージをやりとりしながら行われます。Javaでは、継承については実装の単一継承を採用しています。ただし、1つのクラス(オブジェクト)は複数のインタフェースを実装できます。Javaで扱うデータ/オブジェクトの型(データ型)は、強い静的型付けを採用しています。Javaのコンパイラおよび実行環境が、型同士の整合性を検査することによって、プログラムが正しく記述されていることや、安全に動作することの検証が可能となっています。

Javaのメリットって何?

Javaでは簡潔なメモリモデルを採用していて、プログラマがメモリ (主記憶装置) を管理する負担を軽減します。あらゆるオブジェクトはメモリ内のヒープという領域に割り当てられます。メモリ管理は、Java仮想マシンに統合されたガベージコレクションの機能によって行われます。従来のオブジェクト指向プログラミング言語である C++ では、ヒープ領域に生成したオブジェクトについて、もはや必要が無くなった時に破棄する指示を、プログラマが自分で責任をもって行う必要がありました。これは、C++ プログラマーにとっては負担が大きく複雑で間違えやすい作業であり、ソフトウェアの安全性・開発効率・保守性を損なう要因でした。Javaではガベージコレクションの機能があるため、このようなことは無く、プログラマの負担は大きく軽減されます。

Javaの文法って?

Javaの文法は、CおよびC++から多くを引き継いでいます。また、C/C++には存在する低水準領域を操作できるポインタという機構は排除されていると言われていますが、Javaの開発者も言っているように、C/C++のポインタモデルとは異なるがJavaにもポインタモデルが存在します。たとえば、クラスインスタンスと配列はポインタを使用しています。
これは、"ClassName a = new ClassName();"と"ClassName b;"を定義して"b = a"とすることにより、bはaのフィールドを操作できます。すなわち、a,bにはアドレスが設定されています。
同様にして、配列名に格納されるのもアドレスです。このように、インスタンス名(上記のaやb)には、バージョン1.2以前はオブジェクトハンドル(ポインタのポインタ)、バージョン1.3以降はポインタが設定されています。ですので、Javaは当初から現在までポインタとは切っても切れない関係にあるのです。これについては、Javaのホワイトペーパーに「C/C++とJavaの最大の違いは、Javaには、メモリへの上書きおよびデータ喪失の可能性を排除するポインタモデルがあることである。
そこでは、ポインタ演算の替りに真の配列が用意されており、添字チェックを可能としている。なお、任意の整数をポインタに型変換することは、不可能である。」と解説されています。

Javaの目標

Javaではプラットフォーム非依存を目標の一つとし、また、バージョン間の互換性に注意して開発が進められています。Java技術を使うことで、プラットフォームに依存しないアプリケーションソフトウェアの開発と配備を行うことができます。
従来のプログラミング言語の多くはプラットフォーム (CPU) に依存したネイティブなコードにコンパイルすることを前提として設計されていましたが、Javaはこうした言語と異なり、中間言語(バイトコード)にコンパイルされ、Java仮想マシンで実行されるよう設計されました。
多くの場合、ジャストインタイムコンパイル方式が使われます。

Javaの課題

プラットフォーム非依存とバージョン間の互換性の目標は、完全に達成できたわけではなく課題が残っています。また、Javaに対しては批判も少なくありません。いくつかの批判に対しては、サンやJCPに参加する人々の努力により、Javaの改良が行われています。一方、現在、多くのソフトウェア開発者は、Javaについて広く使われている言語としては優れた技術の一つと評価しています。