动态语言
一类在运行时可以改变其结构的语言:例如新的函数、对象、甚至代码可以被引进,已有的函数可以被删除或者其他结构上的变化。
在运行时代码可以根据某些条件改变自身结构。
如Objective-C、C#、JavaScript、PHP、Python。
静态语言
与动态语言相对应的,运行时结构不可变的语言。
如Java、C、C++。
编译型:
负责翻译的程序对源代码进行转换,生成相对应的可执行代码。这个过程是编译,这个程序是编译器。
如果所有代码都包含在一个源文件,通常编译之后就会直接生成一个可执行文件。
如果很多源文件,编译各个文件时就会生成目标文件。这些目标文件里的内容基本是可执行代码了。
然后由链接器把目标文件和各种图片、音视频等资源链接起来,还会去除目标文件之间的冗余重复代码。
最后生成可执行文件。
如C、C++、Objective-C、Swift。
解释型
程序运行的前一刻,还只有源程序而没有可执行程序。程序每执行到源程序的某一条指令,解释器将源代码转换成二进制以供执行。
不断的解释、执行、解释、执行。
移植性好,运行速度慢。
Java也进行了预编译,生成介于机器码和Java源码之间的中介代码。
如JavaScript、Python、PHP、Ruby。
动态类型语言
运行期间才去做数据类型检查的语言。永远也不用给任何变量指定数据类型,该语言会在你第一次赋值给变量时,在内部将数据类型记录下来。
如Python、Ruby、JavaScript、Swift、PHP。
静态类型语言
在写程序时要声明所有变量的数据类型,数据类型在编译期间检查。
如C、C++、C#、Java、Objective-C。
强类型定义语言
强制数据类型定义的语言。
一旦一个变量被指定了某个数据类型,如果不经过强制类型转换,它就永远是这个数据类型。
强类型定义语言是类型安全的语言。
如Java、C#、Python、Objective-C、Ruby.
弱类型定义语言
一个变量可以赋不同数据类型的值或者可以容易隐式类型转换。
如JavaScript、PHP、C、C++
duck typing
是动态语言的一种,只关心有没有实现属性和方法,不管真正类型。
normal typing
规定了类型,方法和属性也就确定了。