跳轉至內容

計算機程式設計/結構化程式設計

來自華夏公益教科書


結構化程式設計 被認為是非結構化程式設計的解藥,後者在結構化程式設計發明之前已經存在了幾十年。

最初,存在非結構化程式設計

[編輯 | 編輯原始碼]

非結構化程式是過程式程式——語句按編寫順序執行。但這種型別的程式設計使用 goto 語句。goto 語句允許將控制權傳遞到程式中的任何其他位置。當執行 goto 語句時,序列將從 goto 的目標繼續。因此,要理解程式的工作原理,必須假裝執行它。這意味著通常很難理解這種程式的邏輯。一些程式編譯器會交叉索引 goto 連線到的位置,使快速瀏覽原始碼成為可能。但是,在一些程式語言中,常見做法是將變數與 goto 的目標關聯起來,這使得自動索引變得不切實際。在一些結構化程式語言中也存在類似的問題,例如外語檢視的實現方式,允許許多人以他們的母語檢視相同的資料。

這與使用某種形式的抽象來理解程式的工作原理形成對比,就像在結構化程式設計中一樣。

出於這個原因,Dijkstra 建議禁止使用 goto 語句。

結構化程式設計

[編輯 | 編輯原始碼]

從一種角度來看,結構化程式設計是避免使用可能危險的 goto 語句的程式設計。這可以防止潛在的混亂的控制轉移。許多結構化程式語言支援 goto 語句,它可以以結構化的方式使用。例如,退出到例程的末尾,或返回到迴圈的開頭。

從另一個角度來看,結構化程式設計僅限於使用僅具有一個入口點和一個出口點的控制結構。這些結構中最重要的結構是順序、選擇(if 和 if..else)和重複(while)。

另一種觀點是,結構化程式是以便於使用抽象理解的方式編寫的程式。抽象意味著能夠理解某些程式碼的總體目的,而無需理解細節。抽象的主要機制是過程(方法)。但上面提到的單入口單出口結構也有助於使用抽象。

結構化程式設計的實現得益於高階語言和相關程式包,這些程式包可以利用軟體圖表技術進行流程圖繪製,非程式設計師也能理解。

發明者

[編輯 | 編輯原始碼]

一些計算機科學家負責發現結構化程式設計的概念,並將這一概念傳達給其他程式設計師的世界。結構化程式設計最初體現在 ALGOL(演算法語言)語言中(它成為第一個用於 Burroughs B5000 MCP(作業系統)系統程式設計的高階語言),(由 Bob Barton 設計,後來成為猶他大學教授,他在那裡影響了學生 Alan Kay,Alan Kay 發明了 GUI 視窗,並是 Smalltalk 的開發人員之一)。反過來,ALGOL 成為 Simula 的基礎,Simula 是第一種面向物件的語言。

ALGOL 基於一種語言設計形式主義,稱為 BNF(Backus-Naur 形式),以其創始人 John Backus 和 Peter Naur 的名字命名。

該技術具有里程碑意義的書籍是“結構化程式設計”(學術出版社 1972 年),該書包含三個部分:“關於結構化程式設計的筆記”由 Edsger W. Dijkstra 撰寫,“關於資料結構的筆記”由 C.A.R. Hoare 撰寫,“層次程式結構”由 Ole-Johan Dahl 和 C.A.R Hoare 撰寫。最後一部分介紹了 Simula 及其面向物件和併發功能。

Edsgar Djikstra 還撰寫了“程式設計紀律”(Prentice Hall,1976 年)一書。

結構化程式設計領域的另一位傑出人物是 Donald Knuth,他撰寫了多卷本的“計算機程式設計藝術”。

後來,Ed Yourdon 和 Larry Constantine 撰寫了一本名為“結構化設計”的書籍,許多人認為它是結構化程式設計,但它不是。這是一種圖形技術,在實踐中非常繁瑣,儘管它在很大程度上被拋棄,但在其他非正式方法中仍然有繼任者,例如 UML。結構化設計和結構化程式設計中概述的技術非常不同,不應該混淆,因為它們都使用“結構化”一詞。

進一步閱讀

華夏公益教科書