Javaは,並行処理が可能な,クラスに基づいた,オブジェクト指向の一般用言語である。Javaは,単純であり,多くのプログラマがこの言語に習熟することができる。Javaは,C及びC++に基づいており,いくつかのアイデアを他の言語から取り入れると共に,いくつかの特徴を省いている。Javaは,製作のための言語であることを意図されており,研究のための言語ではない。そのため,言語デザインに関するC. A. R. Hoareの古典的な論文で提案されたとおり,Javaをデザインするにあたっては,新規な実証済みでない機能を取り入れていない。
Javaは強く型付けされている。この規定では,検出が可能でありかつ検出する必要があるコンパイル時エラー(compile-time errors) と,実行時のエラーとを明確に区別している。コンパイル時に,Javaプログラムはマシン非依存のバイトコード表現に変換される。実行時には,プログラムを実行するのに必要なクラスのロード及びリンク,オプションのマシンコードの生成及びプログラムの動的最適化,並びにプログラムの実際の実行を行う。
Javaは,マシン固有の詳細な表現をサポートしていないという意味で比較的高級な言語である。Javaは,通常はガーベジコレクションを使用して,メモリの自動管理を組み込んでいる。この機能により,Cの free
,C++の delete
などの明示的な領域解放の安全性にかかわる問題を回避している。Javaのガーベジコレクションは高性能の実装であり,実行のタイミングを抑制できる。このため,システムプログラミング及びリアルタイムアプリケーションが,中断されない。Javaには,添字チェックを行わない配列アクセスなどの安全でない機能はない。それらの安全でない機能があると,プログラムが予期しない動作を行う可能性があるからである。
Javaプログラムは通常,The Java Virtual Machine Specification (Addison-Wesley, 1996)が定義しているバイトコード化された命令セット及びバイナリ形式にコンパイルされる。一般用プログラミングのための Javaの実装の多くは, The Java Application Programming Interface (Addison-Wesley, 1996)のシリーズで定義している追加パッケージをサポートする。
2.は,Javaの字句及びと構文を表すために使用する文法及び表記法を規定する。
3.は,C及び C++に基づく Javaの字句構造を規定する。Javaは, Unicode文字セットで記述されている。Javaでは,ASCIIだけを扱うシステム上で Unicode文字を使用できる。
4.は,Javaのデータ型,値及び変数を規定する。Javaのデータ型には,プリミティブ型及び参照型がある。
プリミティブ型は,すべてのマシン及び実装で同一とする定義がなされ,2の補数の整数,単精度及び倍精度の IEEE 754規格の浮動小数点数,型 boolean
,Unicode文字の型 char
などさまざまなサイズがある。プリミティブ型の値は,状態を共有しない。
Javaの参照型には,クラス型,インタフェース型及び配列型がある。参照型は,クラスのインスタンス又は配列などの,動的に作成されるオブジェクトによって実装される。各オブジェクトに対して,多数の参照を使用できる。配列を含むすべてのオブジェクトは,クラス階層の唯一の根であるクラス Object
のメソッドによって操作できる。組込みの Stringクラスは,Unicode文字列を処理できる。プリミティブ値をオブジェクト内にラップするための標準クラスがある。
変数は,型付きの記憶場所である。プリミティブ型の変数は,そのプリミティブ型の値だけを保持できる。クラス型の変数は,null参照又はそのクラス型若しくはそのクラス型のサブクラスを型としてもつオブジェクトへの参照を保持する。インタフェース型の変数は,null参照又はそのインタフェースを実装するクラスのインスタンスへの参照を保持できる。配列型の変数は,null参照又は配列への参照を保持できる。クラス型 Object
の変数は,null参照又はクラスインスタンス若しくは配列オブジェクトへの参照を保持できる。
5.は,型変換及び数値上位変換を規定する。変換は,コンパイル時の型を変更し,場合によっては式の値も変更する。数値上位変換は,演算が実行できる場合,数値演算子のオペランドを共通の型に変換するのに使用される。Java言語には抜け道はない。参照型のキャストは,実行時にチェックされ,型の安全性が保証される。
6.は,宣言及び名前,並びに名前が何を表すのかを決定するを規定する。Javaでは,型又はそのメンバを使用する前に,それらを宣言する必要はない。宣言の順序は,局所変数と,クラス又はインタフェースのフィールドにある初期化子の順番とに関してだけ意味をもつ。
Javaは,名前の有効範囲に対する制御を提供し,パッケージ,クラス及びインタフェースのメンバへの外部からのアクセスを制限する。この機能によって,大きなプログラムを作成する場合,型の実装を,それを使用する人及びそれを拡張する人から独立させることができる。プログラムを読みやすくするための標準的な名前付けの規約も,6.で規定する。
7.は,Javaプログラムの構造を規定する。Javaプログラムは,Modulaのモジュールに似たパッケージで構成される。パッケージのメンバは,コンパイル単位及びサブパッケージである。コンパイル単位は,型宣言を含み,ほかのパッケージから型をインポートして短い名前で参照できる。パッケージは,階層構造の名前空間に名前をもち,インタネットのドメインネームシステムを使用して,一意なパッケージ名を作成できる。
8.は,Javaのクラスを規定する。クラスのメンバは,フィールド (変数)及びメソッドとする。クラス変数は,クラスごとに一つだけ存在する。クラスメソッドは,特定のオブジェクトを参照しないで動作する。インスタンス変数は,クラスのインスタンスであるオブジェクト内に動的に作成される。インスタンスメソッドは,クラスのインスタンスによって呼び出される。そのインスタンスは,メソッドの実行中に現オブジェクト this
となり,オブジェクト指向プログラムのスタイルをサポートする。
クラスは,実装を単一継承する。各クラスの実装は,単一のスーパクラスの実装から派生し,最終的にはクラス Object
から派生する。クラス型の変数は,そのクラスのメンバ及びそのクラスのサブクラスのメンバを参照できるので,多態に既存のメソッドを新しい型でも使用できる。
クラスは,メソッド synchronized
によって並列プログラミングを処理する。これらのメソッドは,その実行中に発生する可能性のある例外処理をチェック例外として宣言する。これによって,例外状態を確実に処理していることをコンパイル時に確認できる。オブジェクトは,ガーベジコレクタによって廃棄される前に呼び出される メソッド finalize
を宣言でき,このメソッドによって自己状態をクリアできる。
構造を単純にするため,Javaにはクラスの実装から独立した宣言“ヘッダ”もなく,型階層構造及びクラス階層構造もない。
Javaには,パラメータ化されたクラスはないが,配列のセマンティクスは,糖衣構文(syntactic sugar)をもつパラメータ化されたクラスのものと同じとする。プログラミング言語Betaに類似して,Javaは,配列に参照を記憶する際に,実行時の型チェックを行って,型の安全性を確保する。
9.は,抽象メソッド及び定数を宣言するJavaのインタフェース型を規定する。無関係なクラスでも,同じインタフェース型を実装できる。インタフェース型の変数は,そのインタフェースを実装するオブジェクトへの参照を含むことができる。インタフェースでは,多重継承が可能である。
10.は,Javaの配列を規定する。配列アクセスには境界チェックが含まれる。配列は,動的に作成されるオブジェクトであって,型 Object
の変数に代入してよい。Javaは,多次元配列ではなく,配列の配列をサポートする。
11.は,Javaの例外を規定する。Javaの例外は,発生すると実行中の処理から制御が移り,例外の原因となったコードが再開されることはなく,例外は言語のセマンティクス及び並列メカニズムに完全に統合されている。例外には,チェック例外,実行時例外及びエラーの 3種類がある。コンパイラは,メソッド又はコンストラクタが宣言したチェック例外だけを返すことを要求して,例外が適切に処理されることを保証する。これによって,例外ハンドラの存在をコンパイル時にチェックすることが可能になり,プログラミングが著しく容易になる。ユーザが定義する多くの例外は,チェック例外である。Java仮想計算機によって検出されるプログラムの不正な処理は, NullPointerException
などの実行時例外になる。エラーは,仮想計算機によって検出された OutOfMemoryError
などの障害によって発生する。多くの単純なプログラムは,エラーの処理は試みない。
12.は,Javaプログラムの実行中に起こる動作を規定する。Javaプログラムは通常,コンパイルされたクラス及びインタフェースを表すバイナリファイルとして記憶される。これらのバイナリファイルは Java仮想計算機にロードされ,ほかのクラスとインタフェースにリンクされ,初期化される。
初期化後は,クラスメソッド及びクラス変数が使用可能になる。一部のクラスは,クラス型のオブジェクトを新しくインスタンスとして作成する。クラスのインスタンスであるオブジェクトは,そのクラスの各スーパクラスのインスタンスも含み,それらのオブジェクト作成は,これらのスーパクラスのインスタンスの再帰的作成を含む。
オブジェクトが参照されなくなると,そのオブジェクトをガーベジコレクタによって破棄してよい。オブジェクトが終了化子を宣言している場合は,オブジェクトを破棄する前に終了化子を実行して,そのままでは解放されないオブジェクトのリソースをクリアする。クラスが必要なくなった場合は,そのクラスをアンロードできる。クラス終了化子が宣言されている場合は,最初にクリア処理の機会が与えられる。オブジェクト及びクラスは,Java仮想計算機の終了時に終了化してよい。
13.は,バイナリ互換性を規定する。型を変更した場合に,その変更した型を使用しているが再コンパイルされなかった他の型にそれが及ぼす影響を示す。この問題は,インタネットなどを介して継続的にバージョンアップしながら広く配布される型を開発する場合に,考慮する必要がある。良好なプログラム開発環境では,型が変更されるとその型に依存するコードが自動的に再コンパイルされるので,ほとんどのプログラマはこの問題の詳細を考慮する必要はない。
14.は,C及び C++に基づく Javaのブロック及び文を規定する。Javaには goto
文はないが,ラベル付きの break
文及び continue
文がある。Cと異なり,Javaではフロー制御文において boolean
式が必要である。コンパイル時により多くのエラーを検出するために,型を暗黙に 型 boolean
に変換することはない。synchronized
文は,基本的なオブジェクトレベルのモニタロッキングを提供する。try
文は,catch
節及び finally
節を記述して,ローカルブロック以外への制御の移動を防ぐことができる。
15.は,Javaの式を規定する。Javaは,決定性及び移植性を向上させるための,式の (自明な)評価順序を完全に指定する。オーバロードされたメソッド及びコンストラクタは,適用可能なメソッド又はコンストラクタから最適なものを選択することによって,コンパイル時に完全に解決される。Javaは,将来性のために,Lispの CLOS, Dylanなどの優れたディスパッチ方式をもつ言語で使用されているのと同じ基本アルゴリズムを採用して,メソッド又はコンストラクタを選択している。
16.は,Javaでローカル変数の値を使用前に確実に設定する方法について細かく規定する。Javaでは,他の変数はすべて自動的にデフォルト値に初期化されるが,ローカル変数は,プログラミングの間違いを隠すことを防ぐために,自動的には初期化されない。
17.は,Javaのスレッド及びロックの意味を規定する。これらは,元々はMesaプログラミング言語で導入されたモニタを使用した並列処理に基づく。Javaは,共有メモリマルチプロセッサ用のメモリモデルを定義し,高性能の実装をサポートする。
18.は,Javaソースコードの特別な注釈からドのキュメンテーションを自動的に生成する機能を規定する。
19.は,JavaのLALR(1)構文文法を示し,この文法とそれより前の言語規定の本体で使用されていた解説的文法との違いを規定する。
20.から22.までは,核となる標準Javaアプリケーションプログラミングインタフェース (API)の参照マニュアルである。すべての一般用 Javaシステムは,これらのパッケージを含まなければならない。
20.は,パッケージ java.lang
を規定する。java.lang
で定義する型は,自動的に取り込まれ,すべての Javaプログラムで限定名を用いずに使用できる。このパッケージには,基本的なクラス Object
も含まれる。このクラスは,オブジェクト内にプリミティブ型をラップする Integer
, Float
などのクラス,言語規定及び Java仮想計算機によって定義された例外及びエラー,クラス Thread
,Class
, ClassLoader
などのメタ言語クラス,ホストシステムを抽象化するクラス System
,並びにその他の全てのクラスのスーパクラスを含む。
21.は, Hashtable
クラスや疑似乱数ジェネレータなどの,いくつかの基本的なユーティリティクラスを定義した パッケージ java.util
を規定する。
22.は,ランダムアクセスファイルやプリミティブ型の値を含むストリームなどの,基本的な入出力機能を定義したパッケージ java.io
を規定する。
この標準情報(TR)の巻末には,索引があり,1.2においてこの標準情報(TR)で引用した原典の表示がある。
この標準情報(TR)に記載されている大半のサンプルプログラムは,Javaシステムでそのまま実行でき,次の書式になっている。
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ワークステーション上では,次のコマンドを入力すると, Test.java
ファイルに保存されたこのクラスをコンパイルして実行できる。
javac Test.java java Test Hello, world.
Hello, world.
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; appears as Chapter 28 of Steele, Guy. Common Lisp: The Language, 2nd ed. Digital Press, 1990, ISBN 1-55558-041-6, 770-864.“Common Lisp” (共立出版,bit別冊,1991 ,第 2版,平田昌之翻訳監修)
Ellis, Margaret A., and Bjarne Stroustrup. The Annotated C++ Reference Manual. Addison-Wesley, Reading, Massachusetts, 1990, reprinted with corrections October 1992, ISBN 0-201-51459-1.“注解 C++リファレンスマニュアル”,アジソンウェスレイ・トッパン情報科学シリーズ 23,足立高徳・小山裕司訳
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. Reprinted in 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. Available from 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.“プログラミング言語 C第 2版”,共立出版,石田晴久訳
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, reprinted with corrections January 1994, ISBN 0-201-53992-6.
Unicode Consortium, The. The Unicode Standard: Worldwide Character Encoding, Version 1.0. Addison-Wesley, Reading, Massachusetts, Volume 1, 1991, ISBN 0-201-56788-1, and Volume 2, 1992, ISBN 0-201-60845-6. (Version 2, forthcoming, 1996.)