文學編程

subject=計算機科學
文學式編程（literate programming）是由高德納提出的編程方法，希望能用來取代結構化編程範型。 
正如高德納所構想的那樣，文學編程範型不同於傳統的由計算機強加的編寫程序的方式和順序，而代之以讓程序員用他們自己思維內在的邏輯和流程所要求的順序開發程序。文學編程自由地表達邏輯，而且它用人類日常使用的語言寫出來，就好像一篇文章一樣，文章裡包括用來隱藏抽象的巨集和傳統的源代碼。文學編程工具用來從文學源文件中獲得兩種表達方式，一種用於計算機進一步的編譯和執行，稱作“繞出”（tangled）的代碼，一種用於格式化文檔，稱作從文學源代碼中“織出”（woven）。。雖然第一代文學編程工具特定於計算機語言，但後來的工具可以不依賴具體語言，並且存在於比編程語言更高的層次中。

**概念**
文學程序是用自然語言（比如英語）寫出來的對程序邏輯的解釋，程序中交織點綴著巨集和傳統源代碼段。在文學編程的源文件中，巨集很簡單，它或與標題類似，或是解決編程問題時用人類語言描述抽象的解釋性短語。它把代碼段或更低層次的巨集隱藏了起來，且與計算機科學教學時經常用到的，用虛擬碼寫的算法相似。這些任意解釋的短語成為新的精確的操作符，操作符由程序員在運行過程中創建，組成了在基本編程語言之上的“元語言”。
預處理器用於替換任意層級，說得更準確些是“在'網'和巨集之間建立聯繫”，用命令"tangle"產生可編譯源代碼，用命令"weave"產生文檔。預處理器還提供了寫出巨集的內容的能力和在文學程序源文件中的任何地方增加已創建的巨集的能力，由此不必受傳統編程語言強加的那些限制或是打斷自己的思路。

**優點**
根據高德納本人所說，文學編程為高質量程序而生，因為它強迫程序員顯式描述程序背後的思路，讓不充分的設計決策無所遁形。高德納還聲稱文學編程提供了一流的文檔系統，它並非插件，而是隨著編程思路的慢慢展現而不斷自然發展的過程。產生出來的文檔使作者能在以後的任何時間重新找到自己的思路，也能使其他程序員更容易理解程序的建構過程。這與傳統文檔不同，那裡程序員必須和編譯器規定的代碼順序寫在一起，還必須從代碼和註釋中重現當時的思路。文學編程的元語言能力也2016-5-12普遍利於思考，能從更高的層次統觀代碼，也能增加人的智能可成功保持和處理的概念數量。該概念適用於大規模編程，商業級程序的適用性被 TeX 代碼版本證明為文學程序。

**誤解**
文學編程常常被誤解為不過是從有源代碼和註釋的文件中產生格式化文檔，或是在代碼裡寫大量的註釋。這一誤解導致那些文檔析出工具，如Perl的Plain Old Documentation系統也被稱為“文學編程工具”。儘管如此，因為這些工具沒有實現隱藏在自然語言巨集系統背後的“抽象概念網”，或是提供把機器規定的源代碼順序變為人類思維更容易理解的順序的能力，它們不能在高德納提出的意義下被稱作文學編程工具。

**例子**
一個文學編程的經典例子是標準Unix單詞計數程序wc的文學實現。高德納在他的《文學編程》書中的第12章展示了這個例子的CWEB版本。後來它也為Noweb文學編程工具而重寫。這一例子漂亮地闡釋了文學編程的基本元素。
創建巨集
下面這個wc的文學編程代碼片斷展示了在文學編程中用來創建巨集的自然語言的描述性詞組有多隨意，巨集作為文學編程語言中新的“操作符”，並且隱藏了代碼塊或其它的巨集。由兩個尖括號組成(">")的標記符號表示巨集，"@"符號在noweb文件中表示一節代碼的結束。">"符號表示“根”，即最上層節點，文學編程工具要從這裡展開巨集組成的網。實際上，擴展的源代碼可通過任何節和小節（即標為">="的代碼）寫出來，所以一個文學程序文件可包括多個機器源代碼文件。
wc的目的是對多個文件中的行、單詞和字母計數。文件中的行數是......../更多解釋/
這裡是由noweb程序wc.nw定義的文件wc.c的概述： 
>=
>
>
>
>
>
@

我們必須包含標準輸入輸出定義，因為我們想發送格式化的輸出到stdout和stderr上。
>=
#include 
@
還要注意，塊的分解可以在文字程序文本文件的任何地方進行，不一定按照它們在封閉塊中的順序，而是按照包含整個的解釋性文本中反映的邏輯的要求 程序。
作為網的程序 - 巨集不只是節的名字
巨集和標準文檔中的“節名”不同。文學編程的巨集能隱藏任何代碼塊，並且被用於任何低層次的機器語言操作符內，常常在如"if", "while"或 "case"這樣的邏輯操作符內。這會在下面這段文學程序wc的代碼片斷中解釋。

這裡的代碼塊做了計數的工作，這正是wc存在的目的，實際上非常容易寫。我們察看每一個字母並且如果它是一個單詞的開始或結束，則會更改狀態。
>=
while (1) {
>
c = *ptr++;
if (c > ' ' && c 
實際上，巨集能代表任意的代碼塊和其它巨集，並且因此比自頂向下或自底向上的代碼塊或小節更通用。高德納說當他意識到這一點後，他開始把程序想成不同部分組成的“網”。
人的邏輯順序，而不是編譯器的
在noweb文學程序中，除了可以任意順序展現代碼外，巨集背後的代碼塊，一旦由">="引入，可以在文件後面的任何一個地方通過簡單地寫">="進行擴充並且往裡添加更多的內容，如下面這個代碼片斷所示（"+"為了可讀性而被文檔格式化器所添加，它並不在代碼中）。
The grand totals must be initialized to zero at the beginning of the program. 
If we made these variables local to main, we would have to do this initialization 
explicitly; however, C globals are automatically zeroed. (Or rather,``statically 
zeroed. (Get it?) 
>+=
long tot_word_count, tot_line_count, 
tot_char_count;
/* total number of words, lines, chars */
@
記錄思想碰撞的火花，創建出類拔萃的文檔
文學編程的文檔作為寫程序的一部分而產生。替代註釋作為源代碼的附註提供，文學編程包含每一層概念的解釋，將較低級別的概念推遲到適當的位置，允許了更好的想法交流。 上面文字 wc 的片段顯示了程序及其源代碼的解釋是如何交織在一起的。 這種思想的闡述創造了像文學作品一樣的思想流動。Knuth 著名地寫了一本“小說”，解釋了計算機策略遊戲巨洞冒險的代碼，完全可讀。

**文學編程工具**
第一個發佈的文學編程環境是WEB，由高德納於1981年為他的TeX排版系統而引入。它使用Pascal作為其基礎編程語言，使用TeX作為文檔排版工具。完整的帶註釋的 TeX 源代碼在高德納的5卷Computers and Typesetting中的TeX: The program裡被髮表。早在1979年，高德納私下使用過一個名叫DOC的文學編程系統。他受到Pierre-Arnoul de Marneffe思想的啟發。. 免費的 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

**參考文獻**

**延伸閱讀**
cite book | first=Donald E. |last=Knuth |author-link=Donald Knuth |title=Literate Programming |publisher=Stanford University Center for the Study of Language and Information |location= Stanford, California |year=1992 |isbn=978-0937073803
*isbn=0-07-911616-7 (includes software).
*cite web |first=Kurt |last=Nørmark |url=http://www.cs.aau.dk/~normark/litpro/issues-and-problems.html |title=Literate Programming - Issues and Problems |publisher=University of Aalborg |date=August 13, 1998 |access-date=2010-01-03 |archive-date=2011-08-13 |archive-url=https://web.archive.org/web/20110813140512/http://www.cs.aau.dk/~normark/litpro/issues-and-problems.html |dead-url=no 

**外部鏈接**
 literateprogamming.com date=20210126201751 - comp.programming.literate FAQ date=20210223015419  at Internet FAQ Archives- Literate Programming newsgroup- LiteratePrograms date=20080705193927  a literate programming wiki.- Select date=20060104044644  A literate programming example using noweb- Softpanorama page date=20210223015446  on literate programming- Haskell date=20150105151148  literate programming- Specification of literate programming in the Haskell Report date=20200915134534  the accepted Haskell standard- Noweb — A Simple, Extensible Tool for Literate Programming date=20210228082349 - Lp4all — A Simple Literate Programming Tool with a wiki-like markup syntax date=20210223015455