四,編程範式

{"type":"doc","content":[{"type":"heading","attrs":{"align":null,"level":3}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在開篇之前,先對計算機語言的幾個關鍵節點進行一下羅列。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"機器語言階段(第一代)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"機器的每一個動作都需要人們用二進制字符串,即“0”和“1”組成的字符書寫出來,並用紙帶等光電設備或通過控制檯上的扳鍵輸入機器,才能得以存儲和執行。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"彙編語言(第二代)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"針對難以記憶的,無意義的,二進制的字符串,人們試圖用英語中具有一定意義的單詞來代替它,這就是所謂的“助記憶碼”,或彙編碼。用匯編碼編寫的程序稱爲彙編程序。而把這些彙編指令轉換爲機器指令的程序則稱爲彙編系統。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"高級語言(第三代)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"與彙編語言不同,第三代語言突破了與機器指令一一對應的限制,用盡可能接近自然語言的的表達方式描述人們的設想和處理過程,而把這種表達方式向機器指令的轉化工作,交給專門的“工具” 一一編譯系統去完成。另外一個進步高級語言實現的對機器的獨立性,即它不依賴特點的硬件系統,抽象地描述處理和算法,把不同硬件系統之間的區別交給不同的編譯器系統處理,從而大大提高了程序的可移植性。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"非過程化語言(第四代)","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"在第三代語言的應用中,人們發現了新的瓶頸(處理過程的描述)。第三代程序設計語言一般都是過程化語言,即需要編寫程序的人一步步的安排好機器的執行次序,雖然不是一對一的指揮機器指令,但是還必須在人的頭腦中安排好實際的執行過程。人們希望機器能夠自動的完成更多的工作,包括自動安排某些工作的執行順序,而做到只要給機器下達命令,由機器自己去安排執行順序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"隨着計算機語言的數次變革,也就是編程語言的變革。除此之外,計算機領域還經歷另外一個更巨大,更重要的變革,那就是“編程範式”的變遷。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"結構化編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"結構化編程是對程序控制權的直接轉移,進行了限制和規範。使用順序結構,分支結構,循環結構三種結構可以構造出任何程序。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}},{"type":"strong","attrs":{}}],"text":"可推導性","attrs":{}},{"type":"text","text":":Dijkstra 認爲“理論物理學家”(cheng xu yuan)可以向數學家一樣對自己的程序進行推理證明。即程序員可以用代碼將一些已經證明可用的結構串聯起,只要自行證明這些額外的代碼是正確的,就可以推導出整個程序的正確性。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}},{"type":"strong","attrs":{}}],"text":"功能性降解拆分","attrs":{}},{"type":"text","text":":既然結構化編程範式可用將模塊遞歸降解拆分爲可推導的單元,那就意味着模塊可用按功能進行降解拆分。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"用於理解科學理論和科學定律的方式理解結構化編程,也就是說它可用被證僞,但無法被證明。一段程序可以有一個測試來證明其錯誤性,但是不能被證明是正確的。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"面向對象編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"面向對象編程是對程序控制權的間接轉移,進行了限制和規範。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"究竟什麼是面向對象?是數據與函數的組合,還是面向對象編程是一種對真實世界進行建模的方式。那個到底如何進行建模?那麼可以單純將面向對象編程理解爲 “封裝”,”繼承“,”多態“的有機組合嗎?","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}},{"type":"strong","attrs":{}}],"text":"封裝:","attrs":{}},{"type":"text","text":"採用面向對象的編程語言的封裝特性的實現可以講一組相關聯的數據和函數圈起來,使圈外面的代碼只能看見部分函數,數據則完全不可見。C語言中的頭文件和實現文件分離編程的方式封裝性要高於java或c#這種面向對象編程語言。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}},{"type":"strong","attrs":{}}],"text":"繼承:","attrs":{}},{"type":"text","text":"繼承的主要作用是讓我們在某個作用域內對外部定義的某一組變量與函數進行覆蓋。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","marks":[{"type":"italic","attrs":{}},{"type":"strong","attrs":{}}],"text":"多態:","attrs":{}},{"type":"text","text":"多態其實不過是函數指針的一種應用,但是面向對象編程語言中確實讓這種多態變的更安全和更方便使用了。如果如果c語言中的用函數指針顯示實現多態,那麼函數指針(依賴於一系列需要人爲遵守的約定)帶來的危險性無法預估。使程序產生無法跟蹤和難以消除的Bug。多態的強大性是因爲插件式架構在面嚮對象語言中可以在任何地方被安全的使用。","attrs":{}},{"type":"text","marks":[{"type":"strong","attrs":{}}],"text":"多態的高級特性-依賴反轉","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"圖中實線代表源代碼依賴關係,虛線代表控制流。","attrs":{}}]},{"type":"image","attrs":{"src":"https://static001.geekbang.org/infoq/5b/5b4b5da979699054f7e57566f399c9d6.png","alt":null,"title":"","style":[{"key":"width","value":"50%"},{"key":"bordertype","value":"none"}],"href":"","fromPaste":false,"pastePass":false}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"A圖中系統行爲決定了控制流,而控制流決定了源碼依賴關係。如果我們利用多態將method 1進行擴展,這裏的調用通過源碼接口來實現的。當然程序在運行時,接口的概念是不存在的。B圖中的源碼依賴關係的方向與控制流正好相反。使用這一編程方式所有源代碼依賴再也不會受到系統控制流的限制。","attrs":{}}]},{"type":"heading","attrs":{"align":null,"level":3},"content":[{"type":"text","text":"函數式編程","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"函數式編程是對程序中的賦值進行了限制和規範。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"可變性的隔離(沒有變量,就沒有傷害)。一切併發應用遇到的問題,一切由於使用了多線程,多處理器而引起的問題,如果沒有變量的都不可能發生。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null},"content":[{"type":"text","text":"三個編程範式都是1958年到1968年這10年間被提出來的,後續再也沒有新的編程範式出現過。","attrs":{}}]},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}},{"type":"paragraph","attrs":{"indent":0,"number":0,"align":null,"origin":null}}]}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章