公共命名空间,2024年10月的笔记
首先,我国选择C++做为竞赛语言,许多人学C++,学习的结果是:看到“公共命名空间”,就幻想出一个私有命名空间,其实,公共命名空间和C++的命名空间无关!
超简源代码
已知序列v={1,2,3,4,5},找出其中的偶数,把每一个元素乘以2,并显示。
方案1:
源代码模板,修改已有的源代码,就像在做填空题,而且还有标准答案做参考。这需要IDE支持,经典源代码中的某些部分不可修改,是“只读”属性。
方案2:
序列v={1,2,3,4,5}
筛选序列[v]中的[偶数]至[w]
序列[w]的每个元素[*2]至[u]
显示[u]
方案3:
{1,2,3,4,5} & 筛选偶数 & 乘以2 & 显示
方案3最诱人。结合“上下文容器”,方案2可以更简单一点儿。
{1,2,3,4,5} | 筛选偶数
筛选[{1,2,3,4,5}]中的偶数
筛选偶数({1,2,3,4,5})
以上三行分别是前置参数、中置参数、后置参数。
调用一段源代码,不是用函数,也不是对象,而是另一段源代码。一般来说,后者比前者简单。后者的后者,可以是自然语言;前者的前者,可以是汇编语言。
假设有“阿立芬多数”代替“偶数”,上述代码的实现和形式该做怎样的修改?
注:阿立芬多数,是作者虚构出来的,只是为了测试一种情况:计算机语言定型之后,又有新事物出现,我们该怎么办?当然是修改语言啦!
C+Python的设计模式可以参考,常见的功能,用C语言实现,高效;其它的,用Python来编写,方便。兼顾便捷与效率。
复杂性
语言的复杂性来自于任务的复杂性,将这种复杂性写在公共命名空间之中,或者说,分散于其中。而计算机语言是简单的。
这一想法来自于对C++的反思,C++过于复杂,这是不对的,计算机语言应该是简单的。如此说来,公共命名空间成了复杂的任务和简单的计算机语言之间的缓冲带?
形式和实现之间的关系?传统的编译原理导致任务一复杂,形式也跟着复杂起来了。结果,编程序成了一项困难的工作。理想的计算机语言不应该是这样的。
别忘了,公共命名空间还有一个目标:让2000年后的人们能读懂今天写的源代码。
以英语为例,单词可以连成句子,但任务的复杂性导致程序的实现不能简单连接。所以,需要以句子为单位来理解源代码。
再以数学为例,一个高维空间,需要完整的坐标,才能正确描述。比如说六维空间,需要6个数字组成的向量来描述。6个数字之间没有简单关系,要把它们都写出来才行。这相当于用6个单词组成一个句子。所以,再次得出同样的结论:需要以句子为单位来理解源代码!
公共命名空间和人工智能
我对人工智能了解不多,仅有的一点儿了解,是神经元网络的梯度下降法。在梯度下降法里,定义了损失函数,这可以理解为:神经元网络的当前状态和理想状态之间的距离。
由于这个距离采用的是广义的欧几里德距离,所以,导致了神经元网络的状态空间不是四维的,(究竟是高维的还是零维的,我也说不清),它无法和公共命名空间相对接。
若不改变这一现状,公共命名空间中的所有项目(包括方言、句子、冗余项、同位素)将失去它们原有的位置关系。例如,冗余项说的是:形式不同而内容完全相同的情况,例如姥姥和外婆、将和帅、兵和卒。在损失函数看来,它们不是精确相等的。
所以,期待“四维损失函数”出现,使得人工智能和公共命名空间能更好的衔接。但是,话又说回来了,有了填充完好的公共命名空间,用精确的字符串匹配函数即可处理源代码,用不到人工智能了。
公共命名空间和人工智能里的自然语言理解,走的是不同的道路。