现在的位置: 首页 > 综合 > 正文

转 =的两边

2012年05月30日 ⁄ 综合 ⁄ 共 1271字 ⁄ 字号 评论关闭

我非常认同能对=有认识的文章。编程语言里的=是一个哲学,不要轻易告诉别人你懂了。

 

John Backus据说说过下面的话,“赋值语句将程序割裂为两个世界。第一个世界是赋值语句右边的世界。这是一个有序的表达式世界,这个世界有许多有用的代数特性…….。最有用的计算都发生在这里。第二个世界是语句的世界,这是一个无序的世界,在那里找不到什么有用的数学特性。结构化编程一定层度上为这个混乱的世界带来一些秩序,但是它那些原始的循环,子函数,分支流程技术从未击中过冯诺依曼型语言的本质问题---一次一条指令的控制流模式”。“ 

远古邪恶巨咪,有他的看法。现在我也发表点我的意见。 

在我看,他说的赋值,不如说是定义。因为如果是左边一个名,右变一个值,他说的就全不对头。因此一定是左边一个名,右边一个计算的过程并最终得到一个值。这样解释起来,自然就能明白右边是有序世界的含义了。而左边是无序世界,也就是我们的现实世界,自然也就是在说我们给的名,是来自我们对现实世界的概念化。而概念化基本上是一个心理学问题,半个哲学问题,而没有什么数学结构在里面。 

而关键点在于,这里说的冯诺依曼型语言的语言本质,线性的,一条一条指令,前后顺序的执行。对此我研究不多,也不想去作更多的研究。因为我更加关注如何做到并行,而不想化时间在批评现有的系统不能并行。 

但是我还是认真思考了在这个角度上的各个方面的阐述,从而得出一个结论,那就是这种顺序进行的模型,根本上是建立在时间参数确定的基础上。具体的说,这个时候时间确定,时间方向确定,时间开始和结束点确定,时间排列方式确定。无疑这就是我们的现实世界。 

当然从计算方面来说,其实左边和右边本是一体,也就是数字和操作符本身是一体的。所以传统的方法,是用结构来表现现实世界。当然这样作的后果就是,有些时候会显得无比丑陋和臃肿。比如我们经常说的面向对象就是如此。远古邪恶巨咪在讲课中也谈到过相关的问题。 

而我在这里想了另外一个问题,也就是纯粹的问题,纯粹函数化编程的问题。无疑程序在内存中的形态,是绝对的决定程序运行方式的。自然的,我还习惯上也好,被迫受操作系统约束也罢,都会把数据方在数据段,代码放在code段。而显然,为了能写出强有力的代码,我还会在使用值引用的基础上,更有强列的愿望去使用址引用。而问题就出现在这里。因为我们追求纯粹,则我们就必然的会去破坏数据段的秩序,即便我们最终会把函数的输出方到寄存器而不是内存里,实际上内存的秩序还是被破坏了。于是我们发明了栈,stack。而又由于我们有强烈的愿望使用址引用,所以我们就有了进一步破坏stack之外秩序的能力。于是我们最终只能使用顺序命令,并且提心吊胆的生活在现实世界里。 

而本身我们应该是在计算世界里面生活。也就是说,我们发明计算机,本身是用来让我们作计算的,而不是让我们来再现一个现实世界的。无疑现实世界需要计算,然后得到一些重要的结论。但是这并不是说,计算世界也就需要受到现实世界的约束,才能给出现实世界的计算结果。而显然在计算世界中,函数要比对象更加纯粹也更加容易被使用。

抱歉!评论已关闭.