编程语言的动态性(Dart和OC对比)
2021-12-23 本文已影响0人
康小曹
1. 什么是动态性
动态性的定义有两种:
- 动态性语言:运行时能否动态改变类的结构;
- 动态类型语言:不使用强转时,在编译时期进行类型检查还是在运行时进行类型检查;
比如:
- Java :解释性语言、静态语言、静态类型;
- OC:编译语言、动态语言、半动态类型;
- Dart:编译语言、静态语言、半动态类型;
Java 中虽然有反射,但是反射本质上是使用未知类型的类,而不是改变类的结构。而 OC 中的 Runtime 不仅具备反射的功能,还能够为类动态添加属性、方法;
2. OC 中的 id 和 Dart 中的 dynamic
Dart 使用 dynamic 时,编译时期不会去检查类型,可以随意调用方法或者属性:
image.png而 OC 中的 id 是一样的,编译时期语法补全时会尝试所有可能的方法,运行时才会真正的去检查类型:
image.png image.png需要注意的是:
- id 类型不会去尝试属性,所有的属性都会直接报错:
猜测 Apple 这么做,因为 OC 中的属性本质上是就是方法,点语法只是方法调用的语法糖,Apple 干脆直接不检测属性了;
- Dart 中的 dynamic 完全不会去检查方法是否存在,而 OC 中的 id
调用方法时会进行基本的检查,如果方法在整个项目中都不存在,那么编译时期报错:
这也算是一个编译性语言的特性吧,在运行之前(编译和链接完成之后)就知道了所有的符号表,所以能够判断该方法是否存在;
因此, OC 中有了 NSObject 这个基类的情况下,还额外定义了一个 id 类型,其本质就是告诉编译器只进行基本的语法检查(调用整个项目中都不存在的方法)而不进行类型检查,以此来支持动态类型的特性;
- 关于 instancetype 和 id:
两者都有编译器的参与。一般情况下,OC 中所有的类型都是需要开发者在编译时期进行声明并确定。编译器给与 instancetype 的编译特性就是编译器来进行类型推断,而给与 id 的编译器特性就是编译时期不进行类型检查;
3. 总结
- OC 是一门半动态类型的动态语言;
- Dart 是一门半动态类型的静态语言;
PS:其实并不需要过度在意语言的动态性,编程语言的本质是帮助程序猿屏蔽底层机器代码,使得我们可以更为关注业务逻辑代码;