文章目录:
1.编译与解释
1.编译与解释:
1.1 简介
编程语言是人与计算机的交流语言,计算机最后能执行的只能是二进制代码,它无法理解自然语言,所以现代高级编程语言的目的就是将自然语言转换为计算机能够理解的二进制代码,根据交流方式的不同,编程语言分为两个主流类型:
- 编译型语言;
- 解释型语言;
举个例子来说就像我们如果因为生活或工作的需要,要了解一篇英语的文章,并且假设我们丝毫不了解英语,这时候怎么办?大家都会默默的打开一个自己喜欢的翻译器,要将这篇文章翻译成中文;这个时候你有以下两个选择:
将整篇文章贴到翻译器中->等待翻译器翻译->拿到整篇文章的中文版本并开始阅读理解文章内容;
将一句或一段内容贴到翻译器中->记录翻译内容并阅读理解->放入下一句或下一段,重复这个过程直到文章结束;
从以上的翻译方式中可以看出最大的区别在于:
前一种翻译方式在翻译完成后不再需要翻译器,甚至,我们在阅读中文版本的文章时,都不需要原文;
而后一种翻译方式全程都需要翻译器待命,而且我们在阅读过程中,很可能需要对照上下文来不断的修改手头的句段,因为不同的上下文环境可能导致当前语句有不同的翻译结果;
中英文翻译的例子和高级语言的工作何其相似!其中前一个翻译方式对应着编译型语言的工作方式;后一个翻译方式对应着解释型语言的工作方式;
编译型语言大致说来很简单:首先将编程语言整篇输入(这些输入就是所谓的源代码)翻译成二进制代码(进行翻译过程的我们称为编译器,实际上也是一种特殊程序),再通过执行二进制代码进行对计算机的控制;其中,翻译的过程称为编译阶段;执行二进制代码的阶段称为运行阶段。同第一种翻译方式一样,我们将程序内容交给编译器,编译器进行翻译,输出二进制代码,随后,我们就不再需要翻译器了,甚至如果我们对结果足够有自信,我们都可以抛弃源代码。常见的编译型语言有C/C++、GoLang等;
与之相对的,解释型语言的工作过程中,总伴随着解释器工作,解释器逐条取出源代码中的语句,每取出一条将这一条语句翻译成二进制代码交给计算机执行一条,所以解释型语言的工作过程不区分阶段且完全依赖解释器。常见的解释型语言有python、JavaScript等;
1.2 对比:
- 跨平台性:
编译型语言由于将源代码编译成了二进制码,不同的编译器对源代码的理解是不同的,而且不同的CPU和操作系统对二进制码的理解也是不同的,所以导致编译型语言的跨平台性差;
而解释型语言依赖与解释器,在不同的平台和环境下只要拥有对应的解释器,兼容性的工作就可以完全交给解释器即可,所以解释型语言的跨平台性较好;
- 运行效率
一般而言认为编译型语言的运行效率高于解释型语言,因为编译型语言在运行过程中不依赖编译器,而且是机器直接运行的二进制代码。而解释型语言在运行过程中,解释器一直在工作,占用着机器资源,并且要同时兼顾解释与运行,所以运行效率相对较低。
但是也不能一概而论,因为部分解释性语言的解释器通过在运行时动态优化代码,甚至能使解释性语言的性能超过编译性语言;所以具体性能要看具体的语言特性和程序的内容而定。
- 开发效率
由于语言特点等,普遍认为解释型语言的开发效率高于编译型语言。
1.3 Java
Java在所有的高级语言里都很特殊,正是这种特殊性奠定了Java目前在业内的地位。
Java既需要编译也需要解释;
Java通过Javac(Java编译工具)将源代码编译成一份二进制的中间文件——后缀名为(.class)的字节码文件;字节码文件与平台无关
而后在平台专属的Java虚拟机,可以理解为Java解释器上,逐条解释运行字节码文件,从而达成对计算机和资源的控制利用。
Java使用这种方式,保证了跨平台性并且保留了编译型语言的效率。