1700436710
1700436711
1700436712
1700436713
多数大型程序都由多个源文件组成,这些源文件必须被编译并连接在一起,才能创建可执行程序。这通常可以通过执行单个命令来完成,如用cc *.c来编译一个C语言程序的所有源文件。但是,在20世纪70年代,计算机速度非常慢。在对某个文件进行修改后,重新编译包含多文件的程序,花费的时间可能会以分钟计而非以秒计。更有效率的做法是,只重新编译修改后的文件,并将结果与之前编译的其他文件连接起来。
1700436714
1700436715
然而,记住哪些文件最近编译过,哪些需要重新编译,是件麻烦事,很容易出错。有一天,史蒂夫·约翰逊向斯图·费尔德曼(图5-5)诉苦说,在花了几个小时调试无果后,他才意识到,问题出在没重新编译他修改过的一个文件。
1700436716
1700436717
1700436718
1700436719
1700436720
图5-5 斯图·费尔德曼,约1981年(杰勒德·霍尔兹曼供图)
1700436721
1700436722
凑巧的是,斯图也有同样经历。他也曾白费劲调试过肯定正确只是没重新编译的程序。他想出了妙招:使用某种规格语言来描述程序的各个部分是如何相互依赖的。他写的Make程序分析这些规格,并根据文件修改时间来做尽可能少的重新编译,使所有东西都能同步向前。Make的第1版实现是在1976年。
1700436723
1700436724
“我在周末写出Make,然后在下个周末用宏重新写了一遍(因为内置代码列表太长了)。我没有修正tab-in-column-1[5]问题,因为很快就有了十几个忠实用户群,我不想惹恼他们。”
1700436725
1700436726
Make一下子就成功了,因为它能避免愚蠢的链接错误,同时尽可能提高编译效率。对于那些不仅仅编译C语言,而且涉及更复杂处理的程序来说,它也是福音。例如,使用Yacc和Lex时,必须先分别运行Yacc和Lex,创建C语言文件,然后才进行编译,如图5-4所示。makefile文件记录了编译新版本程序所需的所有处理步骤,也可以描述如何完成相关任务,如运行Lint、做备份和输出文档。makefile文件有点像shell脚本,但它采用声明式语言:说明依赖关系和如何更新组件,但不会明确检查文件创建时间。
1700436727
1700436728
斯图提到的“tab-in-column-1”问题,标新立异又笨拙地限制了makefile文件格式。这可以说是设计缺陷,也说明成功程序都会面临的普遍问题:如果程序很好,它就会吸引用户,然后就很难用任何不兼容的方式来修改。Unix和大多数其他系统都充斥着最初就存在的瑕疵,根深蒂固,无法修复。
1700436729
1700436730
Make也是本节主题的范例:与其手写代码或手写操作序列,不如创建一套符号或规格,声明必须做什么,然后写程序来解释规格。这种方法用数据代替了代码,几乎总能见效。
1700436731
1700436732
时至今日,Yacc、Lex和Make还是常用工具,因为它们解决了程序员依然面对的重要问题,而且解决得如此之好,以至于它们的设计,有时甚至是原始实现,至今仍在使用。
1700436733
1700436734
说句题外话,我第一次见到斯图是在1967年左右。当时我在普林斯顿大学读硕士,而他则是本科生,为贝尔实验室兼职研发Multics。在麻省理工学院获得天体物理学博士学位后,斯图加入1127中心。他1984年去了Bellcore,然后到IBM任职,再后来加入谷歌公司。对我来说有点幸运的是,有几个夏天我去谷歌公司做访问学者时,他是在我上面几级的经理。
1700436735
1700436736
1700436737
1700436738
1700436740
UNIX传奇:历史与回忆 5.3 文档编制
1700436741
1700436742
Unix很早就有良好的文档编制工具,这些工具有助于Unix文档的完善。本节将讲述早期Unix系统上文档编制工具历史的故事。就像Unix的很多其他部分一样,这个故事关乎程序、程序员和用户之间的互动如何造就创新和改进的良性循环。
1700436743
1700436744
1966年我在麻省理工学院实习时,了解到杰瑞·索尔泽(Jerry Saltzer)的Runoff程序(Runoff的名字来自“I’ll run off a copy for you[6]”这样的说法)。Runoff是简单的文本格式化程序:它接受普通文本文件输入,文本中穿插以句点开头的行,用来指定格式。例如,文件内容可能是
1700436745
1700436746
.ll 60 .ceDocument preparation.sp 2.ti 5Unix had good tools for document production … .sp.ti 5When I was an intern at MIT in 1966 …
1700436747
1700436748
1700436749
1700436750
1700436751
1700436752
这些标记告诉Runoff如何格式化文本:将行长设置为60个字符,下一行居中,空2行,临时缩进5个空格,将段落设置成最多60个字符的行,然后空1行,再临时缩进下一段。
1700436753
1700436754
Runoff有一二十条这样的命令,可以很容易地格式化手册页、程序说明、给朋友的信等简单文档。今天用Markdown之类工具能做到的文本格式化,Runoff都能做到。
1700436755
1700436756
1.早期格式化工具
1700436757
1700436758
1700436759
[
上一页 ]
[ :1.70043671e+09 ]
[
下一页 ]