JVM系列之Java是解释性语言还是编译型语言?
1、什么是Java语言?
java语言是一门面向对象的计算机高级编程语言。编程语言(英语:programming language),是用来定义计算机程序的形式语言。用来向计算机发出指令。
2、什么是机器语言?
CPU能够直接认识的数据指令,称为机器语言,也就是010101001这种形式,这是不同于高级编程语言的,高级编程语言,比如java,c,Golang等,最终还是要编译为计算机能识别的机器语言
3、编译语言和解释语言?
3.1、编译型
编译型编程语言:使用专门的编译器,将高级编程语言一次性编译成可以被平台执行的机器码,并包装成平台所能识别的可执行程序。
eg:C、C++、Golang
编译语言:执行速度快、效率高;可移植性差点,需要依赖于编译器
3.2、解释型
解释型编程语言:没有构建步骤,而是使用专门的解释器对源程序逐行解释成特定平台的机器码。解释型语言曾经被认为比编译型语言慢得多。但是,随着即时 (JIT) 编译的发展,性能差距正在缩小。
eg:JavaScript、Python等等
解释语言:执行速度慢、效率低;跨平台性好,依赖于解释器
4、java是什么类型?
Java属于编译型+解释型的高级语言
为什么?按照常规的知识,我们都知道java程序是有很好的跨平台性的,这似乎暗示 Java 是一种纯粹的解释型语言?
介绍之前先介绍一下JVM的体系架构,引用Oracle官网图例,HotSpot 是 Oracle 的默认开源 JVM 实现。首先java文件经过javac编译成class类文件,经过类加载器,加载到JVM,再通过执行引擎执行
java源代码经过类javac编译成class文件后,被类加载器加到到运行时数据区,然后执行还是由执行引擎执行的,执行引擎使用本机方法接口 (JNI) 来调用本机库和应用程序
执行引擎主要有如下3个部分:Interpreter(解释器)、Just-In-Time (JIT) Compiler(即时 (JIT) 编译器)、Garbage Collector(垃圾收集器)
- Interpreter
一旦类加载器加载并验证字节码,解释器就会逐行执行字节码,这个过程是比较慢的,一个方法被多次调用时,每次都要执行 - Just-In-Time (JIT) Compiler
JVM 自动监视正在执行的方法。一旦一个方法符合 JIT 编译的条件,它就会被JIT编辑器编译成机器代码。这种方法被称为热方法。这个编译过程发生在单独的JVM线程上。编译成机器码后,程序运行速度是更快的。 - Garbage Collector
JVM的垃圾收集器主要用于对运行时数据区的内存进行回收整理,保证内存空间的正常使用
这里有个很关键的组件,JIT即时编辑器,这也是jvm性能提升很快的一个保障。解释器每次调用方法,都需要重新解释,所以比较慢。Java 使用 JIT 编译器来提高性能。Java并没有因为解释器慢,就不用解释器,因为综合考虑到解释器的明显优点,可以很好的跨平台。JVM 根据调用方法的频率使用 JIT 编译器。 JIT 编译器将整个方法的字节码编译为机器本机代码,因此可以直接重用,速度很快。
引用https://www.baeldung.com/java-compiled-interpreted的图例,JIT编译过程简单图例:
然后就可以知道为什么说Java是解释性语言+编译型语言。通过学习,我们知道了,Java园代码经过javac转成class类文件,然后通过类加载器加载到运行时数据区,class文件是一种很特殊的文件,只能通过JVM来翻译,可以说字节码是 JVM 原生的特殊机器语言,而这个翻译大部分是通过JVM解释器的,JVM 根据调用方法的频率使用 JIT 编译器,称之为运行时编译,即JIT(Just In Time)
综上所述,Java是一门编译型+解释型的高级语言。
5、附录:参考资料
文章来源: smilenicky.blog.csdn.net,作者:smileNicky,版权归原作者所有,如需转载,请联系作者。
原文链接:smilenicky.blog.csdn.net/article/details/118419920