Чтобы ответить на ваши три вопроса отдельно:
В чем преимущество наличия других языков для JVM?
Здесь есть два фактора. (1) Почему для JVM используется язык, отличный от Java, и (2) почему на JVM работает другой язык вместо другой среды выполнения?
- Другие языки могут удовлетворить другие потребности. Например, в Java нет встроенной поддержки замыканий , что часто очень полезно.
- Язык, который работает на JVM, совместим с байт-кодом с любым другим языком, который работает на JVM, это означает, что код, написанный на одном языке, может взаимодействовать с библиотекой, написанной на другом языке.
Что требуется (в терминах высокого уровня) для написания языка / компилятора для JVM?
JVM читает файлы байт-кода (.class), чтобы получить инструкции, которые необходимо выполнить. Таким образом, любой язык, который должен быть запущен в JVM, должен быть скомпилирован для байт-кода, соответствующего спецификации Sun . Этот процесс аналогичен компиляции с собственным кодом, за исключением того, что вместо компиляции с инструкциями, понятными ЦП, код компилируется с инструкциями, которые интерпретируются JVM.
Как вы пишете / компилируете / запускаете код на языке (отличном от Java) в JVM?
Очень похоже на то, как вы пишете / компилируете / запускаете код на Java. Чтобы намочить ноги, я бы порекомендовал взглянуть на Scala , который безупречно работает на JVM.
Ответы на ваши последующие вопросы:
Как приложение, написанное, скажем, на 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)
}
}