昨日、JavaがOSに依存しない理由について書いたのですが、その中で「JVM」という言葉が重要なキーワードとして出てきたので、今回はそれ関連の情報をまとめてみます。
JVMは、異なるOSやデバイス上でもプログラムを実行できるようにするためのJava仮想マシンのことです。
Java仮想マシンとは、中間コードを実行するソフトウェアのことで、中間コードとは「人間が書くコード」と「コンピュータが理解できるコード」のちょうど中間にあるコードを指します。
JVWにおいてはこの中間コードをJavaバイトコードと呼び、JVMはこれを読み取って各OSが実行できるコードに変換します。
JVWが行う処理の流れ
JVMでは、
という流れでソースコードを変換していきます。
コンピュータが理解できるように、ソースコードを0か1のみで構成される機械語に変換する作業のことを「コンパイル」と言いますが、Javaは実行されるまでに「2回」コンパイルされていると言えます。
因みに
Javaはコンパイルしてから実行する「コンパイラ型言語」ですが、Pythonのような「インタプリタ言語」ではソースコードを機械語に変換しつつ実行する、という流れで処理を行います。
ただし実行するにもCPU(コンピュータ)は機械語しか理解できないため、インタプリタ言語では、
1行ずつ読み取って
マシン語に変換して
CPUに実行させる
という処理をコードの終わりまで繰り返すことによってプログラムを実行しています。
そのため処理が遅く、実行しないとエラーを検知できないけれど、実行時にOSに対応する機械語に変換できるという特徴を持っています。
JVM言語
「ソースコードの作成 → Javaバイトコードに変換」の過程で使用される言語はJavaだけではありません。
この過程で使用される言語および、Java仮想マシンで利用される言語のことをJVM言語と呼びます。
JVM言語としては、
などがあります。
JRuby、Jython
JRubyおよびJythonは、JVM上で動作するRubyやPythonのことです。
以下のメリットがあります。
異なる言語の開発者が同じ環境で作業でき、相互運用性が向上する
Java本来のライブラリに加え、それぞれのエコシステム(互いにメリットを与える依存関係)も利用できるため、JRubyではRuby on Railsなどのフレームワークを利用することが可能になり、開発者は言語ごとの得意分野を活かすことができる
Kotlin
Kotlinは、Javaを作り替えるように生まれたプログラミング言語で、以下の特徴があります。
Scala
Scalaは主に大規模プロジェクトに用いられている言語で、以下の特徴があります。
純粋なオブジェクト指向型言語で、全てがオブジェクトとして扱われることにより、クラスやトレイト(メソッドの集合体)を使用して再利用可能なコードを構築できる
関数型プログラミングなどとも組み合わせてコードを記述できるので、総合的に学習コストは高め
以上です。
あとがき
ブログ記事に関してなのですが、「今日はJVMに関する記事を書こう」と思って情報を集めてみても、ただWebに関わる技術を概要だけふんわり学んでいる状態に陥りかねないな、と感じました。
例えば、昨日書いた「なぜJavaはOSの違いに依存しないのか?」のような疑問から始まる記事は有意義な情報に辿り着きやすいのですが、今回のように言葉の意味を調べるだけでは、情報が羅列するだけのあまり中身がない記事になってしまう気がします。(それでも知識自体は付くのですが)
なので、もっと自らの疑問に水を注いでいくような、勉強してる実感が持てるやり方で投稿を行っていきたいので、必要に応じて知識を吸収していくスタイルで書いていこうと思います。
次回は「バックエンドエンジニアに必要なスキル」について整理します。
以上です。