![]() |
1
33
分别回答您的三个问题: 这里有两个因素。(1) 为什么JVM使用Java以外的语言,(2)为什么JVM上运行另一种语言,而不是另一种运行时?
Sun specification . 这个过程类似于编译为本机代码,只是代码不是编译为CPU理解的指令,而是编译为JVM解释的指令。
非常类似于用Java编写/编译/运行代码的方式。为了让你的脚湿透,我建议你看看 Scala ,它在JVM上完美地运行。
|
![]() |
2
13
JVM上需要其他语言的原因与通常需要多种编程语言的原因相同:不同的语言解决不同的问题更好。。。静态类型与动态类型,严格类型与惰性类型。。。声明式、命令式、面向对象。。。等 一般来说,编写另一种语言的“编译器”以在JVM(或.Net CLR)上运行,本质上是将该语言编译成java字节码(或.Net,IL),而不是汇编/机器语言。 也就是说,很多为JVM编写的额外语言不是编译的,而是解释性脚本语言。。。 |
![]() |
3
6
考虑到这一点,您想设计一种新的语言,并希望它在JIT和GC中运行在托管运行时。然后考虑你可以: (a) 编写您自己的托管运行时(VM),并解决各种技术难题,这些问题无疑会导致许多bug、糟糕的性能、不正确的线程和大量的可移植性工作
(b) 将您的语言编译成字节码,可以在Java虚拟机上运行,Java虚拟机已经相当成熟、快速,并且在许多平台上都得到了支持(有时有多种供应商实现选择)。
|
![]() |
4
4
Java是一种相当冗长的编程语言,在过去5年中,随着所有新的高级语言/框架的出现,它很快就过时了。为了支持人们希望在一种语言中使用的所有高级语法并保持向后兼容性,向运行库中添加更多语言更有意义。 另一个好处是,它允许您在一个经过验证的托管平台上运行一些用Ruby-ala-JRuby(又名Rails)或Grails(本质上是Railys上的Groovy)编写的web框架,该平台可能已经在许多公司投入生产,而不必使用那些没有经过尝试和测试的Ruby托管环境。 要编译其他语言,您只需将其转换为Java字节码。 |
![]() |
5
3
我会回答,因为 Java sucks 但话说回来,也许是这样 too obvious â¦Â ;-) |
![]() |
6
2
JVM使用其他语言的优势与一般计算机使用其他语言的优势完全相同:虽然所有图灵完全语言在技术上都可以完成相同的任务,但有些语言使某些任务比其他语言更容易,而其他语言使其他任务更容易。由于JVM是我们已经能够在所有(几乎所有)计算机上运行的东西,而且事实上很多计算机已经有了它,我们可以获得“写一次,在任何地方运行”的好处,但不需要使用Java。 为JVM编写语言/编译器与为真正的机器编写语言/编译器并没有什么不同。真正的区别在于,您必须编译为JVM的字节码,而不是机器的可执行代码,但这在总体方案中只是一个微小的区别。 在JVM中为Java以外的语言编写代码实际上与编写Java没有什么不同,当然,您将使用不同的语言。您将使用某人为其编写的编译器进行编译(同样,与C编译器基本上没有太大区别,与Java编译器也没有太大区别),最终您将能够像编译Java代码一样运行它,因为一旦它是字节码,JVM就无法分辨它来自哪种语言。 |
![]() |
7
2
不同的语言适合不同的任务。虽然某些问题域非常适合Java语言,但有些问题域更容易用其他语言表达。此外,对于习惯Ruby、Python等的用户来说,生成Java字节码并利用JDK类和JIT编译器的能力具有明显的优势。 |
![]() |
8
2
只回答你的第二个问题: JVM只是一个抽象的机器和执行模型。因此,使用编译器将其作为目标与编译器可能针对的任何其他机器和执行模型一样,无论是在硬件(x86、CELL等)还是软件(parrot、.NET)中实现。JVM相当简单,因此它实际上是编译器相当容易的目标。此外,实现往往有相当好的JIT编译器(用来处理javac生成的糟糕代码),因此您可以获得良好的性能,而不必担心大量的优化。 有几点需要注意。首先,JVM直接体现了java的模块和继承系统,因此尝试执行任何其他操作(多重继承、多重分派)都可能很棘手,并且需要复杂的代码。其次,JVM经过优化以处理javac生成的字节码类型。生成与此非常不同的字节码可能会进入JIT编译器/JVM的奇数角落,这最多可能是低效的(最坏的情况是,它们可能会使JVM崩溃,或者至少会产生虚假的VirtualMachine错误异常)。 |
![]() |
9
1
JVM所能做的是由JVM的字节码(在.class文件中找到的字节码)而不是源语言定义的。因此,更改高级源代码语言不会对可用功能产生实质性影响。
|
![]() |
10
1
Java人的优势因语言而异——每个人都有一个故事告诉Java程序员他们做得更好。有些人会强调如何使用它们将动态脚本添加到基于JVM的应用程序中,其他人只会谈论它们的语言如何更易于使用、语法更好等等。 编写任何其他语言编译器都需要同样的东西:解析到AST,然后将其转换为目标体系结构的指令(字节码),并以正确的格式(.class文件)存储。 从用户的角度来看,您只需编写代码并运行编译器二进制文件,就可以将.class文件与java编译器生成的文件混合在一起。 |
![]() |
11
1
为Java VM提供替代语言有多种原因:
|
![]() |
12
1
编译器编写器更容易生成JVM或CLR字节码。它们是比任何机器语言更干净、更高级的抽象。因此,尝试创建新的语言比以往任何时候都更加可行,因为您所要做的就是针对这些VM体系结构中的一个,并且您将拥有一套适用于您的语言的工具和库。它们让语言设计者更关注语言,而不是所有必要的支持基础设施。 |
![]() |
13
1
因为JSR进程正在使Java变得越来越死气沉沉: http://www.infoq.com/news/2009/01/java7-updated
|
![]() |
14
1
Java在七个主要版本(从1.0到1.6)中积累了大量用户。由于需要为生产中运行的数百万行Java代码保持向后兼容性,它的发展能力受到限制。
如果将Java与C#进行比较,Java在成熟的、可用于生产的库和框架方面具有优势,而在语言特性和市场份额增长率方面则存在劣势。这是您在比较两种相隔一代的成功语言时所期望的结果。 任何一种新语言都有着与Java相比C#在极端程度上相同的优势和劣势。在语言特性方面最大化优势,在成熟库和框架方面最小化劣势的一种方法是为现有虚拟机构建语言,并使其与为该虚拟机编写的代码互操作。这就是Groovy和Clojure取得适度成功的原因;还有斯卡拉周围的兴奋。如果没有JVM,这些语言在一个非常专业的细分市场中只能占据一个很小的位置,而有了JVM,它们在主流市场中占据了一个重要的位置。 |
![]() |
15
0
他们这样做是为了跟上.Net。NET允许C++,vb,j*(以前),F,python,露比(即将到来)和C++。我可能错过了一些。对于脚本编写人员来说,其中最大的一个可能是Python。 |
![]() |
16
0
但我认为在JVM中引入新语言也有真正的原因,特别是当它们将“并行”运行时,您可以为正确的工作使用正确的语言,像Groovy这样的脚本语言可能正是您的页面演示所需要的,而常规的旧Java更适合您的业务逻辑。 我将留下一位更有资格的人来讨论编写新语言/编译器所需的内容。 至于如何编写代码,您可以像往常一样在记事本/vi中编写!(或者,如果您想以简单的方式实现,可以使用支持该语言的开发工具。)编译将需要该语言的特殊编译器,该编译器将解释该语言并将其编译为字节码。
|
![]() |
17
0
原因是JVM平台提供了很多优势。
Sun试图通过其脚本规范(例如Python、Ruby)支持的语言是后起之秀,这主要是因为它们的生产力得到了提高。从理论上讲,运行Jython可以让您更高效,并充分利用 python 解决更适合Python的问题,但仍然能够在运行时级别与现有代码库集成。的经典实现 和 红宝石 C 图书馆。 此外,用动态语言表达某些东西通常比用Java更容易。如果是这样,你可以走另一条路;消费 Python/Ruby 图书馆 . 性能会受到影响,但许多人愿意接受这一点,以换取更简洁、更清晰的代码库。 |
![]() |
Sam · jvm如何优化循环代码? 6 年前 |
![]() |
pushpavanthar · 纱线中的调谐火花作业 6 年前 |
![]() |
Ashish K · 在Groovy中将字符串参数传递给对象方法参数 6 年前 |
![]() |
St.Antario · 在Java中侦听多个目录以创建文件 6 年前 |
![]() |
Bonsaisteak · 为什么年轻一代需要三个区域来收集垃圾? 6 年前 |