文学编程()是由高德纳提出的编程方法,希望能用來取代结构化编程范式。
正如高德纳所构想的那样,文学编程范式不同于传统的由计算机强加的编写程序的方式和顺序,而代之以让程序员用他们自己思维内在的逻辑和流程所要求的顺序开发程序。文学编程自由地表达逻辑,而且它用人类日常使用的语言写出来,就好像一篇文章一样,文章里包括用来隐藏抽象的巨集和传统的源代码。文学编程工具用来从文学源文件中获得两种表达方式,一种用于计算机进一步的编译和执行,称作“绕出”(tangled)的代码,一种用于格式化文档,称作从文学源代码中“织出”(woven)。。虽然第一代文学编程工具特定于计算机语言,但后来的工具可以不依赖具体语言,并且存在于比编程语言更高的层次中。
概念
文学程序是用自然语言(比如英语)写出来的对程序逻辑的解释,程序中交织点缀着巨集和传统源代码段。在文学编程的源文件中,巨集很简单,它或与标题类似,或是解决编程问题时用人类语言描述抽象的解释性短语。它把代码段或更低层次的巨集隐藏了起来,且与计算机科学教学时经常用到的,用虛擬碼写的算法相似。这些任意解释的短语成为新的精确的操作符,操作符由程序员在运行过程中创建,组成了在基本编程语言之上的“元语言”。
预处理器用于替换任意层级,说得更准确些是“在'网'和巨集之间建立联系”,用命令"tangle"产生可编译源代码,用命令"weave"产生文档。预处理器还提供了写出巨集的内容的能力和在文学程序源文件中的任何地方增加已创建的巨集的能力,由此不必受传统编程语言强加的那些限制或是打断自己的思路。
优点
根据高德纳本人所说,文学编程为高质量程序而生,因为它强迫程序员显式描述程序背后的思路,让不充分的设计决策无所遁形。高德纳还声称文学编程提供了一流的文档系统,它并非插件,而是随着编程思路的慢慢展现而不断自然发展的过程。产生出来的文档使作者能在以后的任何时间重新找到自己的思路,也能使其他程序员更容易理解程序的建构过程。这与传统文档不同,那里程序员必须和编译器规定的代码顺序写在一起,还必须从代码和注释中重现当时的思路。文学编程的元语言能力也普遍利于思考,能从更高的层次统观代码,也能增加人的智能可成功保持和处理的概念数量。该概念适用于大规模编程,商业级程序的适用性被 TeX 代码版本证明为文学程序。
误解
文学编程常常被误解为不过是从有源代码和注释的文件中产生格式化文档,或是在代码里写大量的注释。这一误解导致那些文档析出工具,如Perl的系统也被称为“文学编程工具”。尽管如此,因为这些工具没有实现隐藏在自然语言巨集系统背后的“抽象概念网”,或是提供把机器规定的源代码顺序变为人类思维更容易理解的顺序的能力,它们不能在高德纳提出的意义下被称作文学编程工具。
例子
一个文学编程的经典例子是标准Unix单词计数程序wc的文学实现。高德纳在他的《文学编程》书中的第12章展示了这个例子的CWEB版本。后来它也为文学编程工具而重写。这一例子漂亮地阐释了文学编程的基本元素。
;创建巨集
下面这个wc的文学编程
文学编程工具
第一个发布的文学编程环境是WEB,由高德纳于1981年为他的TeX排版系统而引入。它使用Pascal作为其基础编程语言,使用TeX作为文档排版工具。完整的带注释的 TeX 源代码在高德纳的5卷中的TeX: The program里被发表。早在1979年,高德纳私下使用过一个名叫DOC的文学编程系统。他受到思想的启发。. 免费的 CWEB, 被高德纳和 Silvio Levy编写,是适用于C 和 C++的WEB, 在大部分操作系统上运行,并可以产生TeX和PDF文件.
其它的文学编程概念的实现有noweb和FunnelWeb,它们都是源代码独立的。Noweb以其简单而知名:只有2个文本标记约定和2个调用被需要以使用它,它也允许HTML文本格式化而不是通过TeX系统。FunnelWeb是另一个不依赖于TeX的程序,可以输出HTML文档。它有更复杂的标记(“@”转义任何 FunnelWeb 命令),但有更多弹性选项。
是一个大纲编辑器,支持可选的 noweb 和 CWEB 标记。 Leo 的作者混合了两种不同的方法:首先,Leo 是一个大纲编辑器,有助于管理大文本; 其次,Leo 融合了一些文学编程的思想,其纯粹的形式(即 Knuth Web 工具或“noweb”之类的工具使用它的方式)只有在一定程度的创造性和使用编辑器的情况下才有可能 以作者未完全设想的方式(在修改后的 @root 节点中)。 但是,这个和其他扩展(@file 节点)使大纲编程和文本管理成功且容易,并且在某些方面类似于文学编程。
Haskell编程语言对半文学编程有原生支持,其来源于CWEB但用了较简单的实现。如果想要TeX输出,你可以写一个朴素的LaTeX文件,一个给定的环境标记出源代码; LaTeX可以被设置处理那个环境,Haskell 编译器查找正确的标记来确定编译的Haskell语句,像是注释一样舍弃掉TeX文档。但是,像以上描述,这不是高德纳文学编程的本意。Haskell的函数式,模块化使得语言中直接文学编程更加简单,但它远不如“绕出”可以以任意方式重组的 WEB 工具之一强大。
参见
- Sweave - an example of use of the "noweb"-like Literate Programming tool inside the R language for creation of dynamic statistical reports
参考文献
延伸阅读
*
- (includes software).
*
外部链接
*[http://www.literateprogramming.com literateprogamming.com]
*[http://www.faqs.org/faqs/literate-programming-faq/index.html comp.programming.literate FAQ] at Internet FAQ Archives
*[http://groups.google.com/group/comp.programming.literate Literate Programming newsgroup]
*[http://en.literateprograms.org/ LiteratePrograms] a literate programming wiki.
*[http://moonflare.com/code/select/index.php Select] A literate programming example using noweb
*[http://www.softpanorama.org/SE/literate_programming.shtml Softpanorama page] on literate programming
*[http://www.haskell.org/haskellwiki/Literate_programming Haskell] literate programming
*[http://www.haskell.org/onlinereport/literate.html Specification of literate programming in the Haskell Report] the accepted Haskell standard
*[http://www.cs.tufts.edu/~nr/noweb/ Noweb — A Simple, Extensible Tool for Literate Programming]
*[http://www.linux-france.org/~dmentre/lp4all/ Lp4all — A Simple Literate Programming Tool with a wiki-like markup syntax]
评论 (0)