JVM系列之Java是解释性语言还是编译型语言?

Posted smileNicky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JVM系列之Java是解释性语言还是编译型语言?相关的知识,希望对你有一定的参考价值。

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、附录:参考资料

以上是关于JVM系列之Java是解释性语言还是编译型语言?的主要内容,如果未能解决你的问题,请参考以下文章

初学javase

Java是解释型还是编译型语言?

JVM原理与内存模型

有关java是编译型语言还是解释性语言

Java技术体系

JavaPython分别是解释型还是编译型语言?