编译型语言与解释型语言、动态语言与静态语言、强类型语言与弱类型语言

编译型语言与解释型语言

【原文:http://c.biancheng.net/view/4136.html】

计算机程序,其实就是一组计算机指令的集合,能真正驱动机器运行的是机器指令,但让普通开发者直接编写机器指令是不现实的,因此就出现了计算机高级语言。高级语言允许使用自然语言(通常就是英语)来编程,但高级语言的程序最终必须被翻译成机器指令来执行。
高级语言按照程序的执行方式,可以分为和两种。

编译型语言

编译型语言是指使用专门的编译器,针对特定平台(操作系统)将某种高级语言源代码,一次性“翻译”成可被该平台硬件执行的机器语言(包括机器指令和操作数),并包装成该平台所能识别的可执行程序的格式,这个转换过程称为编译(Compile)。编译生成的可执行程序可以脱离开发环境,在特定的平台上独立运行。
有些程序编译结束后,还可能需要对其他编译好的目标代码进行链接,即组装两个以上的目标代码模块生成最终的可执行程序,通过这种方式实现低层次的代码复用。

半编译型语言

此外,还有一种伪编译型语言,如 Visual Basic,它属于半编译型语言,并不是真正的编译型语言。它首先被编译成 P-code 代码(中间代码),并将解释引擎封装在可执行程序内,当运行程序时,P-code 代码才会被解析成真正的二进制代码。
从表面上看,Visual Basic 可以编译生成可执行的 EXE 文件,而且这个 EXE 文件也可以脱离开发环境,在特定平台上运行,非常像编译型语言。实际上,在这个 EXE 文件中,既有程序的启动代码,也有链接解释程序的代码,而这部分代码负责启动 Visual Basic 解释程序,再对 Visual Basic 代码进行解释并执行。

解释型语言

解释型语言是指使用专门的解释器,将源程序逐行解释成特定平台的机器代码并立即执行的语言。
解释型语言通常不会进行整体性的编译和链接处理,解释型语言相当于把编译型语言中的编译和解释过程混合到一起同时完成。

也就是说,解释型语言可以方便地实现源程序级的移植,但这是以牺牲程序执行效率为代价的。

编译型语言PK解释型语言

编译型语言与解释型语言、动态语言与静态语言、强类型语言与弱类型语言
借助图不难理解,编译型语言和解释型语言的区别在于,编译是对高级语言程序进行一次性翻译,这样的好处是,一旦源程序被彻底翻译,它就可以重复运行,且今后都不再需要编译器和源代码;而如果使用解释器,则高级语言程序每次运行,都需要借助源程序和解释器,其最大的好处就是,程序有很好的可移植性。

编译型与解释型,两者各有利弊。前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像C/C++、Pascal/Object Pascal(Delphi)、VB等基本都可视为编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如Java、JavaScript、VBScript、Perl、Python等等。

【原文: https://www.cnblogs.com/dzhanjie/archive/2011/07/07/2100340.html】

动态语言和静态语言

通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。

(1)动态类型语言:动态类型语言是指在运行期间才去做数据类型检查的语言,也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

(2)静态类型语言:静态类型语言与动态类型语言刚好相反,它的数据类型是在编译其间检查的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed。

强类型定义语言和弱类型定义语言

(1)强类型定义语言:强制数据类型定义的语言。也就是说,一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

(2)弱类型定义语言:数据类型可以被忽略的语言。它与强类型定义语言相反, 一个变量可以赋不同数据类型的值。

强类型定义语言在速度上可能略逊色于弱类型定义语言,但是强类型定义语言带来的严谨性能够有效的避免许多错误。另外,“这门语言是不是动态语言”与“这门语言是否类型安全”之间是完全没有联系的!
例如:Python是动态语言,是强类型定义语言(类型安全的语言); VBScript是动态语言,是弱类型定义语言(类型不安全的语言); JAVA是静态语言,是强类型定义语言(类型安全的语言)。

相关文章: