Java の mainメソッドが、エントリーポイントって言うのは分かったけど、結局どういうこと?

f:id:ts0818:20190711212002j:plain

ハドリアヌスの長城ハドリアヌスのちょうじょう、英語Hadrian's Wallラテン語Vallum Aelium)は、イギリスの北部にあるローマ帝国時代の城壁(囲壁)跡。広義にはローマ帝国の国境線を防御する防御壁『リメス』の一部であり、ローマ帝国最北端の国境線でもある。2世紀に第14代ローマ皇帝ハドリアヌスにより建設された。

ハドリアヌスの長城は1987年に、ユネスコ世界遺産文化遺産)に登録された。

ハドリアヌスの長城 - Wikipedia

無料の写真サイト「Pixabay」で、『システム』で検索した中の写真の1枚が、『ハドリアヌスの壁』という...あ、どうもボクです。

Java の起動の仕組みが今でもモヤっとしている今日この頃です。というわけで、今回も Java の話で。

 

エントリポイントとは?

Wikipediaさんによりますと、 

エントリーポイントとは、プログラムを実行するうえで、プログラムやサブルーチンの実行を開始する場所のこと。プログラム全体のエントリーポイントとなる場所を含むルーチンがメインルーチンである。C言語の標準では、mainという名前の関数(の先頭)がエントリーポイントであり、各関数のエントリーポイントは、それぞれの関数の先頭である。

エントリーポイント - Wikipedia

⇧  ということらしいっす。

スクリプト言語BASICなど、ソースコードの先頭から実行していく言語も少なくない。それらにおけるエントリーポイントはソースコードの先頭である。アセンブリ言語では、通常は言語としてはエントリーポイントを決めず、OSやリンケージエディタローダなどの規定をそのまま引き継ぐか、それらに対しエントリーポイントを指定する。

プラグインライブラリには複数のエントリーポイントが存在し、それを呼び出すことで外部からサブルーチンが実行できる。

エントリーポイント - Wikipedia

んで、

各種プログラミング言語のエントリーポイント

エントリーポイント - Wikipedia

⇧  ってなってるんで、Java の場合、「main」メソッドが、『プログラム全体のエントリーポイント』であり、『「main メソッド」を含むクラス』が『メインルーチン』ということになりそうですかね。

 

main メソッドを実行するのは、誰?

ここで、当然、疑問が湧くわけですよ。main メソッドがエントリーポイントっつうのは分かったけども、誰がそのメソッドを実行してるのよ?

Wikipediaさんによりますと、

⇧ となっており、もうちょい詳しい説明では、

Javaのプラットフォーム非依存性は、次のようにして実現されている。

Java - Wikipedia

⇧  「ほとんどの」って言葉がむちゃくちゃモヤモヤするけども、Java は、

って流れになるのだと...

qiita.com

 

ちょっと待ってくださいな!

Java仮想マシン、巷では、JVMで呼ばれると思いますが、JVMはいつ動くのよ?何で始めから動いてる前提なのよ?

勝手にしやがれ(監督:ジャン=リュック・ゴダール)』って...勝手に動くわけないでしょうに!

というわけで、

qiita.com

⇧  上記サイト様が詳しいです。

「JNI_CreateJavaVM()」っていう関数が呼び出されると、JVMが生成され、起動するのだと。

docs.oracle.com

VMの生成

JNI_CreateJavaVM()関数はJava VMをロードして初期化し、JNIインタフェース・ポインタへのポインタを返します。 JNI_CreateJavaVM()を呼び出したスレッドは、メイン・スレッドとみなされます。

Javaネイティブ・インタフェース仕様: 5 - 呼び出しAPI

⇧  あれ?

でも、JNI(Java Native Interface)って 、  

Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他のプログラミング言語(たとえばCC++など)で書かれた、実際のCPU上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。Java言語からネイティブコードを利用するためのABIと、逆にネイティブコードからJavaバイトコードを動作させるためにバーチャルマシン (VM) を利用するためのAPIの2つから成る。

Java - Wikipedia

⇧  って説明だけど、普通にJavaだけ使う場合のJVM起動も、JNIが使われるんですね...

java.exe、javaw.exe、jvm.dllの違い - コードログ

⇧  上記サイト様によりますと、 

  • jvm.dll  ← Windows 用のDLL
  • java.exe  ← DLL のラッパー
  • javaw.exe  ← java.exe のラッパー

が、JVMの実装だよ、と。(Windows の場合の説明だけど、Windows 以外のOSだとどうなるんですかね?)

なんで、おそらく、上記のファイルの中のコーディングで、「JNI_CreateJavaVM()」が実装されているってことですかね...

ほんと、切に願うのだけれど、このへんの仕組みを図解した資料とか有識者の人が誰か作ってくれないかな...

 

JVMを起動するのは、誰?

JVM の生成、起動なんかが、「jvm.dll」「java.exe」「javaw.exe」のいずれか、もしくは全部で行われているのかは分かりませんが、これらの実行ファイルは、いつ、どのタイミングで、誰によって実行されるん?

もう、このへんの説明が見つからなさ過ぎて、推測するしかないんだけど、

  1. シェル(コマンドプロンプトなど)で実行
  2. APIサーバ(Javaだと、Tomcatなんかが代表的)で実行
  3. サーバレス(関数とか。AWS Lamdaが有名?)で実行

のいずれか?になるかと。

Eclipse なんかのIDE統合開発環境)も、1 ~ 3 のどれかでやってるのかな?(Eclipseブラックボックス過ぎて分からん...)

ちなみに、「CI(Continuous Integration)」「CD(Continuous Delivery)」なんかについては、

codezine.jp

CI/CDとは「Continuous Integration/Continuous Delivery」の略で、日本語では継続的インティグレーション/継続的デリバリーといいます。CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておく、ソフトウェア開発の手法を意味します。

CI/CDのエキスパートが解説:CI/CDとは何か? なぜ今、必要とされるのか? (1/3):CodeZine(コードジン)

⇧  上記サイト様が詳しいですが、JVMの起動は、最終的には、1 ~ 3 の いずれかになるのでは...分からんけど。

 

 

んじゃ、あらためて、main メソッドを実行するのは、誰?

ちなみに、Javaフレームワークの Spring Boot なんかも 、

www.slideshare.net

⇧  main メソッドがエントリポイントって仰ってますかね。Java のエントリポイントは、main メソッドってなってるんで、Javaフレームワークは軒並み、main メソッドがエントリーポイントと考えて良いんですかね...

 

はい、すみません、脱線しました。

まぁ、結局、よく分からんのだけれども、

www.atmarkit.co.jp

そして、Javaプログラムを実行させる際に用いる「java」というコマンドは、まさしくJava仮想マシンを起動させるコマンドだったのです。コマンドライン引数には、実行させたいクラス(この場合は「HelloWorldApp」クラス)を指定します。すると、起動した仮想マシンはそのまま「HelloWorldApp」クラスを起動する仕組みになっています。

Javaってどうやって動くの?

⇧ どうやら、JVMが起動したタイミングで、エントリポイントも起動するらしい...

つまり、

  • 何らかの方法で、Javacコマンドが実行される(Javaコンパイラの実行)
    • 「.java」ファイルから「.class」ファイルを生成。
  • 何らかの方法で、javaコマンドが実行される
    • JVMが起動
    • クラスロード
    • リンク
    • 初期化
    • エントリポイントが起動(mainメソッドが実行される)
      • ↑ つまり、Javaのプログラムが実行される

っていう流れらしい...

ちなみに、REST API を使う場合、

teratail.com

⇧  REST API用のエンドポイントは、Javaのエントリーポイント(main メソッド)とは別物って考えれば良いのか...謎は深まるばかり... 

www.coppermine.jp

⇧  サーバエンドポイントとかも、エントリポイント(main メソッド)とは関係ないんだよね?

 

なんか、モヤモヤしか残らないけど、いまのところ、こういう認識しかない...誰か正解を教えて欲しい...

今回はこのへんで。