Java Bronze資格対策|プログラムの流れ
こんにちは!Palmです。
Java Bronzeという資格に向けての学習していこうかと思います。
前回はJavaの基本について勉強しましたが、今回は流れについて勉強していこうかと思います。
このブログに向いている人
- Javaを初めて学ぶ
- 基本を復習したい
Java Bronze資格とは
Java Bronze資格(正式名称は「Oracle Certified Java Programmer, Bronze SE」)は、Oracleが提供するJavaプログラミングに関する初級資格です。
この資格は、Javaの基本的な知識とスキルを証明するものであり、これからJavaプログラミングを学び始める人や、基本をしっかり押さえたい人に適しています。
Javaの基本的な流れ
今日はJavaの流れを学習していこうかと思います!
Javaは1995年にSun Microsystemsによって開発され、現在はOracleが管理しています。
前回のブログです、基本を知りたいかたはぜひ!
実行時コンパイル方式
ソースコードは人間が理解しやすいように記述するものであって、プログラムが実行しやすいかどうか、効率よく実行できるかどうかという観点で記述するものではありません。
そこで、ソースコードから不要なコードを排除し、パフォーマンスが向上するようにコードを変換しておくインタープリタ方式の1つが「実行時コンパイル方式」です。
実行時コンパイル方式では、コンパイラによって実行に最適化されたコードに変換されているため、インタープリタ方式でもパフォーマンスが低下しにくいという特徴があります。
「実行時コンパイル方式」は、ソースコードを実行時に最適化して機械語に変換し、パフォーマンスを向上させるよ!!
JavaのJVM(Java Virtual Machine)は、実行時コンパイル方式である「Hotspot VM」を導入しています。
この技術により、Javaプログラムは実行時に最適化され、事前コンパイル方式に匹敵するほどの高いパフォーマンスを実現しています。
これまでのプログラミング言語の実行方式まとめ
- 事前コンパイル方式:
- プログラムを実行前に機械語に変換し、高速な実行を可能にします。
- 代表的な言語:C言語、C++。
- インタープリタ方式:
- プログラムを実行時に一行ずつ解釈して実行します。
- 開発サイクルが短く、デバッグが容易ですが、実行速度が遅くなりがちです。
- 代表的な言語:Python、Ruby、JavaScript。
- 実行時コンパイル方式
- ソースコードを実行時に最適化して機械語に変換し、パフォーマンスを向上させます。
- インタープリタ方式の利便性と事前コンパイル方式の高速実行の利点を兼ね備えています。
- 代表的な言語:Java。
Javaは、これらの実行方式の利点を組み合わせたハイブリッドアプローチを採用しています!!
中間コード
Javaの実行時コンパイル方式では、コンパイラによって変換されたコードを「中間コード」と呼びます。
中間コードは、より効率が良いコードへの最適化だけでなく、変換効率をあげるために2進数で表現されるバイトコードで最適化されています。
クラスファイルは、この中間コードが記述されたファイルのことを指します。
Javaプログラムの作成から実行までの流れ
クラスファイル
Javaは実行時コンパイル方式を採用しています。コンパイル後に生成されるクラスファイルには、「中間コード」と呼ばれる実行に最適化されたコードが記述されています。
JVMはこの中間コードを読み込み、機械語にコンパイルして実行します。
JVMはこのクラスファイルを読み込み、実行時に中間コードをネイティブコード(特定のプロセッサの機械語)にコンパイルして実行します。
ネイティブコードは特定のプロセッサ固有のものであるため、プラットフォームに依存します。そのため、プラットフォームに依存しないネイティブコードというものは存在しません。
Javaはクラスファイルの中間コードをJVMでネイティブコードに変換し実行します!
Javaのクラスファイルについて
クラスファイル:JVMだけが理解できるコードが記述されている
ガベージコレクション
メモリは有限なリソースであり、無尽蔵に使えるわけではありません。メモリ不足は、処理速度の低下、エラー、システムの突然終了、さらにはOSのトラブルへと発展する可能性があります。ソフトウェアの安全稼働には、使わなくなったメモリ領域を解放し、プログラム実行に必要な空きメモリを確保することが重要です。
この問題を解決するため、Javaはガベージコレクションという自動メモリ管理機能を備えています。
ガベージコレクションは、不要になったメモリ領域を自動的に検出して解放する機能です。この機能により、プログラマーは手動でメモリ管理を行う必要がなくなり、より生産的な作業に集中できるようになりました。
Javaはガベージコレクションで不要なメモリを自動解放するんだね!
1メモリ領域
2+-----------------------------------+
3| オブジェクトA | オブジェクトB | オブジェクトC | 空き領域 |
4+-----------------------------------+
5
6ガベージコレクション前
7
8メモリ領域
9+-----------------------------------+
10| オブジェクトA | 空き領域 | オブジェクトC | 空き領域 |
11+-----------------------------------+
12
13ガベージコレクション後(コンパクション前)
14
15メモリ領域
16+-----------------------------------+
17| オブジェクトA | オブジェクトC | 空き領域 |
18+-----------------------------------+
19
20ガベージコレクション後(コンパクション後)
- 初期状態:メモリ領域にはオブジェクトA、オブジェクトB、オブジェクトCが配置され、いくつかの空き領域があります。
- ガベージコレクション前:オブジェクトBは不要になり、ガベージコレクションが実行される前の状態です。
- ガベージコレクション後(コンパクション前):ガベージコレクションによって不要なオブジェクトBが解放され、空き領域ができました。
- ガベージコレクション後(コンパクション後):コンパクションによって、空き領域が連続するようにメモリが再配置され、効率的なメモリ使用が実現されます。
ガベージコレクションは、「ガベージコレクタ」とよばれるJVMの機能が実行します。ガベージコレクションは、ガベージコレクタのアルゴリズムに従って実行されるため、プログラマーがメモリ解放のタイミングを制御することはできません。
また、ガベージコレクタには、「コンパクション」機能があり、メモリ断片化を防ぎ、連続したメモリ領域を確保します。これにより、効率的なメモリ使用が実現されます。
Javaのメモリ
エントリーポイント
クラスには複数のメソッドを定義できます。このとき、どのメソッドから処理を始めるのかが決まっていなくてはいけません。処理を始めるためのメソッドのことをエントリーポイントと言います。
JVMは、Javaコマンドで指定されたクラスを読み込み、そのクラスに定義されているエントリーポイントから処理を始めます。
Javaでは、エントリーポイントとなるメソッドの定義が決められており、プログラマーが自由に決めることはできません。エントリーポイントは次のように記述します。
1public static void main(String[] args) {
2 // プログラムの処理
3}
上記のコード例のうち、変更できるのは引数名「args」の部分だけで、その他の部分は変更できません。引数名の部分は単なる変数名の宣言にすぎないため、命名規則に従っていれば自由に変更可能です!
エントリーポイントの要素
エントリーポイントは、そのメソッド名がmainと決められていることから、「mainメソッド」とも呼ばれているよ!
エントリーポイントの引数には、String配列型だけでなく、次のように可変長引数のString型を受け取ることもできます。これは、可変長の引数はコンパイル時に配列型の引数に変換されるためです。
1public static void main(String... args) {
2 // プログラムの処理
3}
アプリケーションのエンドリーポイントとなるメソッドの条件
ソースファイル
ソースファイルには、publicで修飾されたクラスやインタフェース、列挙型を1つしか記述できません。
ソースファイルの名称はpublicなクラスの名前、インタフェース名、列挙型名のいずれかと一致させなければなりません。名称が一致しない場合、コンパイルエラーが発生します。
例えば、次のSampleクラスを「sample.java(最初のSが小文字)」として保存すると、以下のようなコンパイルエラーが発生します。
Sampleクラス:
1public class Sample {
2 public static void main(String[] args) {
3 System.out.println("Hello, World!");
4 }
5}
保存名が「sample.java」の場合のコンパイルエラー:
1Error: class Sample is public, should be declared in a file named Sample.java
ソースファイルには、publicなクラスやインタフェース、列挙型は1つしか記述できませんが、それ以外のアクセス修飾子を持つものであれば複数記述できます。
例えば、次のコードのようにSampleクラスとTestクラスを1つのソースファイルに記述することが可能です。
1public class Sample {
2 public static void main(String[] args) {
3 System.out.println("Hello, World!");
4 }
5}
6
7class Test {
8 // Testクラスの定義
9}
ソースファイル内に複数のクラスを定義した場合でも、コンパイルするとクラスファイルはそれぞれクラスごとに出力されます。そのため、前述のソースファイル(Sample.java)をコンパイルするとSample.classとTest.classの2つのクラスファイルが出力されます。
ただし、このように1つのファイルに複数の複数のクラスを記述することは推奨されていません
Javaのソースファイル
まとめ
このように、Javaの基本的な実行流れと関連する重要な概念について学ぶことで、Javaプログラミングの理解が深まります。次回も引き続き、Javaに関する知識を学んでいきましょう。
最後まで読んでいただきありがとうございました!!