計算機程式設計/結構化程式設計
結構化程式設計是針對非結構化程式設計的建議解藥,非結構化程式設計在結構化程式設計發明之前存在了幾十年。
非結構化程式是一種過程式程式 - 語句按編寫順序執行。但這種型別的程式設計使用 goto 語句。goto 語句允許將控制權傳遞到程式中的任何其他位置。當執行 goto 語句時,序列從 goto 的目標繼續。因此,要了解程式的工作原理,您必須假裝執行它。這意味著通常很難理解這種程式的邏輯。一些程式編譯器交叉索引 goto 連線到的位置,使其能夠快速瀏覽原始碼。然而,在某些程式語言中,將變數與 goto 的目標相關聯是一種常見的做法,這使得自動化索引變得不切實際。在某些結構化程式語言中存在類似的問題,例如如何實現外語檢視,以允許許多人以其人類語言檢視相同的資料。.
這與使用某種形式的抽象來理解程式工作原理的想法形成對比 - 就像結構化程式設計中那樣。
為此,Dijkstra 建議禁止 goto 語句。
從一個角度來看,結構化程式設計是指避免使用可能危險的 goto 語句的程式設計。這可以防止潛在的混亂控制轉移。許多結構化程式語言支援 goto 語句,該語句可以以結構化的方式使用。例如,退出到例程的末尾,或返回到迴圈的開頭。
從另一個角度來看,結構化程式設計僅限於使用只有單個入口點和單個出口點的控制結構。這些結構中最重要的結構是順序、選擇(if 和 if..else)和重複(while)。
另一個觀點是,結構化程式是以這樣一種方式編寫的程式,可以透過抽象輕鬆地理解它們。抽象意味著能夠理解某些程式碼的整體目的,而無需理解細節。抽象的主要機制是過程(方法)。但上面提到的單入口單出口結構也有助於使用抽象。
結構化程式設計得益於高階語言和相關程式包,這些程式包可以透過軟體圖表技術進行流程圖繪製,這些技術可以被非程式設計師理解。
一些計算機科學家負責發現結構化程式設計的概念,並將這一概念傳達給其他程式設計師的世界。結構化程式設計首次體現在 ALGOL(演算法語言)語言中(該語言成為第一個用於 Burroughs B5000 MCP(OS)系統程式設計的高階語言),(由 Bob Barton 設計,後來成為猶他大學的教授,他在那裡影響了學生 Alan Kay,他發明了 GUI 視窗,並且是 Smalltalk 的開發人員之一)。反過來,ALGOL 成為 Simula 的基礎,Simula 是第一個面向物件的語言。
ALGOL 基於一種名為 BNF(巴克斯-諾爾正規化)的語言設計形式主義,以其創始人 John Backus 和 Peter Naur 的名字命名。
該技術的重要著作是“結構化程式設計”(學術出版社 1972 年),該書包含三個部分:“關於結構化程式設計的筆記”由 Edsger W. Dijkstra 撰寫,“關於資料結構的筆記”由 C.A.R. Hoare 撰寫,“層次程式結構”由 Ole-Johan Dahl 和 C.A.R Hoare 撰寫。最後一節介紹了 Simula 及其面向物件和併發功能。
Edsger Djikstra 還撰寫了《程式設計紀律》(Prentice Hall,1976 年)一書。
結構化程式設計領域的另一位傑出人物是 Donald Knuth,他撰寫了多卷本的《計算機程式設計藝術》一書。
後來,Ed Yourdon 和 Larry Constantine 撰寫了一本名為“結構化設計”的書,許多人認為是結構化程式設計,但它並非如此。這是一種圖形技術,在實踐中極其繁瑣,儘管它基本已被拋棄,但在其他非正式方法(如 UML)中也有繼任者。結構化設計和結構化程式設計中概述的技術非常不同,不應混淆,因為它們共享“結構化”一詞。
進一步閱讀
- goto 不邪惡嗎? - 比較 goto 和 return。