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_heap

スタック領域

stack:積み重ね
メソッド呼び出し時、
・メソッドへの引数
・メソッドからメソッドを呼ぶ場合の戻り値
・そのメソッド内で宣言されるローカル変数
等の最低限必要なデータを確保する
そのメソッドを抜けると削除される(上書きされる)
メソッドを終了すると使えない(システムが自動管理)
大量のデータを扱えない

ヒープ領域

stack:積み重ね
Java、.Netではインスタンスが置かれるメモリ領域
・メソッド間で引き渡し可能
・大量操作可能
・削除可能

プログラム領域

・ソースコード
・リテラル
等が保存される領域

他言語との違い

C言語 Java
オブジェクトの作成場所 ・スタック
・ヒープ
どちらにでも置ける
ヒープのみ
オブジェクトのポインタ操作
P* p = ~;
p += 100;
×
オブジェクト変数への代入値 別の型:○
P* p = "Java"
別の型:×
オブジェクトの破棄 手動 自動(ガベージコレクション)

ポインタの問題点」参照

配列

stack_heap2

C言語 Java
扱い 自由 オブジェクト
=ヒープ領域にしか置けない
=ガベージコレクションの対象
index数を超えた操作 ×
IndexOutOfBoundsException