selector

编程语言的动态性(Dart和OC对比)

2021-12-23  本文已影响0人  康小曹

1. 什么是动态性

动态性的定义有两种:

  1. 动态性语言:运行时能否动态改变类的结构;
  2. 动态类型语言:不使用强转时,在编译时期进行类型检查还是在运行时进行类型检查;

比如:

  1. Java :解释性语言、静态语言、静态类型;
  2. OC:编译语言、动态语言、半动态类型;
  3. Dart:编译语言、静态语言、半动态类型;

Java 中虽然有反射,但是反射本质上是使用未知类型的类,而不是改变类的结构。而 OC 中的 Runtime 不仅具备反射的功能,还能够为类动态添加属性、方法;

2. OC 中的 id 和 Dart 中的 dynamic

Dart 使用 dynamic 时,编译时期不会去检查类型,可以随意调用方法或者属性:

image.png

而 OC 中的 id 是一样的,编译时期语法补全时会尝试所有可能的方法,运行时才会真正的去检查类型:

image.png image.png

需要注意的是:

  1. id 类型不会去尝试属性,所有的属性都会直接报错:
image.png

猜测 Apple 这么做,因为 OC 中的属性本质上是就是方法,点语法只是方法调用的语法糖,Apple 干脆直接不检测属性了;

  1. Dart 中的 dynamic 完全不会去检查方法是否存在,而 OC 中的 id
    调用方法时会进行基本的检查,如果方法在整个项目中都不存在,那么编译时期报错:
image.png

这也算是一个编译性语言的特性吧,在运行之前(编译和链接完成之后)就知道了所有的符号表,所以能够判断该方法是否存在;

因此, OC 中有了 NSObject 这个基类的情况下,还额外定义了一个 id 类型,其本质就是告诉编译器只进行基本的语法检查(调用整个项目中都不存在的方法)而不进行类型检查,以此来支持动态类型的特性;

两者都有编译器的参与。一般情况下,OC 中所有的类型都是需要开发者在编译时期进行声明并确定。编译器给与 instancetype 的编译特性就是编译器来进行类型推断,而给与 id 的编译器特性就是编译时期不进行类型检查;

3. 总结

  1. OC 是一门半动态类型的动态语言;
  2. Dart 是一门半动态类型的静态语言;

PS:其实并不需要过度在意语言的动态性,编程语言的本质是帮助程序猿屏蔽底层机器代码,使得我们可以更为关注业务逻辑代码;

上一篇下一篇

猜你喜欢

热点阅读