資格

Java Bronze資格対策|プログラムの流れ

palm

こんにちは!Palmです。

Java Bronzeという資格に向けての学習していこうかと思います。
前回はJavaの基本について勉強しましたが、今回は流れについて勉強していこうかと思います。

コーディングちゃん
コーディングちゃん

このブログに向いている人

  • Javaを初めて学ぶ
  • 基本を復習したい

Java Bronze資格とは

Java Bronze資格(正式名称は「Oracle Certified Java Programmer, Bronze SE」)は、Oracleが提供するJavaプログラミングに関する初級資格です。

この資格は、Javaの基本的な知識とスキルを証明するものであり、これからJavaプログラミングを学び始める人や、基本をしっかり押さえたい人に適しています。         

外部リンク
Java Bronze公式サイト
Java Bronze公式サイト

Javaの基本的な流れ

今日はJavaの流れを学習していこうかと思います!

Javaは1995年にSun Microsystemsによって開発され、現在はOracleが管理しています。

前回のブログです、基本を知りたいかたはぜひ!

合わせて読みたい
Java Bronze資格対策|言語の特徴
Java Bronze資格対策|言語の特徴

実行時コンパイル方式

ソースコードは人間が理解しやすいように記述するものであって、プログラムが実行しやすいかどうか、効率よく実行できるかどうかという観点で記述するものではありません。

そこで、ソースコードから不要なコードを排除し、パフォーマンスが向上するようにコードを変換しておくインタープリタ方式の1つ実行時コンパイル方式です。

実行時コンパイル方式では、コンパイラによって実行に最適化されたコードに変換されているため、インタープリタ方式でもパフォーマンスが低下しにくいという特徴があります。

デジタリアちゃん
デジタリアちゃん

「実行時コンパイル方式」は、ソースコードを実行時に最適化して機械語に変換し、パフォーマンスを向上させるよ!!

JavaのJVM(Java Virtual Machine)は、実行時コンパイル方式であるHotspot VMを導入しています。

この技術により、Javaプログラムは実行時に最適化され、事前コンパイル方式に匹敵するほどの高いパフォーマンスを実現しています。

これまでのプログラミング言語の実行方式まとめ

  1. 事前コンパイル方式
    • プログラムを実行前に機械語に変換し、高速な実行を可能にします。
    • 代表的な言語:C言語、C++。
  2. インタープリタ方式
    • プログラムを実行時に一行ずつ解釈して実行します。
    • 開発サイクルが短く、デバッグが容易ですが、実行速度が遅くなりがちです。
    • 代表的な言語:Python、Ruby、JavaScript。
  3. 実行時コンパイル方式
    • ソースコードを実行時に最適化して機械語に変換し、パフォーマンスを向上させます。
    • インタープリタ方式の利便性と事前コンパイル方式の高速実行の利点を兼ね備えています。
    • 代表的な言語:Java
デジタリアちゃん
デジタリアちゃん

Javaは、これらの実行方式の利点を組み合わせたハイブリッドアプローチを採用しています!!

中間コード

Javaの実行時コンパイル方式では、コンパイラによって変換されたコード中間コードと呼びます。

中間コードは、より効率が良いコードへの最適化だけでなく、変換効率をあげるために2進数で表現されるバイトコードで最適化されています。

クラスファイルは、この中間コードが記述されたファイルのことを指します。

Javaプログラムの作成から実行までの流れ

  • コンパイル:ソースコードが中間コード(バイトコード)にコンパイルされる。
  • 実行:JVMがクラスファイルを読み込み、実行時に最適化しながら機械語に変換して実行する。

クラスファイル

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ガベージコレクション後(コンパクション後)
  1. 初期状態:メモリ領域にはオブジェクトA、オブジェクトB、オブジェクトCが配置され、いくつかの空き領域があります。
  2. ガベージコレクション前:オブジェクトBは不要になり、ガベージコレクションが実行される前の状態です。
  3. ガベージコレクション後(コンパクション前):ガベージコレクションによって不要なオブジェクトBが解放され、空き領域ができました。
  4. ガベージコレクション後(コンパクション後):コンパクションによって、空き領域が連続するようにメモリが再配置され、効率的なメモリ使用が実現されます。

ガベージコレクションは、「ガベージコレクタ」とよばれるJVMの機能が実行します。ガベージコレクションは、ガベージコレクタのアルゴリズムに従って実行されるため、プログラマーがメモリ解放のタイミングを制御することはできません。

また、ガベージコレクタには、「コンパクション」機能があり、メモリ断片化を防ぎ、連続したメモリ領域を確保します。これにより、効率的なメモリ使用が実現されます。

Javaのメモリ

  • 自動的にメモリを解放する
  • メモリの効率的な利用を自動化する

エントリーポイント

クラスには複数のメソッドを定義できます。このとき、どのメソッドから処理を始めるのかが決まっていなくてはいけません。処理を始めるためのメソッドのことエントリーポイントと言います。

JVMは、Javaコマンドで指定されたクラスを読み込み、そのクラスに定義されているエントリーポイントから処理を始めます。

Javaでは、エントリーポイントとなるメソッドの定義が決められており、プログラマーが自由に決めることはできません。エントリーポイントは次のように記述します。

1public static void main(String[] args) {
2    // プログラムの処理
3}

上記のコード例のうち、変更できるのは引数名「args」の部分だけで、その他の部分は変更できません。引数名の部分は単なる変数名の宣言にすぎないため、命名規則に従っていれば自由に変更可能です!

エントリーポイントの要素

  1. public: 公開されていること。
  2. static: クラスのインスタンスを作成しなくても実行できること。
  3. void: メソッドが値を返さないことを示します。(戻り値は戻せない)
  4. main: エントリーポイントのメソッド名で、JVMがこのメソッドから処理を開始します。
  5. String[] args: 引数はString[](配列型)を1つ受け取ること
コーディングちゃん
コーディングちゃん

エントリーポイントは、そのメソッド名がmainと決められていることから、「mainメソッド」とも呼ばれているよ!

エントリーポイントの引数には、String配列型だけでなく、次のように可変長引数のString型を受け取ることもできます。これは、可変長の引数はコンパイル時に配列型の引数に変換されるためです。

1public static void main(String... args) {
2    // プログラムの処理
3}

アプリケーションのエンドリーポイントとなるメソッドの条件

  • publicであること
  • staticであること
  • 引数はString配列型もしくはString型の可変長引数であること

ソースファイル

ソースファイルには、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のソースファイル

  • ソースファイルの名前はpublicなクラス名と一致させなくてはいけない。
  • 1つのソースファイル内に、デフォルトのアクセス修飾子で修飾したインターフェースとpublicなクラスの両方を記述できる。

まとめ

このように、Javaの基本的な実行流れと関連する重要な概念について学ぶことで、Javaプログラミングの理解が深まります。次回も引き続き、Javaに関する知識を学んでいきましょう。

最後まで読んでいただきありがとうございました!!

スポンサーリンク
ABOUT ME
Palm
Palm
東京通信大学3年生
私はpalm(ぱるむ)です。お花や自然が大好きです。専門学校でWeb開発を学び、東京通信大学に編入しました。得意分野は、ウェブ開発(フロントエンド、バックエンド)や機械学習(自然言語、データ分析)です。趣味で色々デモ開発をしています。
記事URLをコピーしました