从机器码到面向对象
1.從機器碼到面向對象
本章節主要探討是什么驅動著編程從機器碼發展到了匯編語言,又從匯編語言發展到了面向過程編程,最后從面向過程編程發展到面向對象編程。通過這些探討最終明確多年來的軟件工程發展我們都解決了哪些棘手的問題。
1.1機器碼
在真正的電子計算機誕生初期,沒有有效的編程語言。在這個時期的計算機提供了最基礎的由0和1組成的機器指令來供初代的程序員進行編碼。
用機器碼寫的程序如示例-1-1所示。
示例-1-1 8086機器上完成“s=768+12288-1280”的數字運算,對應的機器碼
有了示例-1-1所示的機器碼指令后,會將指令編排到打孔紙帶上,輸入到計算機中。如示例-1-2所示。計算機持續讀取指點上的指令來完成任務。
示例1-2 打孔紙帶示意圖(可以假設有孔為1,無孔為0)
可以想象在通過這種方式進行編程場景大致會是這樣——手里拿著指令手冊來查詢指令所對應的機器碼,然后對紙帶按照指定進行打孔。在計算機應用的早期,計算機所處理的任務多為簡單的數學問題,也就是說當時的程序員所面臨的問題復雜度在當時看來并不復雜。所以程序員可以快樂地遇到一個問題就打孔一個紙帶然后輸入到計算機進行求解。
但是好景不長,隨著計算機的發展,計算機所能處理能力越來越復雜,指令集也成百上千地增加,同時程序也越來越長。這時程序員第一次感覺到這些又臭又長,一眼看不到頭的機器碼維護起來是那么令人抓狂。這時的程序員所渴望的就是一種有自然語義的助記符來幫助自己進行編程,匯編語言應運而生。
1.2匯編語言
匯編語言被稱為第二代計算機語言,用一些容易理解和記憶的縮寫單詞來代替一些特定的指令。通過這種方法,人們很容易去閱讀已經完成的程序或者理解程序正在執行的功能,對現有程序的bug修復以及運營維護都變得更加簡單方便。但計算機的硬件不認識字母符號,這時候就需要一個專門的程序把這些字符變成計算機能夠識別的二進制數或機器語言(匯編編譯器)。
用匯編語言編寫代碼如示例-1-3所示。
mov ax, 300h add ax, 3000h sub ax, 500h示例-1-3 8086機器上完成“s=768+12288-1280”的數字運算,對應的匯編指令
可以看到示例-1-3所示的程序比起示例-1-1來簡單了很多,并且每條指令都是一個人能讀懂的指令。這樣編寫和維護起來就輕松了很多。但是匯編語言還是存在一定的缺陷——程序員依然在面向硬件編程。也就是說我們在編寫程序的時候不是在編寫我們要解決的問題,而是要將問題翻譯成一堆硬件相關的操作。這就要求程序員非常了解底層的硬件結構。為了屏蔽底層的硬件復雜性,前輩們提出了高級語言。
1.3高級語言
最初的高級語言代表有Fortran、LISP、Cobol等,不過影響最深刻的應該是C語言。有了這些高級語言后程序員不需要關注機器底層的低級結構和邏輯,而只要關注具體的問題和業務即可。
用C語言編寫代碼如示例-1-4所示。
示例-1-4 使用C語言完成“s=768+12288-1280”的數字運算
在擁有了高級編程語言后,程序員的第一個春天到來了。由于高級語言對底層硬件的屏蔽,讓編程的門檻大幅降低。越來越多的人參與到程序編寫,越來越多的業務也通過編程軟件來進行實現。但好景不長,隨著軟件的規模和復雜度的大大增加,20世紀60年代中期開始爆發了第一次軟件危機,典型表現有軟件質量低下、項目無法如期完成、項目嚴重超支等,因為軟件而導致的重大事故時有發生。
之所以發生這樣的危機,究其根源便是軟件編碼過于隨意,缺乏有效的代碼組織和模塊劃分。為了解決這次危機面向過程(結構化程序設計)的編程思想被正式提出。
1.4面向過程編程
面向過程編程的核心思想是“自頂向下、逐步細化、模塊化”。在這種思想的指導下,面向過程編程以過程(可以理解為方法、函數、操作)作為組織代碼的基本單元。面向過程風格是一種流程化的編程風格,通過拼接一組順序執行的方法來操作數據完成一項功能。
在這種指導思想的基礎上,程序員首先會用流程圖分析出解決問題的每一個步驟,然后使用函數將每一個步驟進行實現,最后使用條件判斷和循環將這些函數組織在一起來實現業務邏輯。在這個過程中程序員將大段代碼拆分成了一個個獨立的函數,最終得到的就是層層調用的函數,就可以將復雜的業務分解成簡單的任務。這種方式以函數為單元,將相關業務緊密內聚在函數內部,最終達到高內聚低耦合的目標。
有了一個又一個的函數來封裝重復的功能,代碼的可維護性和重用能力都大大提高了。
這時程序員在面對復雜的業務邏輯時已經可以進行很好的應對了。但是隨著軟件行業的發展越來越迅速,需求變化也就越來越頻繁。為了適應各種場景,面向過程的編碼往往會存在著大量的條件判斷語句——大體就是條件1該走設么邏輯,條件2該走什么邏輯,條件3等等。隨著這些特殊邏輯的增加,本身清晰的代碼邏輯不再清晰,新增一個條件判斷是要在很多地方進行修改等等讓軟件變得越來越難維護的噩夢開始出現。最終導致軟件的聲明周期變短——重新開發。
其根本原因來自于面向過程編程在應對軟件擴展時缺乏有效的手段。所以面向對象編程便呼之欲出了。
1.5面向對象編程
為了能夠更好地應對需求變化所帶來的軟件開發復雜性,構建具有擴展性的代碼的需求越來越迫切。而面向對象編程似乎就成了仙丹妙藥。通過以“封裝”、“繼承”和“多態”三大基礎特性為基礎,以“單一原則”、“開閉原則”和“里氏替換"等原則性的定理為發展,最后誕生了設計模式以及完整的代碼重構理論這些過程的不斷完善,程序員可以基于面向對象的編程來完成現代軟件開發中的各種復雜問題。
基于面向對象的編程思想來進行軟件設計產出的結果就是一個一個的擁有屬性和行為的對象之間的相互調用。并且這些對象都是所謂的“充血模型”。
1.6總結
從機器碼到面向對象編程的過程中,以引入了一層一層的中間層作為代價,最終得到了一種以“對象”為核心的抽象編程模式。這種抽象編程模式符合人類對自然的抽象——我們會描述一個人有眼睛、鼻子等,這些都是人的屬性;描述這個人可以走路、說話這些都是人的行為。在面向對象產生的運行代碼中,就仿佛有這么一群擁有自己特有屬性和行為的“人”在相互協作來對外提供一個完整的系統功能。
總結
- 上一篇: 机器学习基石-作业四-代码部分
- 下一篇: AJAX ControlToolkit学