目次 | | | 索引 Java言語規定
第2版

1. はしがき

JavaTMプログラム言語は,並行処理が可能な,クラスに基づいた,オブジェクト指向の一般用言語とする。Javaは,多くのプログラマがこの言語に習熟できるだけの単純さをもつ。Javaプログラム言語は,C及びC++に似ているが,それらとは異なる構成をもち,C及びC++の多くのものを省いて,他の言語から少数のアイデアを取り込んでいる。Javaは,産業用言語であることを意図されており,研究用言語ではない。そのため,C. A. R. Hoareが言語設計に関する彼の古典的な論文で提案したとおり,Javaの設計は,新規の実証済みでない機能の取り込みを避けている。

Javaプログラム言語は,強く型付けされている。この標準報告書(TR)では,コンパイル時に検出が可能であり検出する必要があるコンパイル時エラー(compile-time errors)と,実行時のエラーとを明確に区別している。コンパイル時には,通常,マシン非依存のバイトコード表現へのプログラムの変換をする。実行時の動作は,プログラムを実行するのに必要なクラスのロード及びリンク,オプションのマシンコードの生成及びプログラムの動的最適化,並びに実際のプログラムの実行から成る。

Javaプログラム言語は,マシン表現の詳細を言語の中でサポートしていない高水準な言語とする。Javaは,通常はガーベジコレクタを使用して,自動記憶管理を組み込んでいる。この機能によって,Cのfree,C++のdeleteなどにおける明示的な領域解放の安全性の問題を回避している。高性能なガーベジコレクション付き実装は,システムプログラミング及び実時間アプリケーションをサポートするために中断の限界を指定できる。Javaには,インデクスチェックを行わない配列アクセスなどの安全でない要素はない。それらの安全でない要素は,プログラムに予期しない動作を行わせる可能性があるからである。

Javaプログラム言語は通常,The Java Virtual Machine Specification, Second Edition (Addison-Wesley,1999)が定義するバイトコード化された命令集合及びバイナリ形式にコンパイルされる。

この標準報告書(TR)は,次のとおりに構成される。

2.は,Javaの字句及び構文の文法を表すために使用する文法及び記法を規定する。

3.は,C及びC++に基づくJavaプログラム言語の字句構造を規定する。Javaは,Unicode文字集合で記述される。Javaでは,ASCIIだけを扱うシステム上でUnicode文字を使用できる。

4.は,型,値及び変数を規定する。型は,プリミティブ型及び参照型に分けられる。

プリミティブ型は,すべてのマシン及びすべての実装で同一と定義され,2の補数の整数,単精度及び倍精度のIEEE 754標準の浮動小数点数,型boolean,Unicode文字の型charのさまざまなサイズがある。プリミティブ型の値は,状態を共有しない。

参照型には,クラス型,インタフェース型及び配列型がある。参照型は,クラスのインスタンスであるか又は配列である,動的に作成されるオブジェクトによって実装される。各オブジェクトに対して,多数の参照が存在できる。クラス階層の一つだけの根であるクラスObjectのメソッドを,配列を含むすべてのオブジェクトがサポートする。定義済みのStringクラスは,Unicode文字列をサポートできる。プリミティブ値をオブジェクト内にラップするためのクラスがある。

変数は,型付きの記憶位置とする。プリミティブ型の変数は,そのプリミティブ型だけの値を保持する。クラス型の変数は,null参照を保持でき,又はそのクラス型若しくはそのクラス型の下位クラスを型としてもつオブジェクトへの参照を保持できる。インタフェース型の変数は,null参照を保持でき,又はそのインタフェースを実装するクラスのインスタンスへの参照を保持できる。配列型の変数は,null参照を保持でき,又は配列への参照を保持できる。クラス型Objectの変数は,null参照を保持でき,又はクラスインスタンス若しくは配列といったオブジェクトへの参照を保持できる。

5.は,型変換及び数値昇格を規定する。変換は,コンパイル時の型を変更し,場合によっては式の値を変更する。数値昇格は,演算を実行できるとき,数値演算子のオペランドを共通の型に変換するのに使用する。Javaには抜け穴はない。すなわち,参照型のキャストは,実行時にチェックされ,型の安全性を保証する。

6.は,宣言及び名前を規定し,名前が何を表すかを決定する方法を規定する。Javaは,型又はそのメンバを使用する前に,それらを宣言する必要はない。宣言の順序は,局所変数,局所クラス,及びクラス又はインタフェースにおけるフィールドの初期化子の順序だけに関して意味をもつ。

Javaプログラム言語は,名前の有効範囲に対する制御を提供し,パッケージ,クラス及びインタフェースのメンバへの外部アクセスの制限をサポートする。これは,大きなプログラムを書く際に,型の実装を,その利用者及びそれを拡張する者から切り分けるのに役立つ。プログラムを読みやすくする推奨の命名規約は,6.で規定する。

7.は,プログラムの構造を規定する。そのプログラムは,Modulaのモジュールに類似のパッケージで構成する。パッケージのメンバは,クラス,インタフェース及び下位パッケージとする。パッケージは,コンパイル単位に分割される。コンパイル単位は,型宣言を含み,他のパッケージから型をインポートしてそれに短い名前を与えることができる。パッケージは,階層化した名前空間に名前をもち,通常はインターネットのドメイン名システムを使って一意なパッケージ名を形成できる。

8.は,クラスを規定する。クラスのメンバは,クラス,インタフェース,フィールド(変数)及びメソッドとする。クラス変数は,クラスごとに1回だけ存在する。クラスメソッドは,特定のオブジェクトを参照しないで動作する。インスタンス変数は,クラスのインスタンスであるオブジェクト内に動的に生成される。インスタンスメソッドは,クラスのインスタンスに呼び出される。それらのインスタンスは,その実行中に現オブジェクトthis となり,オブジェクト指向プログラムのスタイルをサポートする。

クラスは,単一実装継承をサポートする。そこで,各クラスの実装は,単一の上位クラスの実装から,最終的にはクラスObjectから,派生される。クラス型の変数は,そのクラスのインスタンス,又はそのクラスの下位クラスのインスタンスを参照できるので,新しい型を多様に既存のメソッドと共に用いることを可能にする。

クラスは,メソッドsynchronized によって並行プログラミングを処理する。メソッドは,その実行中に発生する可能性のある例外処理を検査例外と宣言する。これによって,例外条件の確実な処理をコンパイル時に確認できる。オブジェクトは,ガーベジコレクタによって廃棄される前に呼び出されるメソッドfinalize を宣言でき,このメソッドによって自己状態をクリアできる。

構造を単純にするため,Javaにはクラスの実装から独立した宣言"ヘッダ"はなく,型階層構造及びクラス階層構造は分離しない。

Javaは,パラメタ化クラスをもたないが,配列のセマンティクスは,パラメタ化クラスに糖衣構文をかぶせたものとする。プログラム言語Betaと同様に,Javaプログラム言語は,型の完全な安全性を確保するために配列に参照を記憶するとき,実行時の型チェックを用いる。

9.は,抽象メソッド,メンバ型及び定数の集合を宣言するインタフェース型を規定する。無関係なクラスも,同じインタフェース型を実装できる。インタフェース型の変数は,そのインタフェースを実装するどのようなオブジェクトへの参照をも含むことができる。インタフェースの多重継承をサポートする。

10.は,配列を規定する。配列アクセスは,境界検査を含む。配列は,動的に生成されるオブジェクトであって,型Objectの変数に割り当ててもよい。Javaは,多次元配列ではなく,配列の配列をサポートする。

11.は,例外を規定する。例外は,再開はできないが,言語のセマンティクス及び並行機構に完全に統合されている。例外には,検査例外,実行時例外及びエラーの3種類がある。 コンパイラは,メソッド又はコンストラクタが検査例外を宣言したときだけ,検査例外となり得ることを要求して,検査例外が適切に処理されることを保証する。これは,例外ハンドラが存在することのコンパイル時チェックを与え,プログラミングを著しく容易にする。 利用者定義の多くの例外は,検査による例外であることが望ましい。Java仮想計算機によって検出されるプログラムの不正な処理は,NullPointerExceptionなどの実行時例外となる。エラーは,OutOfMemoryErrorなどの,仮想計算機によって検出される障害に起因する。多くの単純なプログラムは,エラーを処理しようとしない。

12.は,プログラムの実行中に起きる活動を規定する。プログラムは通常,コンパイルされたクラス及びインタフェースを表すバイナリファイルとして記憶される。これらのバイナリファイルは,Java仮想計算機にロードされ,他のクラス及びインタフェースにリンクされ,初期化され得る。

初期化後は,クラスメソッド及びクラス変数が使用できる。あるクラスは,インスタンス化されて,そのクラス型の新しいオブジェクトを生成する。クラスのインスタンスであるオブジェクトは,そのクラスの各上位クラスのインスタンスをも含み,オブジェクト生成は,これらの上位クラスのインスタンスの再帰的生成を含む。

オブジェクトが参照されなくなると,そのオブジェクトはガーベジコレクタによって再利用してよい。オブジェクトが終了化子を宣言すれば,オブジェクトを再利用する前に終了化子を実行して,それ以外には解放されないリソースをクリアする最後の機会をそのオブジェクトに与える。クラスが必要なくなると,そのクラスをアンロードしてよい。

13.は,変更した型を使用しているが再コンパイルされなかった他の型に関する,型変更の影響を指定し,バイナリ互換性を規定する。これらの配慮は,しばしばインターネットを介して広く配布される,一連の版数をもつ型を開発する者にとって,重要になる。良好なプログラム開発環境は,型が変更されるたびに,関連するコードを自動的に再コンパイルするので,ほとんどのプログラマは,これらの詳細を心配する必要はない。

14.は,C及びC++に基づくブロック及び文を規定する。Javaはgoto文をもたないが,ラベル付きのbreak文及びcontinue文をもつ。Cと異なり,Javaプログラム言語は,フロー制御文においてboolean式を必要とし,型を暗黙的にbooleanに変換しないので,コンパイル時にもっと多くのエラーを検出できる。synchronized文は,基本的なオブジェクトレベルのモニタ型のロックを提供する。try文は,catch節及びfinally節を含むことができ,非局所的制御の移動を防ぐ。

15.は,式を規定する。この標準報告書(TR)は,決定性及び移植性を向上させるために,式の(明らかな)評価順序を完全に指定する。オーバロードされたメソッド及びコンストラクタは,適用可能なメソッド又はコンストラクタから最も特殊なメソッド又はコンストラクタを選ぶことによって,コンパイル時に解決される。

16.は,局所変数を使用前に確実に代入されていることをJavaが保証する詳細な方法を規定する。Javaプログラム言語は,他の変数はすべて自動的にデフォルト値に初期化されるが,プログラミングのエラーを隠すことを避けるために,局所変数を自動的に初期化することはない。

17.は,Javaのスレッド及びロックのセマンティクスを規定する。これらは,Mesaプログラム言語で最初に導入されたモニタ基盤並行性に基づく。Javaプログラム言語は,共有メモリマルチプロセッサ用の,高性能の実装をサポートするメモリモデルを規定する。

18.は,Javaの構文的文法を示す。

1.1 プログラム例

この標準報告書(TR)に示されるほとんどのプログラム例は,そのまま実行でき,次の書式になっている。


class Test {
	public static void main(String[] args) {
		for (int i = 0; i < args.length; i++)
			System.out.print(i == 0 ? args[i] : " " + args[i]);
		System.out.println();
	}
}
SunのJDK又はJava 2 SDKのソフトウェアを用いているSunワークステーション上では,次のコマンドを入力すると,Test.javaファイルに保存されたこのクラスをコンパイルして実行できる。


javac Test.java
java Test Hello, world.

結果は次のとおりになる。

Hello, world.

1.2 記法

この標準報告書(TR)においては,Java及びJava 2のプラットフォームからもってきたクラス及びインタフェースを参照する。この標準報告書(TR)の例において定義されていないクラス及びインタフェースを,一つの識別子Nを使って参照するときは必ず,パッケージjava.langにおいてNと名付けられるクラス又はインタフェースへの参照を意図する。java.lang以外のパッケージからのクラス又はインタフェースに関しては,正準名(6.7)を使う。

1.3 既定義のクラスとインタフェースとの関係

1.2に示すとおり,この標準報告書(TR)は,Java及びJava 2のプラットフォームのクラスを参照することが多い。特に,Javaプログラム言語と特別な関係をもつクラスがある。例には,ObjectClassClassLoaderStringThreadなどのクラスが含まれ,とりわけ,パッケージjava.lang.reflect中のクラス及びインタフェースが含まれる。言語の定義は,これらのクラス及びインタフェースの振る舞いを拘束するが,この標準報告書(TR)は,それらに関しては完全には規定しない。それらの詳細なAPIの規定については,Javaプラットフォーム規定の他の部を参照されたい。

したがって,この標準報告書(TR)は,自己反映については全く触れない。多くの言語要素は,自己反映的APIにおける類似性をもつが,ここではそれらについては一般的に言及しない。例えば,オブジェクトを生成できる方法を列挙するとき,一般的には,自己反映的APIがそれを達成できる方法を含むことはない。ここでは示さないが,これらの追加の機構を知っていることが望ましい。

1.4 引用規定

Apple Computer. Dylan Reference Manual. Apple Computer Inc., Cupertino, California. September 29, 1995. http://www.cambridge.apple.comも参照。

Bobrow, Daniel G., Linda G. DeMichiel, Richard P. Gabriel, Sonya E. Keene, Gregor Kiczales, and David A. Moon. Common Lisp Object System Specification, X3J13 Document 88-002R, June 1988. これは, 次の文献の28章にある。Steele, Guy. Common Lisp: The Language, 2nd ed. Digital Press, 1990, ISBN 1-55558-041-6, 770-864.

Ellis, Margaret A., and Bjarne Stroustrup. The Annotated C++ Reference Manual. Addison-Wesley, Reading, Massachusetts, 1990, 訂正を入れた再版は October 1992, ISBN 0-201-51459-1.

Goldberg, Adele and Robson, David. Smalltalk-80: The Language. Addison-Wesley, Reading, Massachusetts, 1989, ISBN 0-201-13688-0.

Harbison, Samuel. Modula-3. Prentice Hall, Englewood Cliffs, New Jersey, 1992, ISBN 0-13-596396.

Hoare, C. A. R. Hints on Programming Language Design. Stanford University Computer Science Department Technical Report No. CS-73-403, December 1973. 再版は SIGACT/SIGPLAN Symposium on Principles of Programming Languages. Association for Computing Machinery, New York, October 1973.

IEEE Standard for Binary Floating-Point Arithmetic. ANSI/IEEE Std. 754-1985. 入手は次より可能。Global Engineering Documents, 15 Inverness Way East, Englewood, Colorado 80112-5704 USA; 800-854-7179.

Kernighan, Brian W., and Dennis M. Ritchie. The C Programming Language, 2nd ed. Prentice Hall, Englewood Cliffs, New Jersey, 1988, ISBN 0-13-110362-8.

Madsen, Ole Lehrmann, Birger Møller-Pedersen, and Kristen Nygaard. Object-Oriented Programming in the Beta Programming Language. Addison-Wesley, Reading, Massachusetts, 1993, ISBN 0-201-62430-3.

Mitchell, James G., William Maybury, and Richard Sweet. The Mesa Programming Language, Version 5.0. Xerox PARC, Palo Alto, California, CSL 79-3, April 1979.

Stroustrup, Bjarne. The C++ Progamming Language, 2nd ed. Addison-Wesley, Reading, Massachusetts, 1991, 訂正を入れた再版は January 1994, ISBN 0-201-53992-6.

Unicode Consortium, The. The Unicode Standard: Worldwide Character Encoding, Version 1.0, Volume 1, ISBN 0-201-56788-1, and Volume 2, ISBN 0-201-60845-6. Unicode Standard を version 1.1 にするために必要な更新及び追加は次を参照。http://www.unicode.org.

Unicode Consortium, The. The Unicode Standard, Version 2.0, ISBN 0-201-48345-9. Unicode Standard を version 2.1 にするために必要な更新及び追加は次を参照。http://www.unicode.org.

目次 | | | 索引 Java言語規定
第2版