族谱网 头条 人物百科

文学编程

2020-10-16
出处:族谱网
作者:阿族小谱
浏览:497
转发:0
评论:0
概念文学程序是用自然语言(比如英语)写出来的对程序逻辑的解释,程序中交织点缀着宏和传统源代码段。在文学编程的源文件中,宏很简单,它或与标题类似,或是解决编程问题时用人类语言描述抽象的解释性短语。它把代码段或更低层次的宏隐藏了起来,且与计算机科学教学时经常用到的,用伪码写的算法相似。这些任意解释的短语成为新的精确的操作符,操作符由程序员在运行过程中创建,组成了在基本编程语言之上的“元语言”。预处理器用于替换任意层级,说得更准确些是“在"网"和宏之间创建联系”,用命令"tangle"产生可编译源代码,用命令"weave"产生文档。预处理器还提供了写出宏的内容的能力和在文学程序源文件中的任何地方增加已创建的宏的能力,由此不必受传统编程语言强加的那些限制或是打断自己的思路。优点根据高德纳本人所说,文学编程为高质量程序而生,因为它强迫程序员显式描述程序背后的思路,让不充分的设计决策无所遁形。高德纳还...

概念

文学程序是用自然语言(比如英语)写出来的对程序逻辑的解释,程序中交织点缀着宏和传统源代码段。在文学编程的源文件中,宏很简单,它或与标题类似,或是解决编程问题时用人类语言描述抽象的解释性短语。它把代码段或更低层次的宏隐藏了起来,且与计算机科学教学时经常用到的,用伪码写的算法相似。这些任意解释的短语成为新的精确的操作符,操作符由程序员在运行过程中创建,组成了在基本编程语言之上的“元语言”。预处理器用于替换任意层级,说得更准确些是“在"网"和宏之间创建联系”,用命令"tangle"产生可编译源代码,用命令"weave"产生文档。预处理器还提供了写出宏的内容的能力和在文学程序源文件中的任何地方增加已创建的宏的能力,由此不必受传统编程语言强加的那些限制或是打断自己的思路。

优点

根据高德纳本人所说,文学编程为高质量程序而生,因为它强迫程序员显式描述程序背后的思路,让不充分的设计决策无所遁形。高德纳还声称文学编程提供了一流的文档系统,它并非插件,而是随着编程思路的慢慢展现而不断自然发展的过程。产生出来的文档使作者能在以后的任何时间重新找到自己的思路,也能使其他程序员更容易理解程序的建构过程。这与传统文档不同,那里程序员必须和编译器规定的代码顺序写在一起,还必须从代码和注释中重现当时的思路。文学编程的元语言能力也据称普遍利于思考,能从更高的层次统观代码,也能增加人的智能可成功保持和处理的概念数量。Applicability of the concept to programming on a large scale, that of commercial-grade programs is proven by an edition of TeX code as a literate program.

误解

文学编程常常被误解为不过是从有源代码和注释的文件中产生格式化文档,或是在代码里写大量的注释。这一误解导致那些文档析出工具,如Perl的Plain Old Documentation系统也被称为“文学编程工具”。尽管如此,因为这些工具没有实现隐藏在自然语言宏系统背后的“抽象概念网”,或是提供把机器规定的源代码顺序变为人类思维更容易理解的顺序的能力,它们不能在高德纳提出的意义下被称作文学编程工具。

例子

一个文学编程的经典例子是标准Unix单词计数程序wc的文学实现。高德纳在他的《文学编程》书中的第12章展示了这个例子的CWEB版本。后来它也为noweb文学编程工具而重写。这一例子漂亮地阐释了文学编程的基本元素。

下面这个wc的文学编程代码片断展示了在文学编程中用来创建宏的自然语言的描述性词组有多随意,宏作为文学编程语言中新的“操作符”,并且隐藏了代码块或其它的宏。由两个尖括号组成("")的标记符号表示宏,"@"符号在noweb文件中表示一节代码的结束。""符号表示“根”,即最上层节点,文学编程工具要从这里展开宏组成的网。实际上,扩展的源代码可通过任何节和小节(即标为"="的代码)写出来,所以一个文学程序文件可包括多个机器源代码文件。

wc的目的是对多个文件中的行、单词和字母计数。文件中的行数是......../更多解释/这里是由noweb程序wc.nw定义的文件wc.c的概述:=<><><><><>@我们必须包含标准输入输出定义,因为我们想发送格式化的输出到stdout和stderr上。<>=#include@

Note also that the unraveling of the chunks can be done in any place in the literate program text file, not necessarily in the order they are sequenced in the enclosing chunk, but as is demanded by the logic reflected in the explanatory text that envelops the whole program.

宏和标准文档中的“节名”不同。文学编程的宏能隐藏任何代码块,并且被用于任何低层次的机器语言操作符内,常常在如"if", "while"或 "case"这样的逻辑操作符内。这会在下面这段文学程序wc的代码片断中解释。

这里的代码块做了计数的工作,这正是wc存在的目的,实际上非常容易写。我们察看每一个字母并且如果它是一个单词的开始或结束,则会更改状态。<>=while(1){<>c=*ptr++;if(c>" "&&c<0177){/* visible ASCII codes */if(!in_word){word_count++;in_word=1;}continue;}if(c=="\n")line_count++;elseif(c!=" "&&c!="\t")continue;in_word=0;/* c is newline, space, or tab */}@

实际上,宏能代表任意的代码块和其它宏,并且因此比自顶向下或自底向上的代码块或小节更通用。高德纳说当他意识到这一点后,他开始把程序想成不同部分组成的“网”。

在noweb文学程序中,除了可以任意顺序展现代码外,宏背后的代码块,一旦由"="引入,可以在文件后面的任何一个地方通过简单地写"="进行扩充并且往里添加更多的内容,如下面这个代码片断所示("+"为了可读性而被文档格式化器所添加,它并不在代码中)。

Thegrandtotalsmustbeinitializedtozeroatthebeginningoftheprogram.Ifwemadethesevariableslocaltomain,wewouldhavetodothisinitializationexplicitly;however,Cglobalsareautomaticallyzeroed.(Orrather,``staticallyzeroed.""(Getit?)<>+=longtot_word_count,tot_line_count,tot_char_count;/* total number of words, lines, chars */@

文学编程的文档作为写程序的一部分而产生。Instead of comments provided as side notes to source code a literate program contains the explanation of concepts on each level, with lower level concepts deferred to their appropriate place, which allows for better communication of thought. The snippets of the literate wc above show how an explanation of the program and its source code are interwoven. Such exposition of ideas creates the flow of thought that is like a literary work. Knuth famously wrote a "novel" which explains the code of the computer strategy game Colossal Cave Adventure, perfectly readable.

文学编程工具

第一个发布的文学编程环境是WEB,由高德纳于1981年为他的TeX排版系统而引入。它使用Pascal作为其基础编程语言,使用TeX作为文档排版工具。The complete commented TeX source code was published in Knuth"s TeX: The program, volume B of his 5-volume Computers and Typesetting. Knuth had privately used a literate programming system called DOC as early as 1979. He was inspired by the ideas of Pierre-Arnoul de Marneffe. The free CWEB, written by Knuth and Silvio Levy, is WEB adapted forCandC++, runs on most operating systems and can produce TeX andPDFdocumentation.

其它的文学编程概念的实现有noweb和FunnelWeb,它们都是源代码独立的。Noweb以其简单而知名:just 2 text markup conventions and 2 tool invocations are needed to use it, and it allows for text formatting in HTML rather than going through the TeX system. FunnelWeb is another program without dependency on TeX which can produce HTML documentation output. It has more complicated markup (with "@" escaping any FunnelWeb command), but has many more flexible options.

The Leo text editor is an outlining editor which supports optional noweb and CWEB markup. The author of Leo actually mixes two different approaches: first, Leo is an outlining editor, which helps with management of large texts, second, Leo incorporates some of the ideas of literate programming, which in its pure form (i.e. the way it is used by Knuth Web tool and/or tools like "noweb") is possible only with some degree of inventiveness and the use of the editor in a way not exactly envisioned by its author (in modified @root nodes). However this and other extensions (@file nodes) make outline programming and text management successful and easy and in some ways similar to literate programming.

Haskell编程语言对半文学编程有原生支持,其来源于CWEB但用了较简单的实现。如果想要TeX输出,你可以写 a plainLaTeXfile where source code is marked by a given surrounding environment; LaTeX can be set up to handle that environment, while the Haskell compiler looks for the right markers to identify Haskell statements to compile, removing the TeX documentation as if they were comments. However, as described above, this is not literate programming in the sense intended by Knuth. Haskell"s functional, modular nature makes literate programming directly in the language somewhat easier, but it is not nearly as powerful as one of the a WEB tools where "tangle" can reorganize in arbitrary ways.

 

参见

Sweave- an example of use of the "noweb"-like Literate Programming tool inside the R language for creation of dynamic statistical reports

进一步阅读

Knuth, Donald E. Literate Programming. , California:Stanford UniversityCenter for the Study of Language and Information. 1992. ISBN 978-0937073803. 

Guari, Eitan M. TeX & LaTeX: Drawing and Literate Programming. McGraw Hill. 1994. ISBN 0-07-911616-7.  (includes software).

Nørmark, Kurt.Literate Programming - Issues and Problems.University of Aalborg. August 13, 1998. 


免责声明:以上内容版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。感谢每一位辛勤著写的作者,感谢每一位的分享。

——— 没有了 ———
编辑:阿族小谱
发表评论
写好了,提交
{{item.label}}
{{commentTotal}}条评论
{{item.userName}}
发布时间:{{item.time}}
{{item.content}}
回复
举报
点击加载更多
打赏作者
“感谢您的打赏,我会更努力的创作”
— 请选择您要打赏的金额 —
{{item.label}}
{{item.label}}
打赏成功!
“感谢您的打赏,我会更努力的创作”
返回

更多文章

更多精彩文章
打赏
私信

推荐阅读

· 极限编程
历史极限编程的创始者是肯特·贝克、沃德·坎宁安和罗恩·杰弗里斯(英语:RonJeffries),他们在为克莱斯勒综合报酬系统(英语:ChryslerComprehensiveCompensationSystem)的薪水册项目工作时提出了极限编程方法。肯特·贝克在1996年3月成为克莱斯勒系统的项目负责人,开始对项目的开发方法学进行改善。他写了一本关于这个改善后的方法学的书,并且于1999年10月将之发行,这就是《极限编程解析》(2005第二版出版)。克莱斯勒在2000年2月取消了实质上并未成功的克莱斯勒系统,但是这个方法学却一直流行在软件工程领域中。至今2006年,很多软件开发项目都一直以极限编程做为他们的指导方法学。该书阐述了如下的极限编程的哲学思想:一种社会性的变化机制一种开发模式一种改进的方法一种协调生产率和人性的尝试一种软件开发方法把极限编程一般化并用于其它类型的专案称为极限专案管...
· 编程范型
例子结构化编程对比非结构化编程命令式编程对比宣告式编程消息传递编程对比命令式编程程序编程对比函数式编程Value-levelprogramming对比Function-levelprogramming流程驱动编程对比事件驱动编程纯量编程对比阵列编程基于类编程对比基于原型编程(在面向对象编程的上下文中)Rule-basedprogramming对比Constraintprogramming(在逻辑编程的上下文中)基于组件编程(如OLE)面向方面编程(如AspectJ)符号式编程(如Mathematica)面向表格编程(如MicrosoftFoxPro)管道编程(如Unix命令中的管道)Post-objectprogramming面向主题编程自省编程或称反射编程参见ArsbasedprogrammingMemetics
· 编程语言
概论编程语言原本是被设计成专门使用在计算机上的,但它们也可以用来定义算法或者数据结构。正是因为如此,程序员才会试图使程序代码更容易阅读。编程语言往往使程序员能够比使用机器语言更准确地表达他们所想表达的目的。对那些从事计算机科学的人来说,懂得程序设计语言是十分重要的,因为在当今所有的计算都需要程序设计语言才能完成。目前发明了许多的编程语言,编程语言本身可能修改以匹配新需求,或是和其他的编程语言结合使用,尽管人们多次试图创造可以匹配所有需求的通用编程语言,但以“匹配所有需求”的标准来看,这些尝试都失败了。之所以有那么多种不同的编程语言存在的原因是,编写程序的初衷其实也各不相同;新手与老手之间技术的差距非常大,而且有许多语言对新手来说太难学;还有,不同程序之间的运行成本(runtimecost)各不相同。有许多用于特殊用途的语言,只在特殊情况下使用。例如,PHP专门用来显示网页;Perl更适合文...
· 逻辑编程
历史早在二十世纪七十年代,罗伯特·科瓦尔斯基(英语:RobertKowalski)等人提出了逻辑可以作为程序设计语言的基本思想,把逻辑和程序这两个截然不同的概念协调统一为一个概念,于是诞生了逻辑程序设计。这也是早期自动定理证明和人工智能发展的自然结果。随后,逻辑程序设计得到了迅速发展,特别是基于一阶谓词的逻辑程序设计语言,将逻辑推理对应于计算,具有丰富的表达能力、非确定性等特点,在定理机器证明、关系数据库系统、程序验证、模块化程序设计和非单调推理等都有了广泛的应用。
· 命令式编程
参见(对立的)宣告式编程

关于我们

关注族谱网 微信公众号,每日及时查看相关推荐,订阅互动等。

APP下载

下载族谱APP 微信公众号,每日及时查看
扫一扫添加客服微信