为了说明动态类型系统和静态类型系统之间的差异和联系,这里简单叙述一下如何使用静态类型系统来构建动态类型系统。这个任务类似于为一门新的语言设计类型系统。所以如果你发现这个动态类型系统类似于你使用过的任何OO系统,请原谅我。应为所有的动态类型系统都是类似的,而且其背后的机理完全相同,只是实现上的差异而已。
先列出OO的核心技术,这样在我们设计的时候可以时刻对比我们是不是在这样做。
* 使用类来表达概念
* 使用消息在类之间传递信息
我们动态类型系统的期望目标很简单,那就是可以动态添加成员和方法。有了这个,我们就可以实现几乎所有的动态系统的特性了,如不特定消息发送,避免虚函数调用的开销,更简单的函数覆盖实现等等。
动态的类型系统,那就意味着运行时我们有一切的类型信息。所有我们需要把类型信息以合适的方式存储起来。在C++中,基础的类型就有十几种,更不要说用户创建的更多类型了。怎么办呢?简单想一下,就明白,我们只要一简单的字符串表达类型即可。不是使用字符串本身的类型,而是使用字符串对象的内容,不同的内容表示不同的类型即可。于是,我们可以说,对象Foo有如下的成员,其类型为“double”,其名字为weight,其值为94.5。可以看到,我们需要三个不同维度的东西来表达一个成员。C++中之需要两个就可以了,类型信息是静态的,编译期会处理。所以,这里的核心是:把类型信息表达为数据。
另一方面,C++成员的名字的硬编码的,在执行的时候,这些名字已经被地址替代了。这不是我们想要的,所以,我们要进一步把成员的名字也转变为数据存储起来。这里,名字可以直接映射为字符串。
最后就是对应的值。C++中,不同类型的值在地址中有完全不同的表达。在动态系统中如何表达呢?对比上面的例子,可以看到,我们完全可以把值的不同表达转化为字串表达出来。
于是,我们可以说,对象Foo的一个成员其类型为“double”,其名字为“weight”,其值为“94.5”。它当然可能有多个成员,所以在C++中,我们

本文探讨了如何在C++中构建动态类型系统,通过使用字符串表示类型、成员和值,实现动态添加成员和方法。文章介绍了核心概念,包括用字符串表达类型信息,存储成员名字和值,并展示了如何处理消息传递。尽管动态类型系统存在额外的存储开销,但提供了灵活性。动态与静态类型系统的差异主要在于类型信息的存储时机,选择哪种取决于应用需求。
最低0.47元/天 解锁文章
694





