JavaTM は、次の特徴を持つ最近開発されたコンカレントなクラスをベースとしたオブジェクト指向のプログラミング言語です。
簡単。C++ 言語に似ていますが、C および C++ 言語のより複雑な機能の大部分は取り除かれています。Java は、以下の機能は提供していません。
プログラマが制御する動的メモリ
ポインタ演算
構造体
Typedefs
#define
オブジェクト指向。Java は、C++ 言語の基本オブジェクト技術を提供していますが、一部は強化し、一部は削除しています。
アーキテクチャとして独立。Java のソースコードは、アーキテクチャに依存しないオブジェクトコードにコンパイルされます。オブジェクトコードは、Java 実行時システムによって解釈されます。
移植性。Java は、最新の移植性標準を実装しています。たとえば、int は常に 32 ビットの 2 の補数となる整数です。ユーザインタフェースは、Solaris およびその他のオペレーティング環境に容易に実装される抽象化されたウィンドウシステムを通して構築されます。
分散型。Java には広範な TCP/IP ネットワーキング機能があります。ライブラリルーチンは、ハイパーテキスト転送プロトコル (HTTP) やファイル転送プロトコル (FTP) などのプロトコルをサポートしています。
堅牢。Java コンパイラと Java インタプリタの両方とも、広範なエラーチェックをサポートしています。Java がすべての動的メモリを管理し、配列境界をチェックし、その他の例外をチェックします。
安全。不当なメモリアクセスとなることも多い C および C++ 言語の機能は、Java 言語にはありません。インタプリタは、コンパイルされたコードにもいくつかのテストを実施し、不当なコードがないかチェックします。これらのテスト後、コンパイルされたコードは、オペランドスタックのオーバーフローやアンダーフローを発生させず、不当なデータを変換しないで、正当なオブジェクトフィールドのアクセスだけを実行します。さらに、すべてのオペコードパラメタの型は正当です。
高性能。アーキテクチャに依存しないマシン語に似た言語にプログラムをコンパイルするため、Java プログラムのインタプリタは小さく効率的になります。将来的には Java 環境は、実行時に Java バイトコードをネイティブなマシンコードにアセンブルもします。
マルチスレッド化。マルチスレッドは、Java 言語の中に組み込まれています。ユーザの処置を処理している間にイメージのロードなどを操作できるようにし、対話型処理の性能を向上させることができます。
動的。Java は、実行時まで呼び出されるモジュールをリンクしません。
Java のプログラミングは、テキストエディタ、make(1S)、および以下のものによって Solaris Java Virtual Machine (以降 Solaris Java VM とします) でサポートされています。
javac |
Java コンパイラ。Java ソースコードファイル (name.java) インタプリタ (java(1)) が処理できるバイトコードファイル (name.class) に翻訳する。Java アプリケーションと Java アプレットの両方がコンパイルされる。 |
javald |
ラッパージェネレータ。Java アプリケーションのコンパイルと実行に必要な環境を取り込むラッパーを作成する。ラッパーが呼び出されるまで指定されたパスが結合されないので、ラッパーは JAVA_HOME および CLASSPATH パスの再配置を考慮している。 |
java |
Java インタプリタ。コマンドとして呼び出して Java アプリケーションを実行したり、HTML コードによってブラウザから呼び出してアプレットを実行したりできる。 |
appletviewer |
Java アプレットビューワ。このコマンドは、指定されたドキュメントまたは資源を表示し、ドキュメントが参照している各アプレットを実行する。 |
javap |
Java クラスファイルの逆アセンブラ。javac によってコンパイルされたバイトコードのクラスファイルを逆アセンブルし、結果を標準出力に出力する。 |
javah |
C ヘッダおよびスタブファイルジェネレータ。指定されたクラスごとに、classname.h という名前のヘッダファイルを作成してカレントディレクトリに入れる。またオプションで、C ソーススタブファイルを生成する。 |
make(1S) の使用方法については、『プログラミングユーティリティ』を参照してください。
通常の Java 環境変数は、次のとおりです。
変数 |
説明 |
---|---|
JAVA_HOME |
Java ソフトウェアのベースディレクトリのパス。たとえば、javac、java、appletviewer、javap、javah は、すべて $JAVA_HOME/bin にある。Solaris Java VM を使用するために設定する必要はない。 |
CLASSPATH |
アプリケーションおよびアプレットで使用するためのコンパイル済み *.class ファイルを持つディレクトリへのパスがコロン (:) で区切られたリスト。javac、java、javap、javah によって使用される。設定しないと、すべての Solaris Java VM 実行可能ファイルは、/usr/java/lib/classes.zip をデフォルトとする。Solaris Java VM を使用するために設定する必要はない。 |
PATH |
通常の実行可能ファイル検索リストに、$JAVA_HOME/bin を入れることができる。 |
Java VM ツールは /usr/java/bin にインストールされ、各実行可能ファイルへのシンボリックリンクは、/usr/bin に格納されます。これは、新たにインストールされる Java VM パッケージを使用するためにユーザの PATH 変数に何も追加する必要がないことを意味します。また、すべての Java VM 実行可能ファイルは、パス /usr/java/lib/classes.zip をデフォルトとして標準 Java クラスライブラリを見つけます。
ベース Java プログラミング環境は、デバッガを提供していません。デバッガは、別売りの Java WorkShopTM パッケージに含まれています。
Java プログラムは、アプリケーションとアプレットという 2 つの形式で作成されます。
Java アプリケーションを実行するには、コマンド行から Java インタプリタを呼び出し、コンパイル済みアプリケーションを持つファイルを指定します。
Java アプレットは、ブラウザから呼び出します。ブラウザによって解釈される HTML コードは、コンパイル済みアプレットを持つファイル名を指定します。こうすると、ブラウザは Java インタプリタを呼び出し、インタプリタがアプレットをロードして実行します。
例 2-1 は、"Hello World" を標準出力に表示するだけのアプリケーションのソースです。メソッドは、呼び出し時に引数を受け入れますが、それらを使用して何も行いません。
// // HelloWorld Application // class HelloWorldApp{ public static void main (String args[]) { System.out.println ("Hello World"); } }
C と同様に最初に実行されるメソッド、すなわち関数は main として識別されます。キーワード public によって、メソッドは誰でも実行できます。static は main に HelloWorldApp クラスを参照させ、クラスの他のどのインスタンスも参照させません。void は main が何も戻さないことを示し、args[] は String 型の配列を宣言しています。
アプリケーションは、次のようにコンパイルします。
$ javac HelloWorldApp.java |
また、次のように実行します。
$ java HelloWorldApp arg1 arg2 ... |
例 2-2 は、例 2-1 のアプリケーションと同等のアプレットのソースです。
// // HelloWorld Applet // import java.awt.Graphics; import java.applet.Applet; public class HelloWorld extends Applet { public void paint (Graphics g) { g.drawstring ("Hello World", 25, 25); } }
アプレットでは、参照されているすべてのクラスを明示的に取り込ま (import) なければなりません。キーワード public と void は、アプリケーションの場合と同じことを意味しています。extends は、HelloWorld クラスが Applet クラスから継承することを示しています。
アプレットは、次のようにコンパイルします。
$ javac HelloWorld.java |
アプレットは、HTML コードによってブラウザで呼び出されます。アプレットを実行するための最小限の HTML ページは次のとおりです。
<title>Test</title> <hr> <applet code="HelloWorld.class" width=100 height=50> </applet> <hr>
Java アプリケーションを正しく実行するには、JAVA_HOME、CLASSPATH、および LD_LIBRARY_PATH 環境変数を正しく設定する必要があります。これらの環境変数の値は、各ユーザによって制御されるため、パスが通常とは異なるように任意のパスに設定できます。また、通常、アプリケーションは CLASSPATH 変数に独自の値が必要です。
javald(1) は、Java アプリケーションのためのラッパーを生成するコマンドです。ラッパーは、JAVA_HOME、CLASSPATH、および LD_LIBRARY_PATH 環境変数のいずれか、またはすべての正しいパスを指定できます。パスを指定しても、これらの環境変数のユーザの値には影響しません。Java アプリケーションの実行中は、これらの環境変数のユーザの値を無効にします。さらにラッパーは、Java アプリケーションが実際に実行されるまで指定されたパスが結合されないことを保証するので、アプリケーションの再配置性が最大になります。
Java プログラミング言語は、マルチスレッド化されたプログラムのサポートを想定しています。すべての Java インタプリタは、マルチスレッド化されたプログラミング環境を提供しています。しかし、これらのインタプリタの多くは、マルチスレッドの単一プロセッサ形式しかサポートしていません。そのため、マルチプロセッサ上で実行する従来の Java インタプリタでの Java プログラムのスレッドは、完全に並行には実行されず、実際には一度に 1 つのスレッドしか実行していません。
Solaris Java VM インタプリタは、複数プロセッサのコンピューティングシステムをすべて利用しています。このインタプリタは、単一プロセスの複数スレッドを複数の CPU に同時にスケジュールできるイントリンシクス Solaris マルチスレッド機能を使用します。このため、マルチスレッド化された Java プログラムは、Solaris Java VM の元で実行すると、その並行性の程度が著しく向上します。
図 2-1 は、Java スレッドが Solaris Java VM の元でどのように動作するかを示しています。Solaris スレッドの動作については、『マルチスレッドのプログラミング』を参照してください。
並行化されたマトリックス乗算などの計算のアプリケーションなどで、Solaris スレッドを十分に活用するには、Solaris のネイティブ関数 thr_setconcurrency(3T) を使用します。これにより Solaris 本来のマルチスレッド機能が Java アプリケーションで使用でき、複数プロセッサを完全に利用することが保証されます。これは、ほとんどの Java アプリケーションおよびアプレットには必要ありません。次のコードは、これをどのように行うかの例です。
最初の要素は、MPtest_NativeTSetconc() を使用する Java アプリケーション MPtest.java です。このアプリケーションは 10 個のスレッドを生成し、各スレッドは識別行を表示してから 10,000,000 回ループし、計算の多い活動のシミュレーションを行います。
import java.applet.*; import java.io.PrintStream; import java.io.*; import java.net.*; class MPtest { static native void NativeTSetconc(); static public int THREAD_COUNT = 10; public static void main (String args[]) { int i; // set concurrency on Solaris - sets it to sysconf(_SC_NPROCESSORS_ONLN); NativeTSetconc(); // start threads client_thread clients[] = new client_thread[ THREAD_COUNT ]; for ( i = 0; i < THREAD_COUNT; ++i ){ clients[i] = new client_thread(i, System.out); clients[i].start(); } } static { System.loadLibrary("NativeThreads"); } } class client_thread extends Thread { PrintStream out; public int LOOP_COUNT = 10000000; client_thread(int num, PrintStream out){ super( "Client Thread" + Integer.toString( num ) ); this.out = out; out.println("Thread " + num); } public void run () { for( int i = 0; i < this.LOOP_COUNT ; ++i; ) { ; } } } |
2 番目の要素は、javah(1) ユーティリティによって MPtest.java から生成される C スタブファイル MPtest.c です。これを行うには、次のように入力します。
% javah -stubs MPtest.java |
3 番目の要素は、同様に javah(1) ユーティリティによって MPtest.java から生成される C ヘッダファイル MPtest.h です。これを行うには、次のように入力します。
% javah MPtest.java |
4 番目の要素は、C ライブラリインタフェースの呼び出しを実行する C 関数 NativeThreads.c です。
#include <thread.h> #include <unistd.h> void MPtest_NativeTSetconc(void *this) { thr_setconcurrency(sysconf(_SC_NPROCESSORS_ONLN)); }
最後に、4 つのファイルを Java アプリケーション MPtest.class に結合するには、次のような makefile を使用して非常に簡単に実行できます。
Java WorkShop (JWS) は、SunSoft DevPro の別パッケージ製品です。JWS は Java で実装されており、独自の Java インタプリタを使用します。JWS は、Portfolio Manager、Project Manager、Source Editor、Build Manager、Source Browser、Debugger、Project Tester、オンラインヘルプ、および Visual Java の 9 個のアプリケーションから構成されています。
Portfolio Manager |
Java プロジェクトのポートフォリオの作成とカスタマイズを行う。このアプリケーションは、新しいアプレットとアプリケーションを作成する元となるオブジェクトとアプレットの集合を管理する。 |
Project Manager |
プロジェクトの設定を変更し、ディレクトリを設定する。コンポーネントへのパスの位置と設定の編成と保存を行う。 |
Source Editor |
ソースコードの作成と編集を行うためのポイント&クリックツール。Java WorkShop のコンポーネントは、プロセスの作成、コンパイル、およびデバッグで頻繁に Source Editor を呼び出す。 |
Build Manager |
Java ソースコードを Java バイトコードにコンパイルし、ソースにあるエラーを見つける。Source Editor を起動すると、Build Manager はソースコードの訂正箇所にリンクするので、訂正やコンパイルを非常に素早く実行できる。 |
Source Browser |
プロジェクトにあるすべてのオブジェクトのクラス継承を示すツリーダイアグラムを表示する。また、プロジェクトにあるすべてのコンストラクタと通常のメソッドをリストし、文字列とシンボルを検索できるようにする。Source Browser は、Source Editor にリンクしてコードを表示する。 |
Debugger |
デバッグプロセスの制御と管理を行うためのツール群を提供する。コントロールパネルの元でアプリケーションまたはアプレットを実行すると、スレッドの停止と再開、ブレークポイントの設定、例外のトラップ、スレッドのアルファベット順表示、およびメッセージの参照を行うことができる。 |
Project Tester |
アプレットビューワと同様に、Project Tester を使用して、アプレットの実行とテストを行うことができる。Build Manager を使用してアプレットをコンパイルしてから、Project Tester を使用して実行する。 |
オンラインヘルプ |
「目次」、「索引」、「チュートリアル」、「プロジェクトの管理」、「ソースコードの編集」、「プロジェクトの構築」「Visual Java」、「ソースの表示」、および「プロジェクトのデバッグ」で構成されている。 |
Visual Java |
カスタマイズ可能なプレビルト GUI 画像ウィジェトのパレットがあるポイント&クリックインタフェースを持つ統合 Java GUI ビルダ |