基本概念
- 什么是编译型语言?编译型语言的首先将源代码编译生成机器语言,再由机器运行机器码(二进制),比如C和C++.
编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译成 为机器语言的文件,运行时不需要重新翻译,直接使用编译的结果就行了。 - 什么是解释型语言?解释性语言编写的程序不进行预先编译,以文本方式存储程序代码。在发布程序时,看起来省了道编译工序。但是,在运行程序的时候,解释性语言必须先解释再运行。
要知道java到底是编译型语言还是解释型语言,就要理清楚java源代码文件(.java)到机器码的整个过程。
源代码文件的旅行
- 程序员编写的java代码就是源代码,格式为.java。
- 经过了javac(正常是IDE自动编译的)编译后,就是class文件,也叫字节码(bytecode)文件,格式是.class,当打开class文件会发现内容如下:
字节码文件本质是二进制文件,只是以16进制表示。 - jvm上场,jvm有JIT(即时编译器),AOT(提前编译器),还有解释器。
- AOT可以把字节码文件在运行之前提前编译为二进制的本地机器码(计算机的机器码)
- JIT可以在运行期间把热点代码编译为本地机器码。
- 解释器可以一边解析字节码文件一边编译为本地机器码执行。
正常情况下,是解释器和JIT配合,当然也可以AOT,或者只有AOT也可以,常用的HotSpot是解释器和JIT配合,可以配置AOT。
总结
从概念和java文件的旅行中我们可以得出以下结果:
- Java文件编译成字节码文件(二进制)就是编译过程,是编译型语言。(jvm也是一种机器,字节码就是jvm的机器码)
- 字节码文件一边解析一边执行的过程就是解释过程,是一种解释型语言。
- 字节码文件通过AOT提前编译成本地机器码的过程,是一种编译型语言。
- JIT是在运行期起作用的,不是执行之前,可以看做解释过程的优化。
由于通常用的是HotSpot虚拟机,并且基本是解释器都有使用,所以我们通常说java即是编译型又是解释型语言。例外:三大虚拟机之一的JRockit,没有解释器,所以对它来说,java是编译型语言。