计算机程序设计艺术(熟练使用文学编程(literate programming)是怎样一番体验)
什么是“文学编程”?
“文学编程”是算法大神高德纳提出的编程方法,希望能用來取代传统的结构化编程方式。
高德纳何许人也?
高德纳(英語:Donald Ervin Knuth,音译:唐纳德·尔文·克努斯,1938年1月10日-),出生于美国密尔沃基,著名计算机科学家,斯坦福大学计算机系荣誉退休教授。高德纳教授是现代计算机科学的先驱人物,创造了演算法分析的領域,在多个理论计算机科学的分支做出基石一般的贡献。在计算机科学及数学领域发表了多部具广泛影响的论文和著作。1974年图灵獎得主。
高德纳也是一个有趣的人,他会奖励每一个找出他的著作中任何错误的人,他们每指出TEX的一个错误,就能得到2.56美元,因为“256美分刚好是十六进制的一美元”(256 pennies is one hexadecimal dollar);另外,对于每个“有价值的建议”,他设立了0.32美元的奖金。高德纳可以算是一名标准的黑客,他最喜欢的软件是Emacs,并曾向其作者理查·史托曼提交修补补丁。
文学编程的目的、概念与工具
正如高德纳所构想的那样,文学编程的目的是:将程序员从面向机器的枯燥思维中解放出来你,用人类日常使用的语言来自由地表达逻辑。
为了实现这一目标,高德纳定义了三个概念和两个工具:
概念1:巨集。它用来隐藏具体的实现,存在形态通常是一段自然语言的话。你可以把它直观地看作是对一段源代码的高度抽象和描述。
巨集由两个尖括号组成("<<...>>")的标记符号表示,"@"符号在noweb文件中表示一节代码的结束。"<<*>>"符号表示“根”,即最上层节点,文学编程工具要从这里展开巨集组成的网。
例子如下:
这里是由noweb程序wc.nw定义的文件wc.c的概述:
<<*>>=
<<包含头文件>>
<<定义>>
<<全局变量>>
<<函数>>
<<主程序>> @
概念2:绕出。众所周知,计算机最终能识别和运行的是二进制文件,所以上述用自然语言描述的文学源文件,必须通过工具转换成可编译、执行的形态,这个过程称为“绕出”(tangled)。
概念3:织出。相信80%以上的程序员都比较讨厌写文档。将文学源文件的信息抽取出来,形成可读性高的文档的过程,称为“织出”(woven)。
工具1:WEB。它是第一种实现“文学编程”的语言。如前面所讲到的,它的目标是通过在描写性的文字中嵌入源代码,让开发者如同创建文学作品一样编写软件;而非像其他大多数编程语言中一样。相反,所采用的结构更注重人阅读要求,而非编译器的要求。
CWEB是WEB的C语言新版本。
工具2:noweb。是另外一种借鉴了WEB的文学编程工具,但是它的优势在于与语言无关。
这里的代码块做了计数的工作,这正是wc存在的目的,实际上非常容易写。我们查看每一个字母并且如果它是一个单词的开始或结束,则会更改状态。
文学编程的体验
文学编程使得用自然语言进行编程变得可行,而且把传统的“树形编程思维”转换成了“网状编程思维”。后者更符合人类大脑的工作方式——想想人脑的神经元是如何连接的。
来看看高德纳的原话:
"我感觉自顶向下和自底向上是两种截然相反的方法论:一个更适合分析程序,一个更适合创建程序。但是,使用WEB编程后,我意识到不必在自顶向下和自底向上之间艰难抉择,因为我们最好把程序的结构看作网状而不是树状的。层级结构是存在的,但对于程序来说,最重要的是其结构的关系。一个复杂的软件由多个简单部分和它们之间的简单关系构成。程序员的任务是用人类最易理解的顺序,而不是用像自顶向下或自顶向上之类刻板僵硬的顺序,来描述清楚这些部分和关系。"
最后的一点补充
巨集和标准文档中的“节名”不同。文学编程的巨集能隐藏任何代码块,并且被用于任何低层次的机器语言操作符内,常常在如"if", "while"或 "case"这样的逻辑操作符内。
<<扫描文件>>=
while (1) {
<<Fill buffer if it is empty; break at end of file>>
c = *ptr++;
if (c > ' ' && c < 0177) {
/* visible ASCII codes */
if (!in_word) {
word_count++;
in_word = 1;
}
continue;
}
if (c == 'n')
line_count++;
else if (c != ' ' && c != 't')
continue;
in_word = 0; /* c is newline, space, or tab */
}
@
二手机械设备交易市场(二手挖掘机去哪买比较靠谱)
1、国内挖机的二手市场基本上以上海,深圳这两地最全最大。 2、上海那边不太了解,深圳相对知道一点。 3、早年深圳的机确实很不错,原装原机而且型号齐全,可能是深圳靠近香港...[详细]