六月一号了,儿童节快乐。

突然有一个疑问,Java语言为什么是解释性语言而非编译性语言,Java文件不都需要编译成class文件吗?

首先先介绍一下解释性语言和编译性语言。

计算机不能直接理解高级语言,而只能直接理解机器语言,所以我们需要把高级语言翻译成机器语言,计算机才能执行高级语言编写的程序。而将高级语言翻译成机器语言的翻译方式有两种,一种是编译,一种是解释。这两种方式的主要区别在于翻译的时间不同。

编译性语言在被执行之前,需要一个专门的编译过程,把程序编译成为机器语言,比如exe文件,以后要运行的话就不用重新翻译了,直接使用编译的结果就行了(比如exe文件),因为翻译只做了一次,运行时不需要翻译,所以编译型语言的程序执行效率高。

解释性语言在运行程序的时候才翻译,这样解释性语言每执行一次就需要逐行翻译一次,效率比较低。我们常说的脚本语言就是解释性语言。

所以编译性语言所需要的是编译器,而解释性语言需要的是解释器,它们的输入都是源代码,而编译器输出中间代码(或可执行代码),后者直接输出执行结果。

说到这里,我们再来想想,Java语言真的是解释性语言吗?那为什么还需要编译成class文件呢?

实际上很多现代解释器内部是以“编译器+虚拟机”的方式来实现的,先通过编译器将源码转换为字节码,然后由虚拟机去完成实际的执行。所谓解释型语言,并不是不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已。

所以,说Java是解释性语言已经不大合适了,其实用编译性和解释性来区分现代的编程语言其实也已经不大合适了,