上高中时,我写了自己的第一个程序,还有第一个专业程序。
我写的第一个程序是填充幻方,让每行、每列①的数之和均相等。
我编程用的是一台古老的电子管计算机。一整个下午不停地推按钮才把程序输进那台机器。
当天晚上,我头痛难耐,带着几大卷打印有80×80幻方的纸回到家里。那是1964年。 ① 严格来说还包括两条对角线。
那是一台俄制计算机,Ural II。它只有4K内存,支持40位浮点和20位操作指令。这台计算机只能用八进制机器码编程(没有汇编器)。
我写了几千行八进制机器码。 这台计算机的操作全部通过控制台完成,你需要自己动手,跟它进行一对一的交互。
程序员不必站在一旁等待另一位计算机操作员执行一批卡片。从这个角度看,Ural II酷似个人计算机,因为除了机器和你,不用其他人介入。就4K的内存和缓慢的速度而言,它跟1974年推出的Altair非常相似。
1964年Ural II带给我的兴奋就和1974年Altair带给比尔•盖茨的兴奋一样。
显然,Ural II在某些方面有别于个人计算机。Ural II体积庞大,要占用一间很大的房间,输入和输出的方法极为原始——主要是通过控制台开关。
控制台看起来像一台老式收银机,上面有整整六列开关,右侧有一个输入键。每一列有8个键,编号从0到7。
输入数字的方式同操作收银机差不多。因此,要输入2275,你需要依次拨动2、2、7、5这几个键。不小心按错的话,只要还没有按下右侧的输入键,都还可以修正。这种操作非常提神,因为它会伴有大量噪音。
每次按动开关都会发出响亮的喀哒声,每当清掉按键时——这全靠机械完成——所有按键一下子同时释放,伴着巨大的梆梆声。
它是全匈牙利(也许)仅有的五台计算机中的一台,被看作重要资产。 我父亲是电子工程学教授,这个工程师是他的学生。我父亲托他帮忙让我进去的。我也尽量让自己能派上用场。
我先是给他带午饭,后来帮他拿东西递家伙,最后我主动提出帮他们守夜,看管机器。 他们一到晚上就把计算机关掉,到第二天早上再打开。开关真空管时,电热丝加热或冷却很容易损坏。这台机器有 2000个真空管,每次打开时都会坏掉一个。
他们上班后的第一件事就是先花一个小时找出那个坏掉的真空管。我在那里守夜的话,计算机就可以一直开着,他们也不用浪费那一个小时。
于是,在晚上看管机器的时候,我也就可以用这台计算机了。 我和这位工程师成了好朋友。
他是个数学天才。我早年学到的许多技巧都是他教的,有的是关于算术思考,有的是关于符号问题。 另外,那台丹麦计算机对我影响也很大。
当时,它拥有的也许是世界上最好的Algol编译器,Gier Algol。我把这个编译器的全部代码清单研究了个遍。
它全都是用机器语言写成的,因此我既学了机器语言编程,又学会了从美学层面上思考编译过程。这个编译器的设计者是彼得•诺尔(Peter Naur)。
语法等式巴科斯诺尔范式(BNF)中的字母N就取自他的名字。我对这个程序知根知底,至今仍记忆犹新。
出生于1928年10月25日,是丹麦计算机科学先驱,为ALGOL 60编程语言的创建和定义做出了很大贡献,并因此获得2005年图灵奖。
他是目前唯一一个获得图灵奖的丹麦人。 举个例子,我在伯克利上学时写的SNOBOL编译器只是这个程序的变体。
我觉得Gier Algol程序现在仍在我脑海中,也影响着我的编程风格。我总是问自己:“如果这是Algol编译器的一部分,他们会怎么做呢?”这个程序真是精妙无比。
有一点我印象很深,就是他们倒着扫描源代码文本的做法。在某些情况下,如果你倒着做事情,之前显得很复杂的问题突然之间会变得非常简单。
例如,解析前向引用(forward reference)可能很难。要是倒着扫描,它们就变成了后向引用(backward reference),很容易解析。只要从新的角度看待程序,原本可能很难解决的问题也会变得容易解决。








网友评论