一、动态语言和静态语言的概念
首先,我们了解一个概念:动态语言和静态语言的概念;
静态:编译期间
动态:运行期间
动态语言:是指程序运行时,可以改变程序结构,引入新的函数(方法)、已有的函数可以被删除等在结构上的变化;程序运行期间才去做数据类型检查的语言,即在动态类型的语言编程时,永远不要给任何变量指定数据类型,该语言在你第一次赋值给变量时,在内部将数据类型记录下来;
举例:JavaScript、Ruby、Python … 都属于动态语言;
静态语言:在编译时,变量的数据类型已经确定,多数静态类型语言要求在使用变量之前必须声明数据类型;
举例:C、C++ 、Java、C# … 等语言静态语言;
二、Objective-C 是不是动态语言 ?
这需要从 Objective-C 的发展历史说起:
Tom Love 和 Brad Cox 这两名开发人员在 ITT 公司接触到 Smalltalk ,Cox 想要在 C 语言中加入面相对象功能,只用 C 语言就可以进行面相对象编程,将文件扩展名命名为:COOPC,表示用 C 语言实现面向对象。后来两人成了一家公司,新语言被命名为 Objective-C 。若干年后,Steve Jobs 领导的一家名为 NeXT 的小型创业公司,获准使用并标准化 Objective - C 语言,以作为 NeXT - step 操作系统的主要语言,NeXT 最终被苹果收购,NeXTstep 操作系统最终发展为 Mac OS 系统。
由此可见,Objective-C 是对 C 语言进行扩展,具备静态语言的特性;
Smalltalk 是动态语言的始祖,因此 Objective - C 是具备动态语言的特性的,可以说 Objective-C 是动态语言。
Objective - C 在纯静态语言和纯动态语言之间实现了平衡,是少有的几种通常进行编译的语言,不仅能从类似 C 和 C++ 在编译时对语法进行检查,还能从负责处理动态对象类型的动态运行时受益;
因此,可以说 Objective - C 是动态语言,但是是比较特殊的动态语言;
Java 和 Objective-C 为何有很多的共同点:
Objective-C 实际上影响了很多的其他编程技术,比如 Java 语言和 Objective-C 具有很多共同点。原因是:在 Objective-C 的早期,NeXT 和 Sun Microsystems 合作开发 OpenStep 平台,用来开发这种技术的语言就是 Objective-C 。当 NeXT 计算机的表现没有达到 Sun 公司的预期要求是,NeXT 走向了失败;
Sun 公司决定自己开发语言和跨平台的开发包 —— Java ,Java 工程师都是通晓 Objective-C 的,因为 Objective - C 是他们在使用 Java 之前的首选语言。后来一些较好的功能被引入 Java 中 ,因此,Java 和 Objective-C 具有很多的共同点。
举例以更好的说明 Objective-C 是具备动态特性和静态特性于一身的语言:
C 语言(静态语言特性),函数的调用在编译的时候,会决定调用那个函数;
Objective - C (静态语言特性):在编译时,并不能决定真正调用哪个函数,但是 Objective-C 会检查调用函数;
于是就出现了一种特殊情况:
在编译阶段,C 语言调用为实现的函数,就会报错;
在编译阶段,OC 时可以调用任何函数的,即使这个函数并未实现,只要声明过就不会报错;
OC 语言,具有动态调用的过程,仅当真正运行时,才能会根据函数名找到对应的函数来调用。此时,函数如果仍然没有实现,就会报错了;
C 语言程序的执行过程:
源程序 - 预处理 - 编译器 - 汇编器 - 链接器 - 可执行目标程序(二进制)
关于执行效率:静态语言执行效率要比动态语言高;
解释:因为一部分 CPU 计算损耗在 RunTime 过程中,而静态语言生成的机器指令更简洁;正是因为这个原因,所以开发语言的人付出了很大一部分努力保持 Runtime 小巧;
Objective-C 语言是 C 语言的超集 + 一个小巧的 Runtime 环境