ハドリアヌスの長城(ハドリアヌスのちょうじょう、英語: Hadrian's Wall,ラテン語: Vallum Aelium)は、イギリスの北部にあるローマ帝国時代の城壁(囲壁)跡。広義にはローマ帝国の国境線を防御する防御壁『リメス』の一部であり、ローマ帝国最北端の国境線でもある。2世紀に第14代ローマ皇帝ハドリアヌスにより建設された。
無料の写真サイト「Pixabay」で、『システム』で検索した中の写真の1枚が、『ハドリアヌスの壁』という...あ、どうもボクです。
Java の起動の仕組みが今でもモヤっとしている今日この頃です。というわけで、今回も Java の話で。
エントリポイントとは?
Wikipediaさんによりますと、
エントリーポイントとは、プログラムを実行するうえで、プログラムやサブルーチンの実行を開始する場所のこと。プログラム全体のエントリーポイントとなる場所を含むルーチンがメインルーチンである。C言語の標準では、main
という名前の関数(の先頭)がエントリーポイントであり、各関数のエントリーポイントは、それぞれの関数の先頭である。
⇧ ということらしいっす。
スクリプト言語やBASICなど、ソースコードの先頭から実行していく言語も少なくない。それらにおけるエントリーポイントはソースコードの先頭である。アセンブリ言語では、通常は言語としてはエントリーポイントを決めず、OSやリンケージエディタ・ローダなどの規定をそのまま引き継ぐか、それらに対しエントリーポイントを指定する。
んで、
各種プログラミング言語のエントリーポイント
- C、C++、Objective-C、Java、D言語、Pike: main
- C#、Visual Basic、Visual Basic .NET: Main
- Pascal: プログラムの定義の先頭がエントリーポイントである。名前は規格では規定されていない
- Mops: GO
⇧ ってなってるんで、Java の場合、「main」メソッドが、『プログラム全体のエントリーポイント』であり、『「main メソッド」を含むクラス』が『メインルーチン』ということになりそうですかね。
main メソッドを実行するのは、誰?
ここで、当然、疑問が湧くわけですよ。main メソッドがエントリーポイントっつうのは分かったけども、誰がそのメソッドを実行してるのよ?
Wikipediaさんによりますと、
従来のプログラミング言語の多くはプラットフォーム(CPU)に依存したネイティブなコードにコンパイルすることを前提として設計されていたが、Javaはこうした言語と異なり、中間言語(バイトコード)にコンパイルされ、Java仮想マシンで実行されるよう設計された。
⇧ となっており、もうちょい詳しい説明では、
Javaのプラットフォーム非依存性は、次のようにして実現されている。
⇧ 「ほとんどの」って言葉がむちゃくちゃモヤモヤするけども、Java は、
って流れになるのだと...
ちょっと待ってくださいな!
Java仮想マシン、巷では、JVMで呼ばれると思いますが、JVMはいつ動くのよ?何で始めから動いてる前提なのよ?
『勝手にしやがれ(監督:ジャン=リュック・ゴダール)』って...勝手に動くわけないでしょうに!
というわけで、
⇧ 上記サイト様が詳しいです。
「JNI_CreateJavaVM()」っていう関数が呼び出されると、JVMが生成され、起動するのだと。
VMの生成
JNI_CreateJavaVM()
関数はJava VMをロードして初期化し、JNIインタフェース・ポインタへのポインタを返します。 JNI_CreateJavaVM()
を呼び出したスレッドは、メイン・スレッドとみなされます。
⇧ あれ?
でも、JNI(Java Native Interface)って 、
Java Native Interface (JNI) は、Javaプラットフォームにおいて、Javaで記述されたプログラムと、他のプログラミング言語(たとえばCやC++など)で書かれた、実際のCPU上で動作するコード(ネイティブコード)とを連携するためのインタフェース仕様である。Java言語からネイティブコードを利用するためのABIと、逆にネイティブコードからJavaバイトコードを動作させるためにバーチャルマシン (VM) を利用するためのAPIの2つから成る。
⇧ って説明だけど、普通にJavaだけ使う場合のJVM起動も、JNIが使われるんですね...
・java.exe、javaw.exe、jvm.dllの違い - コードログ
⇧ 上記サイト様によりますと、
が、JVMの実装だよ、と。(Windows の場合の説明だけど、Windows 以外のOSだとどうなるんですかね?)
なんで、おそらく、上記のファイルの中のコーディングで、「JNI_CreateJavaVM()」が実装されているってことですかね...
ほんと、切に願うのだけれど、このへんの仕組みを図解した資料とか有識者の人が誰か作ってくれないかな...
JVMを起動するのは、誰?
JVM の生成、起動なんかが、「jvm.dll」「java.exe」「javaw.exe」のいずれか、もしくは全部で行われているのかは分かりませんが、これらの実行ファイルは、いつ、どのタイミングで、誰によって実行されるん?
もう、このへんの説明が見つからなさ過ぎて、推測するしかないんだけど、
のいずれか?になるかと。
Eclipse なんかのIDE(統合開発環境)も、1 ~ 3 のどれかでやってるのかな?(Eclipseがブラックボックス過ぎて分からん...)
ちなみに、「CI(Continuous Integration)」「CD(Continuous Delivery)」なんかについては、
CI/CDとは「Continuous Integration/Continuous Delivery」の略で、日本語では継続的インティグレーション/継続的デリバリーといいます。CI/CDは1つの技術を指すものでなく、ソフトウェアの変更を常にテストして自動で本番環境にリリース可能な状態にしておく、ソフトウェア開発の手法を意味します。
CI/CDのエキスパートが解説:CI/CDとは何か? なぜ今、必要とされるのか? (1/3):CodeZine(コードジン)
⇧ 上記サイト様が詳しいですが、JVMの起動は、最終的には、1 ~ 3 の いずれかになるのでは...分からんけど。
んじゃ、あらためて、main メソッドを実行するのは、誰?
ちなみに、Javaのフレームワークの Spring Boot なんかも 、
⇧ main メソッドがエントリポイントって仰ってますかね。Java のエントリポイントは、main メソッドってなってるんで、Javaのフレームワークは軒並み、main メソッドがエントリーポイントと考えて良いんですかね...
はい、すみません、脱線しました。
まぁ、結局、よく分からんのだけれども、
そして、Javaプログラムを実行させる際に用いる「java」というコマンドは、まさしくJavaの仮想マシンを起動させるコマンドだったのです。コマンドライン引数には、実行させたいクラス(この場合は「HelloWorldApp」クラス)を指定します。すると、起動した仮想マシンはそのまま「HelloWorldApp」クラスを起動する仕組みになっています。
⇧ どうやら、JVMが起動したタイミングで、エントリポイントも起動するらしい...
つまり、
っていう流れらしい...
ちなみに、REST API を使う場合、
⇧ REST API用のエンドポイントは、Javaのエントリーポイント(main メソッド)とは別物って考えれば良いのか...謎は深まるばかり...
⇧ サーバエンドポイントとかも、エントリポイント(main メソッド)とは関係ないんだよね?
なんか、モヤモヤしか残らないけど、いまのところ、こういう認識しかない...誰か正解を教えて欲しい...
今回はこのへんで。