歡迎來(lái)到 常識(shí)詞典網(wǎng) , 一個(gè)專業(yè)的常識(shí)知識(shí)學(xué)習(xí)網(wǎng)站!
[ Ctrl + D 鍵 ]收藏本站
文學(xué)編程是高德納引入的用以替代20世紀(jì)70年代提出的結(jié)構(gòu)化編程范型的編程方法。
文學(xué)編程范型,正如高德納所構(gòu)想,不同于傳統(tǒng)的由計(jì)算機(jī)強(qiáng)加的編寫程序的方式和順序,而代之以使程序員用他們自己的思維具有的邏輯和流程所要求的順序來(lái)開發(fā)程序。文學(xué)編程不受約束地表達(dá)邏輯,而且用人類日常使用的語(yǔ)言寫出來(lái),就好像一篇文章一樣,文章包括用以隱藏抽象的宏和傳統(tǒng)的源代碼。文學(xué)編程工具用來(lái)從文學(xué)源文件中得到兩種表達(dá):一種用于計(jì)算機(jī)進(jìn)一步編譯和執(zhí)行,稱作“糾纏”的代碼;一種用于格式化的文檔,稱作從文學(xué)源代碼中“編織”出來(lái)。。雖然第一代文學(xué)編程工具是特定于計(jì)算機(jī)語(yǔ)言的,但后來(lái)出現(xiàn)的工具可以不依賴具體語(yǔ)言并且存在于比編程語(yǔ)言更高的層次中。
一個(gè)文學(xué)程序是用自然語(yǔ)言比如英語(yǔ)寫的程序邏輯的解釋,程序中交織點(diǎn)綴著宏和傳統(tǒng)源代碼小片斷的。宏在文學(xué)源文件中是簡(jiǎn)單的,或與標(biāo)題類似,或是人類語(yǔ)言中解決編程問題時(shí)用以描述抽象的解釋性短語(yǔ),它隱藏了大段代碼或是較低層次的宏。這些宏與通常在計(jì)算機(jī)科學(xué)教學(xué)時(shí)用偽碼寫的算法相似。這些任意解釋的短語(yǔ)成為新的精確的操作符,操作符在運(yùn)行過程中由程序員創(chuàng)建,組成了在基本編程語(yǔ)言之上的“元語(yǔ)言”。 預(yù)處理器用于替換任意層級(jí),說得更準(zhǔn)確些是“在'網(wǎng)'和宏之間建立聯(lián)系”,用命令("tangle")來(lái)產(chǎn)生可編譯的源代碼,用另一個(gè)命令("weave")來(lái)產(chǎn)生文檔。預(yù)處理器還提供了寫出宏的內(nèi)容的能力和在文學(xué)程序源文件中的任何地方增加已創(chuàng)建的宏的能力,由此不必受傳統(tǒng)編程語(yǔ)言強(qiáng)加的那些限制或是打斷自己的思路。
優(yōu)點(diǎn)根據(jù)高德納本人所說,文學(xué)編程為高質(zhì)量程序而生,因?yàn)樗鼜?qiáng)迫程序員顯式地描述程序背后的思路,讓不充分的設(shè)計(jì)決策無(wú)所遁形。高德納還聲稱文學(xué)編程提供了第一流的文檔系統(tǒng),它不是插件,而是在編程中隨著思路的慢慢展現(xiàn)而不斷自然發(fā)展的過程。產(chǎn)生出來(lái)的文檔使作者能在以后的任何時(shí)間重新找到自己的思路,也能使其他程序員更容易理解程序的建構(gòu)過程。這與傳統(tǒng)文檔不同,那里程序員必須和編譯器規(guī)定的代碼順序?qū)懺谝黄?,還必須從代碼和注釋中重現(xiàn)當(dāng)時(shí)的思路。文學(xué)編程的元語(yǔ)言能力也據(jù)稱普遍利于思考,能從更高的層次統(tǒng)觀代碼,也能增加人的智能可成功保持和處理的概念數(shù)量。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.
誤解文學(xué)編程常常被誤解為不過是從有源代碼和注釋的文件中產(chǎn)生格式化文檔,或是在代碼里寫大量的注釋。這一誤解導(dǎo)致那些文檔析出工具,如Perl的Plain Old Documentation系統(tǒng)也被稱為“文學(xué)編程工具”。盡管如此,因?yàn)檫@些工具沒有實(shí)現(xiàn)隱藏在自然語(yǔ)言宏系統(tǒng)背后的“抽象概念網(wǎng)”,或是提供把機(jī)器規(guī)定的源代碼順序變?yōu)槿祟愃季S更容易理解的順序的能力,它們不能在高德納提出的意義下被稱作文學(xué)編程工具。
例子一個(gè)文學(xué)編程的經(jīng)典例子是標(biāo)準(zhǔn)Unix單詞計(jì)數(shù)程序wc
的文學(xué)實(shí)現(xiàn)。高德納在他的《文學(xué)編程》書中的第12章展示了這個(gè)例子的CWEB版本。后來(lái)它也為noweb文學(xué)編程工具而重寫。這一例子漂亮地闡釋了文學(xué)編程的基本元素。
下面這個(gè)wc
的文學(xué)編程代碼片斷展示了在文學(xué)編程中用來(lái)創(chuàng)建宏的自然語(yǔ)言的描述性詞組有多隨意,宏作為文學(xué)編程語(yǔ)言中新的“操作符”,并且隱藏了代碼塊或其它的宏。由兩個(gè)尖括號(hào)組成("<<...>>
")的標(biāo)記符號(hào)表示宏,"@
"符號(hào)在noweb文件中表示一節(jié)代碼的結(jié)束。"<<*>>
"符號(hào)表示“根”,即最上層節(jié)點(diǎn),文學(xué)編程工具要從這里展開宏組成的網(wǎng)。實(shí)際上,擴(kuò)展的源代碼可通過任何節(jié)和小節(jié)(即標(biāo)為"<<代碼塊名>>=
"的代碼)寫出來(lái),所以一個(gè)文學(xué)程序文件可包括多個(gè)機(jī)器源代碼文件。
wc的目的是對(duì)多個(gè)文件中的行、單詞和字母計(jì)數(shù)。文件中的行數(shù)是......../更多解釋/ 這里是由noweb程序wc.nw定義的文件wc.c的概述: <<*>>= <<包含頭文件>> <<定義>> <<全局變量>> <<函數(shù)>> <<主程序>> @ 我們必須包含標(biāo)準(zhǔn)輸入輸出定義,因?yàn)槲覀兿氚l(fā)送格式化的輸出到stdout和stderr上。 <<包含頭文件>>= #include <stdio.h> @
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.
宏和標(biāo)準(zhǔn)文檔中的“節(jié)名”不同。文學(xué)編程的宏能隱藏任何代碼塊,并且被用于任何低層次的機(jī)器語(yǔ)言操作符內(nèi),常常在如"if
", "while
"或 "case
"這樣的邏輯操作符內(nèi)。這會(huì)在下面這段文學(xué)程序wc
的代碼片斷中解釋。
這里的代碼塊做了計(jì)數(shù)的工作,這正是wc存在的目的,實(shí)際上非常容易寫。我們察看每一個(gè)字母并且如果它是一個(gè)單詞的開始或結(jié)束,則會(huì)更改狀態(tài)。 <<掃描文件>>= while (1) { <<Fill buffer if it is empty; break at end of file>> c = *ptr++; if (c > ' ' && c < 0177) { /* visible ASCII codes */ if (!in_word) { word_count++; in_word = 1; } continue; } if (c == '') line_count++; else if (c != ' ' && c != '\t') continue; in_word = 0; /* c is newline, space, or tab */ } @
實(shí)際上,宏能代表任意的代碼塊和其它宏,并且因此比自頂向下或自底向上的代碼塊或小節(jié)更通用。高德納說當(dāng)他意識(shí)到這一點(diǎn)后,他開始把程序想成不同部分組成的“網(wǎng)”。
在noweb文學(xué)程序中,除了可以任意順序展現(xiàn)代碼外,宏背后的代碼塊,一旦由"<<...>>=
"引入,可以在文件后面的任何一個(gè)地方通過簡(jiǎn)單地寫"<<代碼塊名>>=
"進(jìn)行擴(kuò)充并且往里添加更多的內(nèi)容,如下面這個(gè)代碼片斷所示("+"為了可讀性而被文檔格式化器所添加,它并不在代碼中)。
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?) <<Global variables>>+= long tot_word_count, tot_line_count, tot_char_count; /* total number of words, lines, chars */ @
文學(xué)編程的文檔作為寫程序的一部分而產(chǎn)生。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.
第一個(gè)發(fā)布的文學(xué)編程環(huán)境是WEB,由高德納于1981年為他的TeX排版系統(tǒng)而引入。它使用Pascal作為其基礎(chǔ)編程語(yǔ)言,使用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 for C and C++, runs on most operating systems and can produce TeX and PDF documentation.
其它的文學(xué)編程概念的實(shí)現(xiàn)有noweb和FunnelWeb,它們都是源代碼獨(dú)立的。Noweb以其簡(jiǎn)單而知名: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編程語(yǔ)言對(duì)半文學(xué)編程有原生支持,其來(lái)源于CWEB但用了較簡(jiǎn)單的實(shí)現(xiàn)。如果想要TeX輸出,你可以寫 a plain LaTeX file 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.
下一篇:apache服務(wù)器安裝前準(zhǔn)備 下一篇 【方向鍵 ( → )下一篇】
上一篇:為什么要全文輸出RSS 上一篇 【方向鍵 ( ← )上一篇】
快搜