群居的山羊 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 Python时间序列如何拟合疏系数模型
  • ¥15 求学软件的前人们指明方向🥺
  • ¥50 如何增强飞上天的树莓派的热点信号强度,以使得笔记本可以在地面实现远程桌面连接
  • ¥15 MCNP里如何定义多个源?
  • ¥20 双层网络上信息-疾病传播
  • ¥50 paddlepaddle pinn
  • ¥20 idea运行测试代码报错问题
  • ¥15 网络监控:网络故障告警通知
  • ¥15 django项目运行报编码错误
  • ¥15 STM32驱动继电器