什么是“文学编程”?“文学编程”是算法大神高德纳提出的编程方法,希望能用來取代传统的结构化编程方式。
高德纳何许人也?高德纳(英語:Donald Ervin Knuth,音译:唐纳德·尔文·克努斯,1938年1月10日-),出生于美国密尔沃基,著名计算机科学家,斯坦福大学计算机系荣誉退休教授。
高德纳教授是现代计算机科学的先驱人物,创造了演算法分析的領域,在多个理论计算机科学的分支做出基石一般的贡献。
在计算机科学及数学领域发表了多部具广泛影响的论文和著作。
1974年图灵獎得主。
高德纳所写的《计算机程序设计艺术》(The Art of Computer Programming)是计算机科学界最受高度敬重的参考书籍之一。
他也是排版软件TEX和字型设计系統metafont的发明人。
高德纳也是一个有趣的人,他会奖励每一个找出他的著作中任何错误的人,他们每指出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。
它是第一种实现“文学编程”的语言。
如前面所讲到的,它的目标是通过在描写性的文字中嵌入源代码,让开发者如同创建文学作品一样编写软件;而非像其他大多数编程语言中一样。
相反,所采用的结构更注重人阅读要求,而非编译器的要求。
WEB包含了2个主要程序:TANGLE,从源文本生成可编译的Pascal代码,以及WEAVE,使用TEX生成格式漂亮,可打印的文档。
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) { if (!in_word) { word_count++; in_word = 1; } continue; } if (c == 'n') line_count++; else if (c != ' ' && c != 't') continue; in_word = 0; } @
简单来讲就是闲的。
我这两年转开发岗了以后还没有遇到过很明显的语言方面的问题。
大量的时间和精力都是花在解决业务上的问题上面的。
所以有这样的闲工夫,还是努力把业务上的问题搞得更好一些吧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)