Deep Side of Java〜Java 言語再入門 第1回

Java の特徴

Java の特徴

それでは、Java 言語の特徴について述べていこう。Java 言語は Sun Microsystems によって、1995年に発表されたオブジェクト指向言語である。言語仕様自体は ver 1.1 で大きく追加されたが、現在は安定している。しかし、標準パッケージに関する更新が頻繁にあり、現在の開発環境 J2SE(Java 2 Standard Edition) のバージョンは 1.4 である。また、Sun は詳細な言語仕様などを公開しており、それに従ったサードパーティ開発キットも存在する。Linux などでは GNU による Kaffe, Guava がある。

注:2004年内にリリース予定の 1.5 では、1.1 以来の大幅な言語仕様の追加がある。これがなかなか凄い。たとえばこんな具合である。
  1. Generic 型の追加。汎用型・パラメータ化クラス・テンプレートなどと呼ばれる多相の一種。詳しい解説はパラメータ化クラスを見て欲しい。どうやら Java では Collection フレームワークの中で均質Collectionを実現し、馬鹿なダウンキャストをせずに済むようにできる、という程度の扱いのようである...この仕様についての詳細は「Iterator〜1.5で導入される Generic 型について」に。
  2. 列挙型の追加。Pascal では完璧に、C では不完全に実装されているあれ。クラスともプリミティヴ型ともつかないヘンテコな実装のようである。
  3. Autoboxing/Unboxing。これは要するに Integer 型などのラッパクラスへに、プリミティブ型がそのまま代入可能になる機能。
  4. foreach タイプの制御構造の追加。Perl や bsh であるアレ。単なるシンタックス・シュガー。
  5. 可変長引数の実現。printf( String fmt... ) が実装されるそうだ(苦笑)。
  6. クラス変数・クラスメソッド(だけ)の import が出来るようになる。
  7. などなど。
1.1 以降、文法上の大きな変更って assert(1.4で追加)くらいしかなかったんだけどねえ...どうもAlgol68化(あるいはC++化)してきたかな?(皮肉だよ、これは。いわゆるセカンドシステム症候群という奴)

  1. Java はオブジェクト指向の本格言語である。C++ から一部の仕様を取り除き、オブジェクト指向を C++ よりもやや徹底したという位置にある。それゆえ、既存言語の中では C++ に一番近い。逆に言えば、C言語のスーパーセットとして設計された C++ の作り直しという雰囲気でもある。このため、Cと基本的な式や文はほぼ同じであり、Cを知っていれば取り付きは良い。しかし、Java の言語定義は、寛容なCの定義とは異なり、かなり厳格である。Cでコンパイル時に警告されるものは、ほとんどコンパイル・エラーになる印象がある。

  2. Java は本格言語であるが、マシン依存の機械語を出力するものではない。そうではなくて、「仮想Java機械(Java VM)」と呼ばれる理論上のコンピュータ用の、「Java バイトコード」と呼ばれる機械語を生成する。この Java バイトコードを生成するプログラムを「Java コンパイラ」と呼ぶ(JDK では javac)。だから、具体的なマシンの上ではインタプリタ(解釈器:JDK では java)を起動して、具体マシンの上に「仮想Java機械」を動かして、その上で Java が生成した実行形式である、「クラスファイル」を実行する。このため、Javaインタプリタさえ具体マシン上にあれば、基本的にはどんなマシンの上でも、同一のコードが同じように動作する(あくまで理論上は)。このため、最近のXML関連のツールはほとんど Java 書かれている。

    しかしこれは実際には、現実のインタプリタの出来に依存し、かならずしも同一の結果を得ることができない場合がある。特に Applet では、Sun純正のインタプリタを使う Netscape Navigator と、Microsoft が独自開発したインタプリタを使う IE とでは、結果に若干の差異がある。

    また、実質的にインタプリタなので、スピード面でのハンディがかなりある。はっきり言ってコンパイル・実行ともに「遅い」ので、能力の高いコンピュータで作業した方が快適である。

  3. Java は本格言語であるために、能力的にはほとんどのアプリケーションを作ることができる。不可能に近いのは、任意のマシン用のOSやデバイスドライバを記述するような、機械語ベースのプログラムを要求されるものだけである。また、しようと思えばライブラリにない特殊なシステムコールを呼び出すクラスを、C言語などで書くこともできる。

  4. Java はインタプリタ言語であり、その実行環境が「ガベージコレクタ(GC)」を実装している。GCとは、主として Lisp インタプリタで使われて来た、不要になったインスタンスをシステムレベルで再利用する仕組み(「ゴミ集め」)である。だから、Java では明示的にオブジェクトを delete する必要はなく、単に参照されなくなったら、そのうちのそのオブジェクトのメモリはGCによって再利用するのである。これはデストラクタ(コンストラクタと対応する、オブジェクト廃棄時に呼び出される特殊なメソッドのようなもの)について頭を悩ます必要がなくなるという大きなメリットがある。ここらへんについて詳しく知りたい人は「Super Technique 講座〜ガベージコレクション」を参照してくれたまえ。

  5. Java の実行環境はマルチスレッドである。つまり、平行していくつもの「スレッド(軽量プロセス)」が同時に動き、それを前提としてプログラムすることができる。GC も実行環境が管理するスレッドの一つであり、「ゴミ集め」は書いたプログラムの実行スレッドと平行して動作するのである。また、このマルチスレッドはプログラム技法の上でも重要なテクニックであり、Java によってプログラマの常識として広まった(実は特殊な注意が必要な場合もある)。このマルチスレッドのための言語仕様もいくつか Java には含まれている。

  6. オブジェクト指向であるため、すでに存在するライブラリを継承を使って再利用することがやりやすい。標準でもずいぶん便利なライブラリがついているが、Sun社もかなり膨大なオプション・ライブラリを提供している。このため、機能が豊富である。

    とはいえ、まだ若い言語なので、特にライブラリの仕様変更が頻繁にある。この仕様変更で、Sun は「下位互換性」を必ずしも保証しない戦略を取っている。つまり、以前のバージョンで動いたソースが新しいバージョンの Java コンパイラでコンパイルできる保証はない。それだけではなく、古いコンパイラでコンパイルした、新しいJava のバージョンに沿ったクラスファイルが、新しいバージョンのインタプリタで動くことさえも Sun はまったく保証しない。これはつまり、Java のバージョン変更に従って、古いソースを書き直し、コンパイルしなおす必要があることになる。

  7. このような機能の中に、特にインターネット・アプリケーションに特化した2つの応用ジャンルがある。ブラウザが Java インタプリタを持って、Javaバイトコードを解釈して動く Applet と、WWWサーバが Java インタプリタを持って、Javaバイトコードを解釈して、HTMLなどの出力を生成する Servlet である。このため、WWWサービス全体にとって、Java 言語は大変有用なものとなっている。

    Applet は、最初からセキュリティについて厳格な態度で設計され、そのために安全性がかなり高い。たとえば、ブラウザによってクライアント側で実行されるのであっても、一切のローカルなデバイス(ハードディスクなど)にアクセスが出来ないし、Applet 上からインターネットにアクセス出来る機能があるが、その場合でも実際に Applet が転送されたサーバ以外との通信は出来ないようになっている(これは Applet によってファイアウォール内に設置された「安全な」マシンに攻撃をしないためである)。このセキュリティ機能を「sandbox(砂場)」と俗に呼ぶ。

    これを実現するために、Java では SecurityManager をインタプリタに対して与えることが出来るようになっている。つまり、Applet に限らず外部から信頼できないクラスをロードする可能性のあるアプリケーションでは、この SecurityManager をインタプリタに装備させ、あるいは SecurityManager をカスタマイズして使うことも可能なのである。これは RMI 技術のような Applet 以外の分散プログラム環境でも利用されている。

    しかし、Microsoft社は、今後自社ブラウザInternetExplorerでは、Java Applet を積極的にサポートしないことを表明した。これは、Microsoft社が押し進める .NET 構想において、独自開発した言語C#による分散アプリケーション環境を推進するためであるとする。この背景には、当然 Microsoft社と Sun社の間の勢力争いがあり、ライバル社である Sun社の立場を攻撃する狙いがあると見るのは当然である。しかし、これによってそれ以前から初心者にはライブラリを使いこなすことが難しい Java Applet 中心の状況から、 Java の利用が Servlet に移行しつつあった状況が加速し、現在 Java Applet はもうホットな技術ではなくなりつつある。

  8. その反面、最近では Java Servlet については商用のもの以外にも Struts, Turbine などさまざまなフレームワークが登場してきて、定型業務であれば作業量を押えることが出来るようになってきている。このため、現在 Web アプリケーション・サーバとされるものの多くは、Java で書かれているし、Sun 社自身も RMI 技術をベースとした EJB(Enterprise Java Bean) のような Java による分散コンピューティングに熱心に取り組んでいる。



copyright by K.Sugiura, 1996-2006