我在这里看到除了Java之外还有大量语言在JVM上运行.我对JVM中运行的其他语言的整个概念感到有点困惑.所以:
使用JVM的其他语言有什么好处?
为JVM编写语言/编译器需要什么(在高级术语中)?
如何在JVM中用一种语言(Java除外)编写/编译/运行代码?
编辑:在接受的答案中回答了3个跟进问题(最初的评论).他们在这里重印了易读性:
如果用JPython编写的应用程序如何与Java应用程序交互?
另外,JPython应用程序可以使用任何JDK函数/对象吗?
如果它是Jaskell代码,那么它是一种函数式语言会不会使它与JDK不兼容?
分别解决您的三个问题:
使用JVM的其他语言有什么好处?
这里有两个因素.(1)为什么JVM使用Java以外的语言,以及(2)为什么在JVM上运行另一种语言而不是运行不同的语言?
其他语言可以满足其他需求.例如,Java没有对闭包的内置支持,这一功能通常非常有用.
在JVM上运行的语言与在JVM上运行的任何其他语言都是字节码兼容的,这意味着用一种语言编写的代码可以与用另一种语言编写的库交互.
为JVM编写语言/编译器需要什么(在高级术语中)?
JVM读取字节码(.class)文件以获取它需要执行的指令.因此,任何要在JVM上运行的语言都需要编译为符合Sun规范的字节码.此过程类似于编译为本机代码,不同之处在于代码编译为由JVM解释的指令,而不是编译为CPU理解的指令.
如何在JVM中用一种语言(Java除外)编写/编译/运行代码?
与在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) } }
您需要JVM上的其他语言,原因与您需要多种编程语言相同:不同的语言更好地解决了不同的问题...静态类型与动态类型,严格与懒惰......声明性,势在必行,面向对象...等
通常,为JVM(或.Net CLR)上运行的另一种语言编写"编译器"本质上是将该语言编译为java字节码(或者在.Net,IL的情况下)而不是汇编的问题. /机器语言.
也就是说,为JVM编写的许多额外语言都没有编译,而是解释脚本语言...
考虑到这一点,您可以考虑设计一种新语言,并希望它在带有JIT和GC的托管运行时中运行.然后考虑你可以:
(a)编写自己的托管运行时(VM)并处理各种技术难题,这些问题无疑会导致许多错误,性能不佳,线程不正确以及大量的可移植性工作
要么
(b)将您的语言编译为可以在Java VM上运行的字节码,该字符码已经非常成熟,快速并且在许多平台上得到支持(有时候有多个供应商强制选择).
鉴于JavaVM字节码与Java语言没有太大的联系,以至于过度限制了您可以实现的语言类型,因此它一直是想要在VM中运行的语言的流行目标环境.