我自己翻译的《The Art of Computer Programming》卷一

WingForce 2002-10-07 10:21:25
请大家指点指点:

前言
这就是你们要的书,正是在你们的强烈要求下我们出版的书。为了给你们最好的、最完美的这本书,我们花了整整一年时间反复校对书中的难以计数的配方。现在我要说的是,对于书中的每一个配方,每一个细节,我们都没有任何的遗憾了。只要你们按着书里说的做,你就会和我们最好的厨师做得一样得好,哪怕你连锅铲也没有碰过。
--McCall's Cookbook(1963)

编写程序的过程是非常吸引人的,这不仅仅是因为程序员可以借此赚到的钱、学习到实践的经验,更有意思的是编程就像是作诗、作曲这样的艺术。这本书是一套很大部头的书的第一卷,而这套书是专门用来传授各种各样的程序设计技术的。
这本书的内容并不是面向初学者的,它的读者应该至少拥有一定的程序设计基础。但是这些要求非常的低,当然,菜鸟要花费时间和精力去学习电子计算机基础。本书的读者应该具有:
a)程序在计算机中是怎样工作的这一理念。当然,并不是要求知道计算机硬件电路是怎么工作的,而是了解程序是怎样存储在内存里,又是怎样运行的。
b)把实际中需要解决的问题抽象并写成计算机读得懂得语言——计算机程序的能力。(这些机器不是人,当然不会有人的情感和智力,它们只会死板但是精确的完成你叫它做的事。这个现实正是人们使用计算机的最大难点。)
c)一些计算机技术的知识和概念,比如循环、子程序调用和索引变量的使用(and the use of indexed variables)。
d)一些现在计算机技术的专业术语——“内存(memory)”、“注册表(registers)”、“位(bits)”、“浮点数(floating point)”、“溢出(overflow)”、“软件(software)”。在和这些术语关系最接近的那些章节,我们会给出大部分术语会一个简单的定义。
这四条要求其实可以总结为:读者应该已经写过或这读过至少四个计算机程序。
我试图使这本书可以可以满足很多人的需要。首先,它总结了计算机技术各个领域里的重要知识,可以看作是一本参考书。其次,它可以适合读者自学或者作为计算机和信息技术专业的学生的学分课程。为了达到这两个目的,我在书中加入了大量的练习题和大部分习题的答案。同时,我也尽力使书中的描述准确无误,而不是含混不清或者只是总结性的内容。
这套书本意是写给对计算机有极大兴趣的读者的,同时,它也毫无疑问的是写给计算机专业人士使用的。事实上,我写这套书的主要目的在于,使程序设计技术能为更多其他行业,但是需要使用计算机辅助的人接受。即使,这些人不能花上必要的时间学习。(yet who cannot afford the time to locate all of the necessary information that is buried in technical journals.)。
我想,我们应该把这些书称称为“非数值分析(nonnumerical analysis)”。计算机应用在传统观念上总是和解方程的根,数值插值(interpolation)和积分(integration)等等联系在一起。但是,这里我们不讨论他们或者一带而过。数值计算的程序设计是一个非常有趣而又涉及面非常宽的领域,已经有很多书对它进行了讨论。直到20世纪60年代早期,虽然计算机已经经常被用在数值计算量大的问题上,但是总的来说是更多的用于算术上而不是用在决策分析上。我们有一些在加法和减法上的非数值问题,但是几乎没有关于乘法和除法的。当然,即使一个主要专业在数值计算上的人也能从对非数值技术的学习中得到好处,因为他们都是基于数字的程序设计。
可以在大量的技术文摘里面找到非数值分析研究的结果。为了能把这些技术应用在各种各样的编程环境,我努力的方向是试图提炼出最基本的技术和概念。我已经在尝试把这些观点萃取成几条或者一种理论,同时也证明这些理论可以应用于一个更宽的实践领域中。
当然,对于非数值分析这个称呼,它的名称有个令人讨厌的否定前缀。最好,它能有个称述性的名称能够表明这一学科。用“信息处理(Information Proceessing)”这样的名称包含的范畴太广,而“程序设计技术(Programming Techniques)”的面又太窄。那么,我想“算法分析(analysis of algorithms)”能最接近这个学科的实际内容,也最能标识这本书的内容。
这一套书叫《编程的艺术》的书,具有以下的框架:
第一卷、基本算法
第一章、 基本概念
第二章、 信息机构
第二卷、半数值算法
第三章、 随机数
第四章、 算术
第三卷、查找和排序
第五章、 排序
第六章、 查找
第四卷、组合算法
第七章、 组合查找
第八章、 递归
第五卷、语法算法
第九章、 句法分析
第十章、 分解
我在1962年曾经试图用一本书囊括关于算法的一系列内容,每个主题我用一章来讨论。但是我很快就发现深入讨论一个问题,比简单的描述它更加的重要。最终的结果就是每一个主题包括的内容都几乎需要一个学期的时间来学习,所以,他们每一个部分都需要出版一卷。这样,一个奇怪的现象产生了,在整本书中只有一到两个章节。但是,为了能快速的引用原来的内容,我还是保持了原始的章节序号和容量。我们也正在准备为这套书出一个精简版,目的是作为大学学分课程的参考或者课本使用,根据我们的打算,它的内容是现在这个版本的子集,同时,也加入一些更专业的内容。章节的编号和标题也会继续保留在这个简化版里。
现在已经出版的几卷可能会和整套书的其他部分产生交集,因为一些基本的内容在其他的几卷里也会重复出现。从第二卷开始到已经出版的第五卷,他们可以看成互不相关的,可以单独的学习其中的一卷,而不必按照顺序进行。而第一卷则是整套书的纲领,它同时也可以用在相关专业的学位课上或者供读者自学,其主要内容包括了数据结构、离散数学和计算机语言这些方面。
和现在大部分的计算机程序设计类图书不同,我写这套书的目的不是教授怎样重用别人的代码,而是怎样写自己的代码。
我真的很希望所有的读者都能够理解和掌握书中的每个知识点,但是,我也知道,出书的另一个目的在于它带来的经济利益,而且现在计算机技术也在飞速的增长,看来,我的梦想是几乎不可能的。在全世界数以千计的天才的各种努力下,计算机科学这个学科变成了一幅美妙的图画。那么,我的新目标就是尽我最大的努力把也许在未来的几十年仍然是非常重要的“经典”技术描述出来。甚至我尝试考证了这些主题的发展历史以用来建立为计算机科学的未来发展的坚实基础。我尽量选择和人们使用习惯一致的、简单的术语。我也试图将已知的计算机编程的好点子包容进来。
在这套书里,有部分关于数学的内容是按顺序排列的。这部分内容是为了让没有接受过高等教育的人可以读懂这套书。当然,对数学感兴趣的读者可以学到很多关于离散数学的有趣知识。为了区别对待不同数学教育背景的读者,我将书中的习题分了级。这种分级符号标在了每道习题的前面。只对程序设计部分感兴趣的读者也可以完全忽略和数学相关的章节,从另一方面说,把兴趣放在数学上的人则可以从这里找到很多有趣的东西。计算机相关的图书中也有很多专门和数学联系的,有部分是失败的作品。我想他们失败的原因之一就是作者把读者都当作是具有深厚数学基础的人。虽然我的专业也是数学,但是我会尽力以简单易懂的方式来描述这些专业知识。书中的一些基本计算方法需要其他一些数学理论知识的支持,所以我希望读者去读一些相关的书籍。
在准备写这套书的时候,我必须面对的一个难题是,我应该把笔墨集中于现在这么多种技术的哪一些。在算法的描述中,使用流程图是一个很不错的选择,在《ACM Communication》杂志1963年的第六期中的一篇名为《Computer-Draw Flowchart》的文章详细说明了流程图。即使这样,使用一种正式的计算机语言,特别是机器语言来描述算法,依然是必要的。也许,很多计算机专家都认为使用面向机器的语言来编程是不合世宜的,我依然认为我的这个选择不错。原因如下:
a) 程序员在很大程度上受到不同计算机语言的影响。使用高级语言比使用低级语言要简单的多得多,但是,理解了机器语言,程序员可以写出更巨威力更接接近现实的代码。
b) 我们需要的程序要有更少的错误、更高的效率、更好的平台兼容性。
c) 高级语言不适合用来说明一些地层的细节技术,比如corountine linkage、random number。和其他一些需要高效利用计算机资源的程序
d) 因为机器语言是计算机的基础,我认为一个不只是对计算机感兴趣的人应该接受正规的学校教育,并学习这种语言。
e) 有部分机器语言被用来编写软件。
f) 时尚的高级语言大约每五年就要被淘汰,难道我们应该在这里讨论一些将要过时的技术吗?
但是从另外一个方面来说,我主张用高级语言来编程,这样的代码更容易调试。实际上从1970年开始,我就极少使用机器语言了,现在的计算机实在是太大也太快了,在这本书中,我们感兴趣的是怎样是编程变成一门艺术。有些复杂的计算需要反复上亿次,我们要花大约11.6天才能完成这些运算,假设每毫秒完成一个内部循环。类似的,增加开发代码的效率和代码的重用也是非常重要的,相同功能的代码只要写一遍就行了。
决定了使用面向机器的语言,那具体该使用哪种呢?我可以选择X机语言,但是这样,不使用他们的读者会觉得这套书是专门出给X机使用者看的。而且,X机有其自己的特点,不要花上一些篇幅来说明。也许两年后新的X+1或者叫10X新机型就会取代它。研究过时的X机也就不具有意义。
为了避免这些问题的出现我尝试发明一种原理机,它只有简单的几条规则,又和现有的实际机型十分类似。没有理由怀疑学生惧怕学习第二种计算机语言,当一种语言被掌握后,其他的也变得简单起来。事实上,因为职业的原因,程序员需要了解很多的不同的计算机和很多的语言。所以使用这种原理机唯一的缺点就是怎样执行一个为其编写的程序。幸运的是很多人,已经开发了很多种机器的模拟器,他们甚至比机器本书更宜于使用。
我已经尝试在每一章种引用最好的参考文献,也加入了一些最近工作中遇到的实例。当引用这些文献时,我使用了一些标准的缩写,一下时一些常用的缩写:
(见原书)
比如:“CACM 6(1963),555-663”。我也
...全文
228 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
elvahuang 2002-10-07
  • 打赏
  • 举报
回复
侃侃
acev 2002-10-07
  • 打赏
  • 举报
回复

加油!
lizhongkun 2002-10-07
  • 打赏
  • 举报
回复
向你致敬!!其他的呢???
woofier 2002-10-07
  • 打赏
  • 举报
回复
此兄真是精神可嘉
足可为一切如我类的懒人之楷模
anyoshon 2002-10-07
  • 打赏
  • 举报
回复
辛苦了
bonnyone 2002-10-07
  • 打赏
  • 举报
回复
辛苦了,人民感谢你!!!

70,023

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧