打字猴:1.700435301e+09
1700435301
1700435302
1700435303 若你不是Fortran程序员,请听我解释。这段代码包括了两个嵌套的DO循环,这两个循环都在第14行结束。循环控制的索引变量从最低限步进到最高限,所以外循环I从1步进到N,内循环J也从1步进到N。变量V是个N行N列的数组;I遍历每一行,在每一行中,J遍历每一列。
1700435304
1700435305 这两个循环创建了一个N×N的矩阵,对角线上是1,其他地方都是0,当N等于5时就像下面这样:
1700435306
1700435307 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1
1700435308
1700435309
1700435310
1700435311
1700435312
1700435313 在做整数除法时,Fortran会丢弃结果的小数部分,故若I不等于J,除法结果为0;若I等于J(在对角线上),结果就是1。
1700435314
1700435315 在我看来,这有点过于炫技了。在编程时,“乱抖机灵”并非良策。
1700435316
1700435317 用更直截了当和显而易见的方式重写,得到下面这个更清楚的版本:遍历外循环时,内循环将第I行的每个元素设为0,然后外循环再将对角线元素V(I,I)设为1:
1700435318
1700435319 C MAKE V AN IDENTITY MATRIX      DO 14 I = 1,N         DO 12 J = 1,N   12       V(I,J) = 0.0   14    V(I,I) = 1.0
1700435320
1700435321
1700435322
1700435323
1700435324
1700435325 于是我得到编程风格的第一条规则:写明白,别炫技。
1700435326
1700435327 迪克于1976年从贝尔实验室退休,去了加利福尼亚州蒙特雷的美国海军研究生院(Naval Postgraduate School in Monterey,California)任教,直至1998年初逝世,享年82岁。据说,他有一门课被学生称为“汉明论汉明”(Hamming on Hamming),正与本节内容相呼应。
1700435328
1700435329 迪克无时无刻不在深思自己在做什么,为什么要这么做。他常说“算以获识,非算以得数”[6],他甚至有一条(用中文)写着这句话的领带。他很早就认为,电子计算将在贝尔实验室的工作中占到一半比例。同事们都不这么认为,但很快他的预测就成真了。他常说,周五下午宜哲思,所以他每逢这个时间就安坐思考,但也随时欢迎我这样的访客。
1700435330
1700435331 退休后的几年,迪克总结了关于职业生涯成功之道的建议,开设讲座,题为“You and Your Research”(你和你的研究)。你可以在网上找到相关内容。最早一次讲座于1986年3月在Bellcore(即贝尔通信研究院[7])举办,肯·汤普森开车载我一起去听。几十年来,我一直向学生们推荐这一讲座——非常值得阅读记录文本,或者观看视频。
1700435332
1700435333 1967年夏天,维克·维索斯基(Vic Vyssotsky)(图1-6)坐我对面办公室。他也是极聪明和有天分的程序员。维克和科尔比搭档,负责管理贝尔实验室的Multics研发工作。他会尽量抽空每天与我这个基层实习生谈话。维克逼着我给需要学编程的物理学家和化学家上Fortran课。给非程序员上编程课,原来也颇为有趣。这让我克服了对公众讲话的恐惧,也让我后来能轻松应对各种教学工作。
1700435334
1700435335
1700435336
1700435337
1700435338 图1-6 维克·维索斯基, 约1982年(贝尔实验室供图)
1700435339
1700435340 不久以后,维克搬去贝尔实验室的其他驻地,从事“卫兵”(Safeguard)导弹防御系统方面工作。后来,他又回到墨里山,担任计算科学研究中心的执行总监,成了在我上面好几级的老板。
1700435341
1700435342 1968年春天,我着手解决博士论文中我的导师彼得·韦纳(Peter Weiner)给的一个图划分(graph partitioning)问题(图1-7):给定一些由边线连接的节点,试将这些节点切分为大小相同的两组,且从一组中的节点到另一组中的节点的连接边数尽可能少。
1700435343
1700435344
1700435345
1700435346
1700435347 图1-7 图划分问题示例
1700435348
1700435349 表面上看,这来源于实际问题:如何将程序切分为多个部分,放到不同的内存页中,当程序运行时,程序页进出内存的交换量保持最小。节点代表代码块,边线代表代码块与代码块之间的可能交换,每条边有一个衡量交换频率的权值,从而可以估算出不同内存页中的代码块的交换代价。
1700435350
[ 上一页 ]  [ :1.700435301e+09 ]  [ 下一页 ]