回覆列表
-
1 # 周林ZhouLin
-
2 # 小和平鴿66
簡單來講就是閒的。
我這兩年轉開發崗了以後還沒有遇到過很明顯的語言方面的問題。大量的時間和精力都是花在解決業務上的問題上面的。
所以有這樣的閒工夫,還是努力把業務上的問題搞得更好一些吧。
簡單來講就是閒的。
我這兩年轉開發崗了以後還沒有遇到過很明顯的語言方面的問題。大量的時間和精力都是花在解決業務上的問題上面的。
所以有這樣的閒工夫,還是努力把業務上的問題搞得更好一些吧。
高德納何許人也?
高德納(英語:Donald Ervin Knuth,音譯:唐納德·爾文·克努斯,1938年1月10日-),出生於美國密爾沃基,著名計算機科學家,斯坦福大學計算機系榮譽退休教授。高德納教授是現代計算機科學的先驅人物,創造了演演算法分析的領域,在多個理論計算機科學的分支做出基石一般的貢獻。在計算機科學及數學領域發表了多部具廣泛影響的論文和著作。1974年圖靈獎得主。
高德納所寫的《計算機程式設計藝術》(The Art of Computer Programming)是計算機科學界最受高度敬重的參考書籍之一。他也是排版軟體TEX和字型設計系統Metafont的發明人。
高德納也是一個有趣的人,他會獎勵每一個找出他的著作中任何錯誤的人,他們每指出TEX的一個錯誤,就能得到2.56美元,因為“256美分剛好是十六進位制的一美元”(256 pennies is one hexadecimal dollar);另外,對於每個“有價值的建議”,他設立了0.32美元的獎金。高德納可以算是一名標準的駭客,他最喜歡的軟體是Emacs,並曾向其作者理查·史託曼提交修補補丁。
文學程式設計的目的、概念與工具正如高德納所構想的那樣,文學程式設計的目的是:將程式設計師從面向機器的枯燥思維中解放出來你,用人類日常使用的語言來自由地表達邏輯。
為了實現這一目標,高德納定義了三個概念和兩個工具:
概念1:巨集。它用來隱藏具體的實現,存在形態通常是一段自然語言的話。你可以把它直觀地看作是對一段原始碼的高度抽象和描述。
巨集由兩個尖括號組成("<<...>>")的標記符號表示,"@"符號在noweb檔案中表示一節程式碼的結束。"<<*>>"符號表示“根”,即最上層節點,文學程式設計工具要從這裡展開巨集組成的網。
例子如下:
這裡是由noweb程式wc.nw定義的檔案wc.c的概述:
<<*>>=
<<包含標頭檔案>>
<<定義>>
<<全域性變數>>
<<函式>>
<<主程式>> @
概念2:繞出。眾所周知,計算機最終能識別和執行的是二進位制檔案,所以上述用自然語言描述的文學原始檔,必須透過工具轉換成可編譯、執行的形態,這個過程稱為“繞出”(tangled)。
概念3:織出。相信80%以上的程式設計師都比較討厭寫文件。將文學原始檔的資訊抽取出來,形成可讀性高的文件的過程,稱為“織出”(woven)。
工具1:WEB。它是第一種實現“文學程式設計”的語言。如前面所講到的,它的目標是透過在描寫性的文字中嵌入原始碼,讓開發者如同建立文學作品一樣編寫軟體;而非像其他大多數程式語言中一樣。相反,所採用的結構更注重人閱讀要求,而非編譯器的要求。
WEB包含了2個主要程式:TANGLE,從源文字生成可編譯的Pascal程式碼,以及WEAVE,使用TEX生成格式漂亮,可列印的文件。
CWEB是WEB的C語言新版本。
工具2:noweb。是另外一種借鑑了WEB的文學程式設計工具,但是它的優勢在於與語言無關。
這裡的程式碼塊做了計數的工作,這正是wc存在的目的,實際上非常容易寫。我們檢視每一個字母並且如果它是一個單詞的開始或結束,則會更改狀態。
文學程式設計的體驗文學程式設計使得用自然語言進行程式設計變得可行,而且把傳統的“樹形程式設計思維”轉換成了“網狀程式設計思維”。後者更符合人類大腦的工作方式——想想人腦的神經元是如何連線的。
來看看高德納的原話:
"我感覺自頂向下和自底向上是兩種截然相反的方法論:一個更適合分析程式,一個更適合建立程式。但是,使用WEB程式設計後,我意識到不必在自頂向下和自底向上之間艱難抉擇,因為我們最好把程式的結構看作網狀而不是樹狀的。層級結構是存在的,但對於程式來說,最重要的是其結構的關係。一個複雜的軟體由多個簡單部分和它們之間的簡單關係構成。程式設計師的任務是用人類最易理解的順序,而不是用像自頂向下或自頂向上之類刻板僵硬的順序,來描述清楚這些部分和關係。"
最後的一點補充巨集和標準文件中的“節名”不同。文學程式設計的巨集能隱藏任何程式碼塊,並且被用於任何低層次的機器語言運算子內,常常在如"if", "while"或 "case"這樣的邏輯運算子內。
<<掃描檔案>>=
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 == "\n")
line_count++;
else if (c != " " && c != "\t")
continue;
in_word = 0; /* c is newline, space, or tab */
}
@