crb912
3/9/2021 - 12:15 PM

喜欢追究事物的本源

编程相关

我昨天居然好奇Union数据结构的历史由来,我用Google查到一些线索:

Ritchile在这篇The Development of the C Language 提到,“ Algol 68's concept of unions and casts also had an influence that appeared later” 。也就是说,Union起源Algol 68. 然而我没办法找到资料, 来知道是由谁或者在什么时候发明了这个Uion数据结构。

我只能从设计者的角度思考(它是怎么创造出来的),后来觉得这个人的想法有点意思, 我可以做出这样的假设:在实现struct数据结构之后,他期望实现一个类似的数据结构,既能像容器一样储存不同的数据类型,又不让他们同时存储。

这个想法就像是:“我希望有个箱子,里面既能放苹果,又能放橘子,但是我不允许它们同时放进去”。

在我看来,这个是一个十分创意的想法,有趣儿。 即便在Union发明几半个世纪后的今天,我仍然觉得十分有趣。

我又去翻了下《CS: APP》一书,他对于Union给了一个叶子节点和内部节点的代码设计示例,我认为这个示例为Union的应用提供了极为恰当的参考。 并且使用以tagged的方式规避了Union的缺陷, 在C语言中,它正确的方法就是这样。

而C作为高级语言,为了避免程序员写出复杂的代码,C17中引入variant。编程语言的设计者,总想程序员不用动脑子,就可以写出错误更少的代码,所以标准库不断更新迭代。我不知道该为此开心还是难过,使用高级特性,更高的效率开发,但是我们少了很多动脑子的乐趣。所以我应该在使用其高级特性的同时,仍然需要知道“所以然”,从探索的过程中获得这份快乐。

还有,《CS: APP》一书还有给了另外一个示例,它利用了Union的“副作用”--规避C语言的类型系统(circumvent the type system of C),以此来获取不同数据类型的bit patterns。 说实话,我完全没想到可以把Union这样用。我们使用东西的时候,常常总是在使用它的优点,而很少想到利用它的缺陷去做一些事。这也给我带来了一个启发,要全面的认识事物本身,从正面和反面不同的维度去运用。

不论是关注的Union的历史,还是《CS:APP》上两个代码示例, 我都觉得有趣。在编程语言的领域,还有很多有趣的东西等待着我去发现,所以我得不断寻找计算机里面有趣的事物,再努力一点。

我觉得很幸福,因为一想到计算机领域有这么多好玩的东西,特别快乐

2021-02-21