Java这个语言很非凡
- 一、你可以说他是编译型的。因为所有的JAVA代码都是要编译的,.java不经过编译就什么用都没有。
- 二、你可以说他是解释型的。因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释型的了。
- 三、但是,现在JVM为了效率,都有一些JIT优化。他又会把.class的二进制代码编译为本地的代码直接运行,所以,又是编译的。
像C、C++他们经过一次编译之后直接可以编译成操作系统了解的类型,可以直接执行的,所以他们是编译型语言,没有经过二次处理。而java不一样,它首先由编译器编译成.class类型的文件,这个是java自己的文件,然后通过JVM从.class文件中读一行解释一行,所以它是解释型语言,而由于java对于多种不同的操作系统有不同的虚拟机(JVM),所以java实现了真正意义上的跨平台。
JAVA虚拟机机制:
-
Java语言的编译–>解释–>执行
源程序(.java文件)–>JAVA编译器(javac)–>字节码(.class文件)–>解释器–>操作系统平台
-
Java虚拟机
.java文件–>编译–>.class文件–>解释执行–>JVM for Linux/Windows/Other
编译型语言和解释型语言
定义:
-
编译型语言:把做好的源程序全部编译成二进制代码的可运行程序。然后,直接运行这个程序。
-
解释型语言:把做好的源程序翻译一句,然后执行一句,直至结束。
区别:
-
编译型语言:执行速度快,效率高;依靠编译器,跨平台性差。
-
解释型语言:执行速度慢,效率低;依靠解释器,跨平台性好。
编译型语言包括:C、C++、Pascal
解释型语言包括:Java、Javascript、Basic
个人认为:
java是解释型语言,因为虽然java也需要编译,编译成.class文件,但是并不是机器可以识别的语言,而是字节码。最终还是要靠JVM来解释,才能在各个平台上执行,这也是java可以跨平台的原因。所以可以说java既是编译型的,又是解释型的,但是假如非要归类的话,从概念的定义上讲,恐怕java应该归到解释型的语言中。
拓展
强 & 弱
- 强类型语言:对变量的数据类型有严格要求
- 弱类型语言:对变量的数据类型没有严格要求
动 & 静
- 动态语言:特点是无需编译,直接由解释器翻译为可以运行的机器语言,无中间产物。(javascript、PHP:脚本语言)
- 静态语言:需要先编译为中间产物。java是编译为.class为后缀的字节码文件。然后执行时,java虚拟机载入字节码文件,执行时在翻译为机器码最终执行。(Java静态语言)
编译 & 解释
- 编译型语言:程序在执行之前需要一个专门的编译过程,把程序编译为机器语言(二进制)的文件,运行时不需要重新编译直接使用编译的结果就Ok。(程序执行效率高,依赖编译器,跨平台性差) C、C++等。
- 解释型语言:源代码不是直接翻译成机器语言,而是先翻译成中间代码,再由解释器对中间代码进行解释运行。比如:java、python、javascript等都是解释型语言。程序不需要编译,在程序运行时才翻译成机器语言,每执行一次都要翻译一次,因此效率比较低。(效率比较低,依赖解释器,跨平台性好)