算法=邏輯+控制(左耳朵耗子:編程的本質是什么?)


大家應該都聽說過等式‘算法+數據結構=程序’吧?這是Pascal設計者Niklaus Wirth的一本著作的書名,它刻畫了過程式尤其是結構化編程的思想。后來Robert Kowalski進一步提出:算法=邏輯+控制。其中邏輯是算法的核心,控制主要用於改進算法的效率。在邏輯式編程中,程序員只需表達邏輯,而控制交給編程語言的解釋器或編譯器去管理。

 

1976 年,瑞士計算機科學家,Algol W,Modula,Oberon 和 Pascal 語言的設計師 Niklaus Emil Wirth 寫了一本非常經典的書《Algorithms + Data Structures = Programs》(鏈接為 1985 年版) ,即算法 + 數據結構 = 程序。

這本書主要寫了算法和數據結構的關系,這本書對計算機科學的影響非常深遠,尤其在計算機科學的教育中。

1979 年,英國邏輯學家和計算機科學家 Robert Kowalski 發表論文 Algorithm = Logic + Control,並且主要開發“邏輯編程”相關的工作。

Robert Kowalski 是一位邏輯學家和計算機科學家,從 20 世紀 70 年代末到整個 80 年代致力於數據庫的研究,並在用計算機證明數學定理等當年的重要應用上頗有建樹,尤其是在邏輯、控制和算法等方面提出了革命性的理論,極大地影響了數據庫、編程語言,直至今日的人工智能。

Robert Kowalski 在這篇論文里提到:

An algorithm can be regarded as consisting of a logic component, which specifies the knowledge to be used in solving problems, and a control component, which determines the problem-solving strategies by means of which that knowledge is used. The logic component determines the meaning of the algorithm whereas the control component only affects its efficiency. The efficiency of an algorithm can often be improved by improving the control component without changing the logic of the algorithm. We argue that computer programs would be more often correct and more easily improved and modified if their logic and control aspects were identified and separated in the program text.

 

翻譯過來的意思大概就是:

任何算法都會有兩個部分, 一個是 Logic 部分,這是用來解決實際問題的。另一個是 Control 部分,這是用來決定用什么策略來解決問題。Logic 部分是真正意義上的解決問題的算法,而 Control 部分只是影響解決這個問題的效率。程序運行的效率問題和程序的邏輯其實是沒有關系的。我們認為,如果將 Logic 和 Control 部分有效地分開,那么代碼就會變得更容易改進和維護。

 

編程的本質

兩位老先生的兩個表達式:

  • Programs = Algorithms + Data Structures
  • Algorithm = Logic + Control

第一個表達式傾向於數據結構和算法,它是想把這兩個拆分,早期都在走這條路。他們認為,如果數據結構設計得好,算法也會變得簡單,而且一個好的通用的算法應該可以用在不同的數據結構上。

第二個表達式則想表達,數據結構不復雜,復雜的是算法,也就是我們的業務邏輯是復雜的。我們的算法由兩個邏輯組成,一個是真正的業務邏輯,另外一種是控制邏輯。程序中有兩種代碼,一種是真正的業務邏輯代碼,另一種代碼是控制我們程序的代碼,叫控制代碼,這根本不是業務邏輯,業務邏輯不關心這個事情。

 

總之,通過這兩個表達式,我們可以得出:

Program = Logic + Control + Data Structure

 

如果你再仔細地結合我們之前講的各式各樣的編程范式來思考上述這些概念的話,你是否會覺得,所有的語言或編程范式都在解決上面的這些問題。也就下面的這幾個事。

  • Control 是可以標准化的。比如:遍歷數據、查找數據、多線程、並發、異步等,都是可以標准化的。

上述三點,就是編程范式的本質。

  • 有效地分離 Logic、Control 和 Data 是寫出好程序的關鍵所在!

 

https://mp.weixin.qq.com/s/3WKImtdg_rEd_R9eCjs6WA

 

計算機程序的本質

從本質上來說, 程序就是一系列有序執行的指令集合。 如何將指令集合組織成可靠可用可信賴的軟件(美妙的邏輯之塔), 這是個問題。

程序邏輯控制。從編程角度來說, 開發者應對的就是邏輯, 邏輯的表達、組織和維護。 邏輯是事物自此及彼的合乎事物發展規律的序列。指令是邏輯的具體實現形式。

   邏輯成立的先決條件是合乎事物發展規律。 程序只能處理數值, 卻傳入了字符串, 就只能報錯而無法繼續; 當處理海量數據時, 若內存不足, 就會導致程序崩潰; 若程序存在內存泄露, 隨着時間的推移而耗盡內存, 也會導致程序崩潰。 多個線程同時修改一個共享變量, 若不加控制, 就會因為不同線程執行修改變量的時序的不確定導致該變量最終值的不確定。 這些就是程序執行的發展規律。 要編寫程序, 必定要先通悉這些規律。

規律的表現形式是:如果條件 (C1, C2, ..., Cn) 是產生結果 (R1, R2, ... , Rn) 的充分必要條件, 那么當 C1, C2, ..., Cn 任一不滿足條件時, 都不可能產生結果 (R1, R2, ..., Rn) ; 反之, 若結果 (R1, R2, ..., Rn) 沒有出現, 則必定是 C1, C2, ..., Cn 某一條件不滿足導致。 錯誤和異常即是 C1, C2, ..., Cn 任一不滿足條件的表現。規律的性質是必然的, 不存在可能之說; 只存在人們探索的是否足夠精確。編程開發首先應當懂得程序執行的規律, 然后才是實際的開發; 否則就會被程序的結果折騰得死去活來。

在通悉程序執行規律之后, 程序需要解決如下問題:

  • 要表達什么邏輯
  • 如何表達該邏輯;
  • 如何維護該邏輯。

暫時先回到軟件的起點, 回顧一下這一切是如何發生的。

—— SDK IDE BUG “” 此外, 軟件還經歷了“單機程序 => 多機程序 => 分布式程序” 的過程 , 多機聯網程序因為多個子系統的交互變得更加復雜。 這里不再贅述。

但請注意, 無論軟件發展到多么復雜的程度, 總有一群人, 在試圖從程序的本質中探究軟件開發的基本問題, 他們試圖論證和確保程序的正確性、提煉軟件的基本屬性並進行衡量; 程序的正確性本質是邏輯學來保證的。 沒有邏輯學, 程序根本就無法立足, 更不可能有今天的大規模應用。

軟件開發工具讓我們更有效率地創造邏輯、 遠離語法錯誤的困擾;

公共庫將常用的通用邏輯塊封裝成可反復使用的組件, 避免不必要的重復勞動;

設計模式體現的是如何可擴展地解決常見的邏輯交互問題;

應用框架解決的是應用的通用邏輯流的控制的問題,讓開發者更多地聚焦具體業務邏輯上;

開發技術是在具體的應用情境下按照既定總體思路去探究具體問題解決的方法。

表達和維護大型邏輯

表達和維護大型邏輯的終極訣竅就是: 將大型邏輯切分為容易消化的一小塊一小塊, “不急不忙地吃掉”。

在該方法的實踐中, 可以充分利用現有的開發工具、公共庫、設計模式、應用框架、開發技術。

 

 

 

軟件開發:如何表達和維護大型邏輯

https://www.cnblogs.com/lovesqcc/p/4334095.html?ptvd

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM