literate

literate,第1张

literate 熟练使用文学编程(literate programming)是怎样一番体验?

什么是“文学编程”?“文学编程”是算法大神高德纳提出的编程方法,希望能用來取代传统的结构化编程方式。

高德纳何许人也?高德纳(英語: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; } @

简单来讲就是闲的。

我这两年转开发岗了以后还没有遇到过很明显的语言方面的问题。

大量的时间和精力都是花在解决业务上的问题上面的。

所以有这样的闲工夫,还是努力把业务上的问题搞得更好一些吧。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/4337789.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-10-29
下一篇 2022-10-30

发表评论

登录后才能评论

评论列表(0条)

保存