一、前言
计算机是不能理解高级语言的,更不能直接执行高级语言,
它只能直接理解机器语言,
所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。
转换的方式有两种:编译、解释。
由此高级语言也分为编译型语言和解释型语言。
主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。
二、定义
编译型语言:(如c、c++)
使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
对于编译型语言,开发完成以后需要将所有的源代码都转换成可执行程序,比如 Windows 下的.exe文件,可执行程序里面包含的就是机器码。只要我们拥有可执行程序,就可以随时运行,不用再重新编译了,也就是“一次编译,无限次运行”。
解释型语言:(如python)
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。
对于解释型语言,会将代码一句一句直接执行,不需要像编译型语言一样,经过编译器先行将所有源代码全部编译为机器代码,之后再执行。这种编程语言需要利用解释器,在执行期,动态将代码逐句解释为机器代码,之后再执行。
三、评价
类型 | 优点 | 缺点 |
编译型语言 | 编译一次后, 脱离了编译器也可以运行(可以脱离开发环境运行), 并且运行效率高 | 可移植性差, 一般不可以跨平台(不能在不同的操作系统之间随意切换), 不够灵活 |
解释型语言 | 跨平台性好, 通过不同的解释器, 将相同的源代码解释成不同平台下的机器码 | 一边执行一边解释, 效率很低 |
编译型语言不能跨平台表现在两个方面:
1.可执行程序不能跨平台
可执行程序不能跨平台很容易理解,因为不同操作系统对可执行文件的内部结构有着截然不同的要求,彼此之间也不能兼容。不能跨平台是天经地义,能跨平台反而才是奇葩。
另外,相同操作系统的不同版本之间也不一定兼容,比如不能将 x64 程序(Windows 64 位程序)拿到 x86 平台(Windows 32 位平台)下运行。但是反之一般可行,因为 64 位 Windows 对 32 位程序作了很好的兼容性处理。
2.源代码不能跨平台
不同平台支持的函数、类型、变量等都可能不同,基于某个平台编写的源代码一般不能拿到另一个平台下编译。
如:在C语言中要想让程序暂停可以使用“睡眠”函数,在 Windows 平台下该函数是 Sleep(),在 Linux 平台下该函数是 sleep(),首字母大小写不同。其次,Sleep() 的参数是毫秒,sleep() 的参数是秒,单位也不一样。
四、杂谈
Java和其他的语言不太一样。因为java针对不同的平台有不同的JVM,实现了跨平台。所以Java语言有一次编译到处运行的说法。
大多人认为:java是解释型的语言,因为虽然java也需要编译,编译成.class文件,但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是java跨平台的原因。
所以可是说java即是编译型的(因为所有的Java代码都是要编译的,.java不经过编译就什么用都没有),也是解释型(因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释运行的,那也就算是解释的了)。