3 つの質問に個別に対処するには:
JVM に他の言語を使用する利点は何ですか?
ここには2つの要因があります。(1) JVM に Java 以外の言語を使用する理由、および (2) JVM で別のランタイムではなく別の言語を実行する理由
- 他の言語は、他のニーズを満たすことができます。たとえば、Java には、多くの場合非常に便利な機能であるクロージャーのサポートが組み込まれていません。
- JVM で実行される言語は、JVM で実行される他の言語と互換性のあるバイトコードです。つまり、ある言語で記述されたコードは、別の言語で記述されたライブラリと対話できます。
JVM 用の言語/コンパイラを作成するには、(大まかに言えば) 何が必要ですか?
JVM は、バイトコード (.class) ファイルを読み取って、実行する必要のある命令を取得します。したがって、JVM で実行する言語はすべて、 Sun の仕様に準拠したバイトコードにコンパイルする必要があります。このプロセスは、ネイティブ コードへのコンパイルと似ていますが、CPU が理解する命令にコンパイルするのではなく、JVM が解釈する命令にコードをコンパイルする点が異なります。
JVM で (Java 以外の) 言語でコードをどのように記述/コンパイル/実行しますか?
Java でコードを記述/コンパイル/実行する方法とほとんど同じです。足を濡らすには、JVM 上で問題なく動作するScalaを調べることをお勧めします。
フォローアップの質問に答える:
たとえば、JPython で作成されたアプリは、Java アプリとどのようにやり取りするのでしょうか?
これは、言語のギャップを埋めるという実装の選択に依存します。あなたの例では、Jython プロジェクトにはこれを行うための簡単な手段があります (こちらを参照)。
from java.net import URL
u = URL('http://jython.org')
また、その JPython アプリケーションは JDK 関数/オブジェクトのいずれかを使用できますか?
はい、上記を参照してください。
それが Jaskell コードである場合、それが関数型言語であるという事実は、JDK との互換性を失わないでしょうか?
いいえ。たとえば、Scala (上記のリンク) は、Java との互換性を維持しながら機能的な機能を実装します。例えば:
object Timer {
def oncePerSecond(callback: () => unit) {
while (true) { callback(); Thread sleep 1000 }
}
def timeFlies() {
println("time flies like an arrow...")
}
def main(args: Array[String]) {
oncePerSecond(timeFlies)
}
}