解释和编译的区别

解释编译和Python、Java

编译和解释

简单来说:

  • 解释性语言运行的时候需要解释器(比如Java需要JVM解释器,Python需要Python解释器),而编译性语言可以直接机器码
    • 解释性语言是把一些序列(比如class文件、Pyc文件等)扔给解释器,每次运行的时候都需要预先把这些代码转化为机器码
      • 说法2:每次执行都需要进行解释的语言叫做解释性语言
      • 说法3:从源代码直接到结果的语言叫做解释性语言
    • 编译性语言是直接生成机器码,执行的也是机器码,这个没有歧义。
  • 由于编译器已经生成机器码,而机器码因为生产厂商不同所以代码无法跨平台。而解释语言由于使用解释器,所以可以比较容易进行跨平台。
  • 大多数的语言是混合的,界限比较难进行区分。网上有说法是Java是半解释语言、解释性语言的,也有混合的。但是公认的是:Python是解释性语言。
  • 大多数解释语言是动态类型的、比较慢,大部分静态类型语言都是半编译或者编译语言,速度比较快。
  • 在编译和解释的时候,之前和之后都有很多步骤,比如类的加载、各种优化,实现非常复杂。

Java

  • Java需要编译器(Javac)把源代码转化为字节码,然后解释器(java.exe)转化为机器码

    • 这个说法很奇怪:

      • 狭义的编译是生成机器码的,但是Javac生成的是中间的字节码
      • 狭义的解释是代码->结果,而java是字节码->结果
    • Java预先编译是存在的,可以提高执行的速度,省去了源代码->字节码的时间消耗。

    • Java编译成为字节码文件,然后用解释器解释。所以理论上他既需要编译(需要编译成字节码)也需要解释。

    • 网络的定义的话,Java是半编译语言或者混合语言、解释语言,各种不同。

  • 一份源代码生成的字节码是一致的,但是硬件不同解释器不同,生成的机器码也不同。这么做是为了更好的跨平台。

Python

  • Python本身是解释性语言,但是他也需要Java一样源代码-字节码-机器码,所以在这个方面他本质和Java差不多。

  • 但是,Python

    • 可以不需要预先进行编译,直接源代码执行。

    • 但也可以编译为pyc文件像Java一样解释执行。

      • 如果生成pyc文件还是比Java慢,那就不是解释器的原因。

JIT技术和解释器:

以Java为例:

解释器和JIT代码生成器不是一个东西。

  • 解释器是负责把字节码转化为机器码的
  • JIT是为了提高执行速度把一部分热点代码直接转化为机器码,下一次运行的时候直接运行机器码。
    • 字节码比源代码和字节码大,需要占用更多的内存,所以全部机器码是内存占用很高的一种选择,不合适

本质上:

  • JIT不快,但是下一次执行的时候可以直接执行机器码,机器码才快。所以只有多次执行的代码JIT才有正面效益。
    • 表现就是:JIT需要预热才能够提速。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值