编译型和解释型

“编译”和“解释”的确都有“翻译”的意思,它们的区别则在于翻译的时机安排不大一样。

编译型:一次把所有的代码转换成机器语言,然后写成可执行文件
解释型:不断地解释、执行、解释、执行……

打个比方:
你打算阅读一本外文书,而你不知道这门外语,那么你可以找一名翻译,给他足够的时间让他从头到尾把整本书翻译好,然后把书的母语版交给你阅读;
你也立刻让这名翻译辅助你阅读,让他一句一句给你翻译,如果你想往回看某个章节,他也得重新给你翻译。

编译型

编译器 负责来对我们的源代码进行转换,生成相对应的可执行代码
这个过程称为编译

对于一个复杂的项目来说
我们通常把代码分散在各个源文件中,作为不同的模块来组织。
这时编译各个文件时就会生成目标文件(Object file)而不是前面说的可执行文件。一般一个源文件的编译都会对应一个目标文件。这些目标文件里的内容基本上已经是可执行代码了。
但由于只是整个项目的一部分,所以我们还不能直接运行。待所有的源文件的编译都大功告成,我们就可以最后把这些半成品的目标文件打包成一个可执行文件了,这个工作由链接程序(Linker)负责完成,由于此过程好像是把包含可执行代码的目标文件连接装配起来,所以此过程称为链接(Link)。
链接完成之后,一般就可以得到我们想要的可执行文件了。

解释型

在程序运行的前一刻,还只有源程序而没有可执行程序
而程序每执行到源程序的某一条指令,则会有一个解释程序将源代码转换成二进制代码以供执行
总言之,就是不断地解释、执行、解释、执行……
所以,解释型程序是离不开解释程序的。

解释型程序中,由于程序总是以源代码的形式出现,因此只要有相应的解释器,移植几乎不成问题。

解释型程序省却了编译的步骤,修改调试也非常方便,编辑完毕之后即可立即运行,
不必像编译型程序一样每次进行小小改动都要耐心等待漫长的Compiling…Linking…这样的编译链接过程。

动态语言和静态语言

通常我们所说的动态语言、静态语言是指动态类型语言和静态类型语言。
对于动态语言与静态语言的区分,套用一句流行的话就是:Static typing when possible, dynamic typing when needed

动态类型语言

动态类型语言是指在运行期间才去做 数据类型检查 的语言
也就是说,在用动态类型的语言编程时,永远也不用给任何变量指定数据类型
该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。

Python和Ruby就是一种典型的动态类型语言,其他的各种脚本语言如VBScript也多少属于动态类型语言。

静态类型语言

静态类型语言的是在编译其间进行 检查数据类型 的,也就是说在写程序时要声明所有变量的数据类型,C/C++是静态类型语言的典型代表,其他的静态类型语言还有C#、JAVA等。

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

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

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

Python是动态语言,是强类型定义语言(类型安全的语言);
VBScript是动态语言,是弱类型定义语言(类型不安全的语言);
JAVA是静态语言,是强类型定义语言(类型安全的语言)。

强类型定义语言

一旦一个变量被指定了某个数据类型,如果不经过强制转换,那么它就永远是这个数据类型了。

举个例子:如果你定义了一个整型变量a,那么程序根本不可能将a当作字符串类型处理。强类型定义语言是类型安全的语言。

弱类型定义语言

数据类型可以被忽略的语言,一个变量可以赋不同数据类型的值。