JVM言語の概要
1. 序章
Javaの他に、Scala、Kotlin、Groovy、Clojureなどの他の言語をJava仮想マシンで実行できます。
次のセクションでは、最も一般的なJVM言語の概要を説明します。
もちろん、JVM言語の前身であるJavaから始めましょう。
2. Java
2.1. 概要
Java は、オブジェクト指向パラダイムを採用した汎用プログラミング言語です。
この言語のコア機能はクロスプラットフォームの移植性です。これは、1つのプラットフォームで作成されたプログラムが、適切なランタイムサポートを備えたソフトウェアとハードウェアの任意の組み合わせで実行可能であることを意味します。 これは、プラットフォーム固有のマシンコードに直接ではなく、最初にコードをバイトコードにコンパイルすることによって実現されます。
Javaバイトコード命令はマシンコードに類似していますが、ホストオペレーティングシステムとハードウェアの組み合わせに固有のJava仮想マシン(JVM)によって解釈されます。
もともとはオブジェクト指向言語でしたが、Javaは関数型プログラミングのような他のプログラミングパラダイムからの概念を採用し始めました。
Javaの主な機能のいくつかを簡単に見てみましょう。
- オブジェクト指向
- 強く静的に型付けされた
- プラットフォームに依存しない
- ガベージコレクション
- マルチスレッド
2.2. 例
シンプルな「Hello、World!」を見てみましょう。 例は次のようになります。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
この例では、 HelloWorld という名前のクラスを作成し、コンソールにメッセージを出力するmainメソッドを定義しました。
次に、 javacコマンドを使用して、JVMで実行できるバイトコードを生成します。
javac HelloWorld.java
最後に、 javaコマンドは、JVMで生成されたバイトコードを実行します:
java HelloWorld
その他のJavaの例については、チュートリアルのリストを確認してください。
3. Scala
3.1. 概要
Scalaは「スケーラブル言語」の略です。
この言語は2004年に始まりましたが、近年人気が高まっています。
Scalaは、プリミティブをサポートしていないため、純粋なオブジェクト指向言語です。 Scalaは、特性、代数的データ型、型クラスなどの関数型プログラミング機能とともに、クラス、オブジェクト、メソッドを定義する機能を提供します。
Scalaのいくつかの重要な機能は次のとおりです。
- 機能的、オブジェクト指向
- 静的に強く型付け
- 代数的データ型
- パターンマッチング
- 強化された不変性のサポート
- 怠惰な計算
- マルチスレッド
3.2. 例
まず、同じ「Hello、World!」を見てみましょう。 前と同じように、今回はScalaで:
object HelloWorld {
def main(args: Array[String]): Unit = println("Hello, world!")
}
この例では、HelloWorldという名前のシングルトンオブジェクトとmainメソッドを作成しました。
次に、これをコンパイルするために、scalacを使用できます。
scalac HelloWorld.scala
scala コマンドは、JVMで生成されたバイトコードを実行します。
scala HelloWorld
4. Kotlin
4.1. 概要
Kotlinは、JetBrainsチームによって開発された静的に型付けされた汎用のオープンソース言語であり、オブジェクト指向と機能のパラダイムを統合します。
Kotlinを開発する際の主な焦点は、Javaの相互運用性、安全性(例外処理)、簡潔さ、およびより優れたツールサポートでした。
Android Studio 3.0のリリース以降、KotlinはAndroidプラットフォーム上でGoogleによって完全にサポートされているプログラミング言語です。 また、標準のJavaコンパイラの代わりとしてAndroidStudioIDEパッケージに含まれています。
Kotlinの重要な機能:
- オブジェクト指向+機能
- 静的に強く型付け
- 簡潔
- Javaとの相互運用
Kotlinの紹介には、機能の詳細も含まれています。
4.2. 例
「Hello、World!」を見てみましょう。 Kotlinの例:
fun main(args: Array<String>) { println("Hello, World!") }
上記のコードは、helloWorld.kt。という新しいファイルに記述できます。
次に、 kotlincコマンドを使用してthisをコンパイルし、JVMで実行できるバイトコードを生成します。
kotlinc helloWorld.kt -include-runtime -d helloWorld.jar
-d オプションは、classファイルの出力ファイルまたは.jarファイル名を示すために使用されます。 -include-runtimeオプションを使用すると、Kotlinランタイムライブラリを含めることで、結果の.jarファイルが自己完結型で実行可能になります。
次に、 java コマンドは、JVMで生成されたバイトコードを実行します。
java -jar helloWorld.jar
forループを使用してアイテムのリストを印刷する別の例も見てみましょう。
fun main(args: Array<String>) {
val items = listOf(1, 2, 3, 4)
for (i in items) println(i)
}
5. Groovy
5.1. 概要
Groovy は、オブジェクト指向のオプションで型指定された動的ドメイン固有言語(DSL)であり、静的型付けおよび静的コンパイル機能をサポートしています。 構文を習得しやすく、開発者の生産性を向上させることを目的としています。
Groovyは任意のJavaプログラムと簡単に統合でき、スクリプト機能、ランタイムおよびコンパイル時のメタプログラミング、関数型プログラミング機能などの強力な機能をすぐに追加します。
いくつかの重要な機能を強調しましょう。
- 高階関数、カリー化、クロージャなどの機能機能を備えたオブジェクト指向
- タイピング–動的、静的、強力、アヒル
- ドメイン固有言語
- Javaとの相互運用性
- 簡潔さによる生産性
- 演算子のオーバーロード
5.2. 例
まず、「Hello、World!」を見てみましょう。 Groovyの例:
println("Hello world")
上記のコードは、HelloWorld.groovyという新しいファイルに記述しました。 これで、このコードを2つの方法で実行できます。コンパイルしてから実行するか、コンパイルされていないコードを実行するだけです。
次のようにgroovycコマンドを使用して、.groovyファイルをコンパイルできます。
groovyc HelloWorld.groovy
次に、javaコマンドを使用してGroovyコードを実行します。
java -cp <GROOVY_HOME>\embeddable\groovy-all-<VERSION>.jar;. HelloWorld
たとえば、上記のコマンドは次のようになります。
java -cp C:\utils\groovy-1.8.1\embeddable\groovy-all-1.8.1.jar;. HelloWorld
また、 groovy コマンドを使用して、コンパイルせずに.groovyファイルを実行する方法も見てみましょう。
groovy HelloWorld.groovy
最後に、インデックスを使用してアイテムのリストを印刷する別の例を次に示します。
list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
list.eachWithIndex { it, i -> println "$i: $it"}
紹介記事でGroovyの例をもっと見てください。
6. Clojure
6.1. 概要
Clojure は、汎用関数型プログラミング言語です。この言語は、JVMおよびMicrosoftの共通言語ランタイムで実行されます。 Clojureはまだコンパイル型言語ですが、その機能は実行時にサポートされるため、動的なままです。
Clojureの設計者は、JVMで実行できる最新のLispを設計したいと考えていました。 そのため、Lispプログラミング言語の方言としても知られています。 Lispsと同様に、Clojureはコードをデータとして扱い、マクロシステムも備えています。
いくつかの重要なClojure機能:
- 機能的
- タイピング–動的、強力、最近漸進的型付けのサポートを開始
- 並行性のために設計されています
- ランタイムポリモーフィズム
6.2. 例
他のJVM言語とは異なり、単純な「Hello、World!」を作成するのはそれほど簡単ではありません。 Clojureのプログラム。
この例を実行するには、Leiningenツールを使用します。
まず、次のコマンドを使用して、デフォルトのテンプレートを使用して単純なプロジェクトを作成します。
lein new hello-world
プロジェクトは、次のファイル構造で作成されます。
./project.clj
./src
./src/hello-world
./src/hello-world/core.clj
次に、 ./ project.ctj ファイルを次の内容で更新して、メインソースファイルを設定する必要があります。
(defproject hello-world "0.1.0-SNAPSHOT"
:main hello-world.core
:dependencies [[org.clojure/clojure "1.5.1"]])
これで、「Hello、World!」を出力するようにコードを更新する準備が整いました。 ./src/hello-world/core.cljファイル内:
(ns hello-world.core)
(defn -main [& args]
(println "Hello, World!"))
最後に、プロジェクトのルートディレクトリに移動した後、 lein コマンドを使用して、上記のコードを実行します。
cd hello-world
lein run
7. その他のJVM言語
7.1. Jython
Jython は、JVM上で実行されるPythonのJavaプラットフォーム実装です。
この言語は当初、対話性を犠牲にすることなく高性能アプリケーションを作成できるように設計されていました。 Jythonはオブジェクト指向でマルチスレッドであり、Javaのガベージコレクターを使用してメモリを効率的にクリーンアップします。
Jythonには、Python言語の一部であるほとんどのモジュールが含まれています。 また、Javaライブラリから任意のクラスをインポートして使用することもできます。
簡単な「Hello、World!」を見てみましょう。 例:
print "Hello, world!"
7.2. JRuby
JRuby は、Java仮想マシンで実行するRubyプログラミング言語の実装です。
JRuby言語は高性能でマルチスレッド化されており、JavaやRubyからさまざまなライブラリを利用できます。 また、オブジェクト指向プログラミングやダックタイピングなどの両方の言語の機能を組み合わせています。
「Hello、World!」を印刷してみましょう。 JRubyで:
require "java"
stringHello= "Hello World"
puts "#{stringHello.to_s}"
8. 結論
この記事では、基本的なコード例とともに、多くの一般的なJVM言語について学習しました。 これらの言語は、オブジェクト指向、機能、静的型付け、動的型付けなどのさまざまなプログラミングパラダイムを実装しています。
これまでのところ、JVMは1995年にさかのぼりますが、現代のプログラミング言語にとって非常に関連性が高く、説得力のあるプラットフォームであることが示されています。