Java是编译型语言还是解释型语言(来自多人的资料,由于本人水平有限,还在研究,之后还将修正)

1.解释和编译的概念:

  • 解释:源程序->目标程序(二进制语言),且一句一句翻译执行。

  • 编译:分为静态编译和动态编译。c/c++就是采用静态编译。

    • 静态编译:编译型语言写的程序执行之前,需要一个专门的编译过程,把程序编译成为机器语言的文件,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(exe文件),因为翻译只做了一次,运行时不需要翻译
    • 动态编译,即JIT。将字节码文件(.class)生成机器语言的目标程序的过程 。
      编译和解释:两种方式只是翻译的时间不同(前者翻译是在执行程序之前,后者翻译是在执行程序的时候)
      解释型语言:
  • 概念:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。

  • 特点:程序不需要编译,程序在运行时才翻译成机器语言,每执
    行一次都要翻译一次。在运行程序的时候才翻译,专门有一个解释器去进行翻译,每个语句都是执行的时候才翻译。

编译型语言就是在执行之前,将源程序全部翻译为二进制语言文件,然后一起执行
【补充:字节码文件是一种和任何具体机器环境及操作系统环境无关的中间代码,它是一种二进制文件,是Java源文件由Java编译器编译后生成的目标代码文件。编程人员和计算机都无法直接读懂字节码文件,它必须由专用的Java解释器来解释执行,因此Java是一种在编译基础上进行解释运行的语言。
Java解释器负责将字节码文件翻译成具体硬件环境和操作系统平台下的机器代码,以便执行。因此Java程序不能直接运行在现有的操作系统平台上,它必须运行在被成为Java虚拟机的软件平台之上。】

2.解释型语言和编译型语言的特点(优缺点):

  • 解释型语言:效率比较低,依赖解释器,跨 平台性好

  • 编译型:需要等待,执行速度较快,效率较高。

    通常编译型语言的程序执行效率高,但也不能一概而论,部分解释型语言的解释器通过在运行时动态优化代码,甚至能够使解释型语言的性能超过编译型语言。
    应用场合:前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)等都是编译语言;而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。

3.常见的解释型语言:c/c++,pascal/Object, Pascal(Delphi)
常见的解释型语言:JavaScript,VBScript,Perl,Python,Ruby,MATLAB,Shell

4.什么是JIT?(以Hotspot虚拟机为例)
字节码文件,JVM首先会通过解释器进行解释执行【解释执行】,如果某段代码多次执行(认定为热点代码),那么VM就会以方法为单位将这段代码进行编译成与平台相关的机器码并进行各种层次的优化(保存起来),需要的时候直接运行【编译执行】。即解释器与编译器相互配合。解释器首先发挥作用然后编译器逐渐发挥作用。

可认定是热点代码的编译对象(以方法为单位):

  • 被多次调用的方法
  • 被多次执行的循环体 (OSR编译,栈上替换)

判断一段代码是不是热点代码,是不是需要触发JIT编译,这样的行为称为:热点探测(Hot Spot Detection),Hotspot热点探测的方式:基于计数器(虚拟机为每个方法(方法调用计数器),或者每个代码块(回边计数器)建立计数器,统计执行次数,超过阈值就是热点代码。但是需要维护计数器的开销)

补充:
HotSpot虚拟机内置两个即时编译器Client Compiler(C1)和Server Compiler(C2)。
混合模式(Mixed Mode):【默认模式】采用“解释器和其中一个编译器直接配合工作”,使用哪个编译器取决于虚拟机运行的模式。HotSpot会根据自身版本和宿主机器硬件性能自动选择模式,用户也可以使用“-client”或”-server”参数去指定
解释模式(Interpreted Mode):可以使用参数 “-Xint”,此模式下全部代码解释执行
编译模式(Compiled Mode):参数"-Xcomp",此模式优先采用编译,但是无法编译也会解释在最新的HotSpot中此参数被取消)

HotSpot在JDK1.6中出现了分层编译(Tiered Compilation)的概念并在JDK1.7的Server模式JVM中作为默认策略被开启
采用分层编译的原因:由于编译器compile本地代码需要占用程序时间,要编译出优化程度更高的代码所花费的时间可能更长,且此时解释器还要替编译器收集性能监控信息,这对解释执行的速度也有影响
分层编译根据编译器编译、优化的规模与耗时,划分了不同的编译层次(不只以下3种),包括:

  • 第0层,程序解释执行(没有编译),解释器不开启性能监控功能,可触发第1层编译。
  • 第1层,也称C1编译,将字节码编译为本地代码,进行简单、可靠的优化,如有必要将加入性能监控的逻辑
  • 第2层(或2层以上),也称为C2编译,也是将字节码编译为本地代码,但是会启用一些编译耗时较长的优化,甚至会根据性能监控信息进行一些不可靠的激进优化
    分层编译的好处:实施分层编译后,C1和C2将会同时工作,许多代码会被多次编译,用C1获取更高的编译速度,用C2来获取更好的编译质量,且在解释执行的时候解释器也无须再承担收集性能监控信息的任务

5.Java源文件到机器码在操作系统上运行整个过程?(以Hotspot虚拟机为例)
.java文件(源程序)->编译->.class文件(字节码文件)->jvm JIT
【感觉这里写的还有问题】

6.那么Java到底是解释型和编译型?
我认为Java是一个半编译半解释型的语言。因为java的特殊运行过程(第5点)
360百科认为java是解释型语言。
参考资料:
https://www.cnblogs.com/lingz/p/9394238.html
https://www.cnblogs.com/zjushuiping/archive/2013/01/06/2848478.html
https://baike.so.com/doc/441762-467767.html
https://www.cnblogs.com/wuhan729/p/8450169.html
https://www.cnblogs.com/insistence/p/5901457.html
https://blog.csdn.net/witnessai1/article/details/52669279
https://baike.baidu.com/item/JAVA%E7%BC%96%E8%AF%91%E5%99%A8/3168984?fr=aladdin

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值