唐纳德科文化的文化编程

2021-04-13 05:37:52

识字编程是由唐纳德KNUCH引入的编程范式,其中计算机程序以自然语言为其逻辑的解释,例如英语,跨越宏的片段和传统源代码,可以生成可编译的源代码。 [1]该方法用于科学计算和数据科学,用于可重复的研究和开放通道目的。 [2]识字编程工具今天使用数百万程序员使用。 [3]

Knuth构思的识字编程范例代表了以计算机施加的方式和顺序写入计算机程序的移动,而是使程序员能够以所需的逻辑和思想流程所需的顺序开发程序。 [4]识字计划被编写为以普通人语言的逻辑不间断地阐述,非常类似于文章的文本,其中包括宏以隐藏抽象和传统源代码。

识字编程(LP)工具用于从识字源文件中获取两个表示:一个适合于计算机的进一步编译或执行计算机,"纠结"代码,另一个用于观看格式化文档,据说是"编织"来自识字来源。 [5]虽然第一代识字编程工具是特定于计算机语言的,但后来的是语言不可知,并且存在于编程语言之上。

Knuth于1984年首次由Knuth介绍。这种方法背后的主要目的是将计划视为人类谅解易懂的文学。这种方法是在斯坦福大学实施作为算法和数字排版研究的一部分。这种实施称为#34; Web"由Knuth他认为,它是少数人的英语三个字母的单词之一,它已经应用于计算。然而,它正确类似于从简单材料拼凑在一起的软件的复杂性质。 [1]识字编程的实践在2010年代,使用笔记本电脑,特别是在数据科学中的重要性。

识字编程正在用包含(由原始标记分隔)代码片段和宏的人类语言编写程序逻辑。在识字源文件中的宏是以人类语言的标题类似或解释性的短语,该语言描述在解决编程问题的同时创建的人类抽象,以及隐藏代码或较低级宏的块。这些宏与通常用于教学计算机科学的伪代码中的算法类似。这些任意的解释性短语成为精确的新运算符,由程序员驾驶创建,在底层编程语言之上形成元语言。

预处理器用于替换任意层次结构,或者相反"互连'网页'宏",[7]用一个命令制作可编译的源代码("纠结"),以及另一个命令("编织")的文档。预处理器还提供了写出宏内容的能力,并在文盲程序源文件中的文本中的任何位置添加到已经创建的宏,从而配置需要注意传统编程语言所施加的限制或打断思想的流程。

根据Knuth,[8] [9]识字编程提供更高质量的计划,因为它迫使程序员明确地说明程序背后的思想,使得想象出的设计决策更加明显。 Knuth还声称,识字编程提供了一流的文档系统,这不是加载项,但是在计划期间举行的博览会的过程中自然生长在'创作期间的思想。 [10]结果文档允许作者在稍后的时间内重新启动他自己的思维过程,并允许其他程序员更容易地了解程序的构建。这与传统文档不同,其中程序员介绍了遵循编译器施加的顺序的源代码,并且必须从代码及其相关评论中解密程序后面的思想过程。识字编程的元语言能力也被声称促进思考,给予更高的"鸟类'眼睛视图"代码和增加概念的数量可以成功地保留和处理。概念对大规模编程的适用性,商业级计划的编程是由TEX代码作为识字计划的一版本来证明的。 [8]

KNUTH还声称,识字编程可能导致软件将软件移植到多个环境,甚至引用TEX的实现为例。 [11]

识字编程通常误解[12]仅引用由源代码和注释的公共文件生成的格式化文档 - 这是正确称为文档生成的 - 或代码中包含的庞大评论。这是识字编程的悔改:从代码中提取的良好记录的代码或文档遵循代码的结构,其中嵌入在代码中的文档;虽然在识字编程中,代码嵌入文档中,并且在文档结构之后的代码。

这种误解导致声称评论 - 提取工具,例如Perl普通旧文档或Java Javadoc系统,"识字编程工具"但是,因为这些工具不实现"抽象概念的网页"隐藏在自然语言宏的系统后面,或者提供将源代码的顺序从机器施加的序列更改为人类思维的一个方便的能力,他们无法在Knuth的意义上正确地称为识字编程工具。 [12] [13]

1986年,Jon Bentley要求Knuth通过在Web中写入程序来展示识字编程的概念。 Knuth提出了一个8页的长单片上市,并由贝尔实验室道格拉斯麦克约批评。麦克罗伊赞扬了Knuth' s解决方案的复杂性,他选择了数据结构(Frank M. Liang' S Hash Trie),但指出,实施,调试和修改问题的解决方案更加实用,更快通过重用标准UNIX实用程序只有六行shell脚本。麦克约队得出结论:[14]

Knuth向我们展示了如何编程清晰,但不是明智地编程。我买了学科。我不买到结果。他塑造了一种工业强度的制造鸡蛋复杂,精致,超越所有普通的欲望,博物馆从一开始。

麦克罗伊后来承认,他的批评是不公平的,因为他批评了Knuth' knuth' s的目的只是展示了识字编程技术。 [15]在1987年,ACM的通信发布了一个跟进文章,该文章用C程序阐述了具有麦克罗伊的工程方法的C程序的艺术方法,由John Gilbert具有批评。 [16]

编织和纠结是在同一个源上完成的,以便它们彼此一致。

识字编程的经典示例是识字的UNIX WC Word计数程序的识字实现。 Knuth在他的识字编程书的第12章中介绍了这个例子的CWeb版本。同样的例子稍后重写为NoweB知识编程工具。 [17]该示例提供了识字编程的基本元素的良好插图。

WC识字计划的以下片段[17]显示了在识字计划中使用自然语言中的任意描述性短语,以创建宏,充当新的"运营商"在识字编程语言中,隐藏代码或其他宏的块。标记符号由双角支架(">>")表示,表明宏," @"符号,表示在NoweB文件中的代码部分的末尾。 " <>"符号代表" root",最顶层节点识字编程工具将开始扩展宏的Web。实际上,写出扩展的源代码可以从任何部分或小节(即指定为&#34的代码;<块>> =&#34 ;,标志)此外,因此一个识字程序文件可以包含具有机器源代码的多个文件。

WC的目的是在文件列表中计算线条,单词和/或字符。文件中的行数为........ /更多的解释/此处,则是文件WC的概述。 C由NoweB程序WC定义。 NW:<> =<<标题文件包含>> <<定义>> <<全球变量>> <<功能>> <<主程序>> @我们必须包含标准的I / O定义,因为我们要将格式化输出发送到STDOUT和STDERR。 <<标题文件包含>> = ##clude< stdio.h> @

块的解开可以在识字程序文本文件中的任何位置进行,而不是按顺序排列在封闭块中的顺序中,但正如逻辑反映在包围整个程序的解释性文本中的逻辑所要求的那样。

宏与"部分名称"在标准文档中。识字编程宏可以隐藏在自己后面的任何代码块,并在任何低级机器语言运营商内使用,通常在逻辑运算符中,如"如果&#34 ;," "或"案例"这由WC识字计划的以下片段说明。 [17]

当前的块是计数,实际上是最简单的写作之一。如果它开始或结束一个单词,我们会查看每个字符和更改状态。 &lt;&lt;扫描文件&gt;&gt; = whis(1){&lt;如果它是空的,则填充缓冲区;在文件结束时休息&gt;&gt; c = * ptr ++; if(c&gt;&#39;&#39;&amp; c <&amp; c&lt; 0177){/ *可见ascii代码* / if(!in_word){word_count ++; in_word = 1; } 继续 ; }如果(c ==&#39; \ n&#39;)line_count ++;否则如果(c!=&#39;&#39;&amp; c!=&#39; \ t&#39;)继续; in_word = 0; / * c是换行符,空格或标签* /} @

事实上,宏可以代表任何任意块的代码或其他宏,因此比自上而下或自下而下的&#34更广泛;分布&#34;或比小部分。 Knuth说,当他意识到这一点时,他开始将一个程序视为各个部分的网络。 [1]

除了博览会的自由命令之外,在日常识字课程中,宏后面的块,曾经与&#34引入; &lt;&gt;&gt; =&#34;,可以通过简单地写作&#34稍后在文件中的任何地方生长; &lt;&lt; chunk&gt;&gt; =&#34;并将更多内容添加到它,如以下代码段说明(&#34; plus&#34;由文档格式化程序添加以获得可读性,并且不在代码中)。 [17]

程序的开头必须初始化大总数为零。如果我们将这些变量本地到主要的变量,我们必须初始化初始化;但是,C全球自动归零。 (或者相反,``静态zerod。 / @

识字计划的文档是作为编写程序的一部分而产生的。而不是作为源代码的副注目提供的评论,识字计划包含每个级别的概念的解释,其中较低的概念推迟到其适当的地方,这允许更好地沟通思想。上面的文字WC的片段显示了如何解释程序及其源代码的解释。这种思想的阐述创造了像文学作品的思想的流动。 Knuth写了一个&#34;新颖&#34;这解释了互动小说游戏巨大洞穴冒险的代码。 [18]

Axiom从Scratchpad演变,由IBM开发的计算机代数系统。它现在由Tim Daly,Scratchpad开发人员之一开发,Axiom完全被写为识字计划。

第一个出版的文盲编程环境是Web,由Knuth于1981年引入他的Tex排版系统;它使用Pascal作为其底层编程语言和TEX,用于排版文档。完整的注释的TEX源代码已在Knuth&#39; tex:该计划,他的5卷计算机的卷B和排版。 Knuth私下使用了一个称为DOC的识字编程系统,早在1979年。他受到Pierre-ArnouldeMarneffe的想法的启发。 [19]由Knuth和Silvio Levy编写的免费CWeb是适用于C和C ++的Web,在大多数操作系统上运行,可以产生TEX和PDF文档。

识字编程概念有各种其他实现(其中一些实施者没有宏观,因此违反人类逻辑原则的顺序):

它以其简单而闻名,并且它允许HTML中的文本格式而不是通过TEX系统。

它可以将单个LP源转换为任意数量的代码文件。它在单一的调用中进行;它没有单独的编织和纠结命令。它没有NoweB的可扩展性

尊重缩进,这可以为Python等语言进行可用,尽管您可以将其用于任何编程语言。

旨在使用&#34现代化和缩放;折叠HTML&#34;和#34;虚拟视图&#34;在代码上。它使用&#34; noweb&#34;标记识字源文件。

它是一种逆文化编程工具,可作为Ruby Gem提供。代替识字文档源中提取的机器可读源代码,从普通机器可读源代码文件中提取了识字文档。

需要Babel,[20],允许在单个文本文档中从多个编程语言[21]中嵌入源代码块。代码块可以彼此共享数据,使用NoweB引用语法将内联显示映像,或者被解析为纯源代码。 [22]

CoffeeScript支持A&#34;识字&#34;模式,它使程序能够从用缩进代码块编写的源文档编译程序。 [23]

Maple工作表是一个平台可靠的识字界面编程环境,将文本和图形与Live Code合并以获得符号计算。 &#34;枫木工作表&#34; www.maplesoft.com。

Wolfram笔记本是一种平台 - 无人知的知识式编程方法,将文本和图形与实时代码相结合。 [24] [25]

提供一个交互式编程环境,用于评估每个语句,并显示作为编辑代码的实时结果。游乐场还允许用户添加标记语言以及提供标题,内联格式和图像的代码。 [26]

以笔记本电脑的格式作用,将标题,文本(包括乳胶),绘图等与书面代码相结合。

nbdev是一个库,允许您在Jupyter笔记本电脑中开发一个Python库,将所有代码,测试和文档放在一个地方。

计划主要是散文。 [28] eve将Datalog的变体与实时图形开发环境结合起来。

PDF,Microsoft Word,LibreOffice和演示文稿或幻灯片显示格式以及HTML小部件等交互式格式

Leo文本编辑器是一个概述编辑器,它支持Optional NoweB和CWeb标记。 Leo的作者混合了两种不同的方法:首先,Leo是一个概述编辑,有助于管理大文本;其次,Leo包含一些识字编程的想法,它的纯粹形式(即Knuth Web工具或工具使用的方式,如&#34; Noweb&#34;)只有一定程度的创造性和在不完全由其作者(修改后的@root节点中)的方式使用编辑器。但是,这个和其他扩展(@file节点)使大纲编程和文本管理成功,并且简单,并且以某种方式类似于识字编程。 [34]

Haskell编程语言具有对半识流编程的本机支持。编译器/解释器支持两个文件名扩展:.hs和.lhs;后者代表了识字哈克尔。

识字脚本可以是完整的乳胶源文本,同时可以编译,没有更改,因为解释器只能在代码环境中编译文本,例如

%在这里描述函数的文本:\ begin {code}事实0 = 1事实(n + 1)=(n + 1)*事实n \ neg {code}更多文本

代码也可以在理查德鸟样式中标记,从符号和空格开始,从符号和空格,以空白行结尾。

乳胶列表包提供了一个lstlisting环境,可用于装饰源代码。它可用于定义在Haskell中使用的代码环境来打印符号,如:

\ newenvironment {code} {\ lstlistings [language = haskell]} {\ endlstlistings} \ begin {code} comp ::(beta - &gt; gamma) - &gt; (alpha - &gt; beta) - &gt; (alpha - &gt; gamma)(g`comp`f)x = g(f x)\结束{code}

可以配置为产生这样的东西:COMP ::(β→γ)→(α→β)→(α→γ)(g comp = f)x = g(fx){\ displaystyle {\ begin {staliged} &amp; comp ::(\ beta \ to \ gamma)\ to(\ alpha \ to \ beta)\ to(\ alpha \ to \ gamma)\\&amp;(g \ operatorname {comp} f)x = g( fx)\结束{对齐}}}

虽然包不提供组织代码块的手段,但是可以将乳胶源代码拆分在不同的文件中。请参阅概述清单手册。

Web 68识字编程系统使用Algol 68作为底层编程语言,虽然预处理器&#39中没有任何内容;唐&#39;强制使用该语言。 [35]

文本编码计划的自定义机制,其实现了TEI方案的约束,修改或扩展,使用户能够将散文文档与架构规范的片段混合在其一个文档中,所有格式都是它的。从该散文文档,模式和处理模型管道可以生成,并且KNUTH&#39;识字编程范式被引用为这种工作方式的灵感。 [36]

文档生成器 - 识字编程的反向文档中嵌入并从源代码生成的编程

Sweave和Knitr - 使用和#34; Noweb&#34; -llike intrate编程工具内的R语言内,用于创建动态统计报告

^ Schulte,Eric(2012)。 &#34;一种用于识字编程和可重复研究的多语言计算环境和#34; (PDF)。统计软件杂志。 46(3)。 DOI:10.18637 / jss.v046.i03。从2014年11月9日的原件存档(PDF)。

^ Kery,Mary Beth(2018年4月)。 &#34;笔记本中的故事:使用识字编程工具&#34的探索性数据科学; 18:18:2018年CHI会议的计算系统中的人为因素会议。 ACM。第1-11页。 DOI:10.1145 / 3173574.3173748。

^&#34;我的感觉是自上而下和自下而上的反对方法:一个人更适合计划博览会和另一个莫 ......