Javaでなぜつくるのか
概要
「10年後も通用する基本を身につけよう」のコンセプトで出版された「なぜ~」シリーズのJava版。
クラス、配列、例外等、
お作法として書いていた、
・コンパイル、リリース方法
・プログラムコードの理由、仕組み
をより理解できる様になります。
Javaの仕様
JVM
・JVMを介する事でほぼ全てのコンピュータ上でJavaプログラムを動かす事ができる。
ハードウェアベンダーはJVMを動作させる試験に合格して初めてJavaマークを表示する事ができる
・JVMを介する事でほぼ全てのOS上でJavaプログラムを動かす事ができる。
JVMは各OSの極めて基本的な機能のみに対応
JVMはほぼ全てのコンピュータ上で動作する様に作られている
「JAVA 重要用語/JavaVM」参照
現在、新しいハードが作られた際にはハードウェアメーカーは新しいJVMを開発せざるを得ない様な状況になっている。
実行方式
Javaは中間言語(classファイル)にコンパイルし、
JVMが中間言語をインタープリタ方式で実行する。
この為、純粋なコンパイラ言語より処理速度は劣るが、インタープリタ言語には勝る
しかしインタープリタ言語と同等の互換性を保てる。
方式 | コンパイラ | インタプリタ | Java |
---|---|---|---|
実行形式 | マシン語 | 言語のまま | Mix |
実行速度 | 速い | 遅い | 中間 |
命令種類 | 多い | 少ない | 中間 |
互換性 | × | ○ | ○ |
コンパイラ ハード毎に異なる |
インタープリタ ハード毎に異なる |
JVM ハード毎に異なる |
|
利用者がコンパイルする必要がある | そのまま利用可 | そのまま利用可 | |
インストール | 不要 | インタープリタが別途必要 | JVMが別途必要 |
「辞書/インタープリタ」参照
互換性
Javaの特徴
・互換性が高い
・ソフトウェア寿命が長い
Javaが普及した理由
本書発行時だけでなく2016年現在でも、Javaは業界内でトップの互換性を持っている。
それは結果的にそうなっただけでありJava言語やJVMの仕様が他のものよりも画期的に優れているという訳では無い(と思います)。
似た様な仕組みで互換性を高めようとした例は多いが全て失敗ている。
とは言えJavaは以下の理由により上述の互換性、ソフトウェア寿命の長さを実現している。
・オブジェクト指向言語である為に企業からの参画が多かった
・JCPの仕組みにより(一企業や一個人でなく)社会的に認められた機能だけが標準化される為、全ての機能に無駄が無い。
「Java重要用語/JCP」参照
・多くの人間がJavaに関わっているからこそ大手ソフトウェアベンダーがJavaの使用を中止してもJavaの使用を継続する人間が多数居る事でJavaの社会性は保たれる。
・たまたまハード面の性能向上、価格低下が急激に進んだ時期だった
等の理由により徐々にJVMに対応するハードウェアベンダーが多くなり、
多くなると対応していないベンダーは弱みになる為にそこも対応せざるを得なくなり今に至る
という流れです。
もっとも現在、PC上でプログラムを動作させるニーズは減っており、
多くはサーバー上で動作、クライアントはブラウザで操作するという形が一般的です。
クライアントにJVMは必要無い
インターネットやフロントエンド技術の普及が進んだ結果ですが、
昔からこの状況であればJavaがここまで浸透する事は無かったかも知れません。
メモリ管理
スタック領域
stack:積み重ね
メソッド呼び出し時、
・メソッドへの引数
・メソッドからメソッドを呼ぶ場合の戻り値
・そのメソッド内で宣言されるローカル変数
等の最低限必要なデータを確保する
そのメソッドを抜けると削除される(上書きされる)
メソッドを終了すると使えない(システムが自動管理)
大量のデータを扱えない
ヒープ領域
stack:積み重ね
Java、.Netではインスタンスが置かれるメモリ領域
・メソッド間で引き渡し可能
・大量操作可能
・削除可能
プログラム領域
・ソースコード
・リテラル
等が保存される領域
他言語との違い
C言語 | Java | |
---|---|---|
オブジェクトの作成場所 | ・スタック ・ヒープ どちらにでも置ける |
ヒープのみ |
オブジェクトのポインタ操作 | ○ P* p = ~; p += 100; |
× |
オブジェクト変数への代入値 | 別の型:○ P* p = "Java" |
別の型:× |
オブジェクトの破棄 | 手動 | 自動(ガベージコレクション) |
「ポインタの問題点」参照
配列
C言語 | Java | |
---|---|---|
扱い | 自由 | オブジェクト =ヒープ領域にしか置けない =ガベージコレクションの対象 |
index数を超えた操作 | ○ | × IndexOutOfBoundsException |