群居的山羊 2017-02-04 17:44 采纳率: 63.6%
浏览 2111
已采纳

java虚拟机跨平台的优势

今天在书上看到了java语言是先编译成与平台无关的字节码,再由各平台的虚拟机解释成该虚拟机能够执行的机器码,小白这里就有了个问题,这种做法和在不同平台上实现java的解释器有什么区别么,如果没有区别,那多了编译过程岂不是白白降低了运行效率?

  • 写回答

1条回答 默认 最新

  • threenewbee 2017-02-04 20:27
    关注

    字节码相当于预处理,它虽然是平台无关,但是也已经把高级语言的一些语法处理成接近低级语言的了。因此目标平台的jit编译器只需要很少的工作就可以得到机器代码并且执行。
    解释器面对的是完全的源代码,它的翻译效率很低,解释执行比编译执行慢几个数量级,看看ruby之类的语言(对比jruby)就知道了。
    另外,java字节码是语言无关的,换言之,java不是唯一可以编译为java字节码的原始高级语言。scala、jruby等等语言也可以编译为java字节码,而java语言本身升级添加新的语法,也可以编译出兼容之前java语言的字节码,不用更换jvm就可运行。如果是解释器,那么如果要改进java语言,或者设计另一种语言,就需要单独为它们编写解释器了。
    最后,你有一个说错了,是java跨平台,或者java字节码跨平台,java虚拟机可不是跨平台的。x86 arm x64 mips等等不同cpu不同os都有自己的java虚拟机。
    换一个角度看,java虚拟机实现了多种编译器共享一个后端编译器i(jit)和这个编译器对应的语法特性(比如ast,比如泛型等等)

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog