對程式的又一次理解
程式設計人員眼中的計算機無非就是cpu和儲存器, 貌似每天忙忙碌碌的我們其實都只在做同一件事情---運算元據.每天的工作只是將組織好的資料交給cpu去做累加運算, 然後再取得結果而已. 計算機對我們而言, 只是一大堆閘電路和儲存器的集合, 就像算盤一樣, 它只是一台機器或一種工具, 僅此而已. 而我們的工作就是要通過這個工具快速的從大量資料中獲取結果並以各種方式呈現給使用者.
所以有 」程式 = 資料結構 + 演算法」 之說, 演算法就是解決問題的方法. 而資料結構就是在計算機內部的資料的表示和資料之間關係的表示(資料結構 = 資料表示 + 資料間關係的表示). 記住, 我們的工作就是運算元據, 當面對乙個實際問題時, 首先要做的就是分析資料, 確定資料及資料之間的關係(邏輯關係); 其次, 需要分析針對該資料所可能執行的操作(設計演算法). 再次, 需要以某種儲存結構在計算機中表示資料及資料間的關係(物理儲存). 然後, 根據儲存結構的儲存方式和設計好的演算法在計算機中實現該演算法(編寫**). 最後, 利用編寫好的**來處理資料得到結果.
資料的邏輯結構與資料儲存無關, 目前常用的有四種邏輯結構: 集合結構(雜湊結構)、線性結構、樹形結構和圖形結構. 這也是大學中資料結構這門課的主線, 而資料的儲存結構則分為順序儲存結構和鏈式儲存結構. 邏輯結構和儲存結構是不相關的, 每種邏輯結構都可以採用不同的儲存結構來實現. 值得注意的是, 順序儲存結構是指採用一片連續的空間來順序儲存資料的方式, 而鏈式儲存結構是指採用不連續的多個儲存單元分塊儲存資料, 並採用指標或引用將各個片段連線起來的儲存方式; 這裡說的是儲存方式, 而不是具體的實現或某種結構.
真正的儲存結構是指物理儲存, 指資料在記憶體或硬碟上的儲存位置. 比如: 資料在硬碟上存放在多個連續的簇中, 才是順序結構, 而資料分散在硬碟中的很多不連續的簇中, 並採用指標或引用鏈結各塊才是鏈式儲存結構(硬碟中好像是通過索引來鏈結各塊的). 所以說陣列在邏輯上連續的, 在物理上是不連續的(如: 大小為100000的陣列是不太可能有連續的記憶體單元的). 嚴格說來, 陣列是屬於邏輯結構的, 但是由於陣列中元素的關係通過位置來體現的特性, 我們在開發過程中通常用陣列來模擬順序儲存方式. 類似的, 通常採用鍊錶來模擬資料結構的鏈式儲存方式.
由於計算機記憶體資源屬於稀缺資源, 所以不可能無休止的肆意使用記憶體. 在傳統的c, c++等高階語言中, 記憶體空間的使用和**都是由程式設計師自己來控制的. 這樣雖然在效率上有一定優勢, 同時也比較靈活, 但這種方式提高了程式設計的複雜度, 對程式設計師有著較高的要求. 由於程式設計師水平參差不齊, 在團隊開發中容易造成未知bug和安全隱患. 於是便出現了託管記憶體技術, 由程式來控制記憶體空間的申請、**等操作. 而編寫這些程式或軟體系統的公司通常都是業界頂級的軟體公司, 如微軟公司推出的.net framework平台以及在該平台上的c#託管程式語言.
.net framework框架圖, 看過很多遍, 直到今天才發現, 其實我一直沒太懂. 今天從眾多圖中抽了3張圖來總結下自己對.net framework框架的理解.
這張圖看過很多遍, 一直不知道它用來表徵什麼. 個人的理解是, 它表明了這麼一種編寫軟體的方式或者說表明了.net平台下開發軟體的思想和規範. 真正的.net framework框架只包含兩部分, 即公共語言執行時(clr: common language runtime) 和 框架類庫(fcl: framework class library)兩部分.
可以設想自己是乙個軟體專案經理, 很不湊巧的是手裡面的程式設計師有精通vb、vc++和c#的程式設計師各一名, 那麼如何來使這些程式設計師寫作開發同乙個專案呢? 以往不可能的任務, 在.net framework下就成為可能, 並且這些程式設計師按照自己精通的方式去開發專案:
第一層: 程式設計師使用自己熟悉的方式去完成各自的模組, 這些模組可能使用不同的開發語言.
第二層: 但是採用不同語言開發的話, 又是如何將這些**整合的呢? 通過公共語言規範(cls: common language specification)來實現, 公共語言規範從各種程式語言中抽象出公共部分並以com元件的方式對各種程式語言提供支援. 另外, 通用型別系統(cts: common type system) 也是.net平台的重要特性之一, 它提供了.net標準的資料型別和準則集. 嚴格來講, cls是cts的子集. 不同程式語言的模組, 在這一層通過com元件轉化為cls所支援的語言, 即微軟中間語言msil(microsoft interspace language), 而相關資料型別則轉化為cts所使用的型別(如: int轉化為system.int32型別, string轉化為system.string型別等).
第三層和第四層, 則是.net最重要的元件, 這些開發元件是程式設計師需要和能操作的東西, 每乙個開發元件都代表一種應用程式的開發方向, 是某類應用程式的框架. 如果說前兩層只是不同程式語言如何實現統一的過程的話, 這兩層則是利用.net提供的各種元件, 進行具體的開發過程.
最後當程式執行時, 再由clr中的jit(just in time)編譯器進行二次編譯, 將中間語言編譯為機器碼並執行程式. 在程式的開發階段, **經過第一次編譯(build操作)並轉換為中間語言後便儲存起來, 當執行改程式時, 則由jit負責二次編譯. 所以.net編譯結束的.exe檔案其實是中間語言表示的**檔案. 當雙擊程式執行時, 才會經由jit將中間語言解釋為機器碼並執行. 執行過程如下圖:
關於c#語言的資料型別, 如下圖:
個人閒暇的類庫理解, 望指點!
又一次講課
今天早上1,2節在海韻404給學生上了習題課,講述大概有一節半的時間。台下學生是軟體學院2007級,大概130多號人物,講授課程是計算機網路的習題課。雖然前幾天已做好功課,寫好習題課課件,大概理清要講的內容,但是今天兩節課上完,感覺還是一般,表達技巧和能力停滯不前。講課時有注意到抑揚頓挫 語速 咬字...
又一次錯愕
昨天突然得到訊息,被公司優化了,優化的不是我乙個人,是我和我帶的團隊,本來也曾想過有可能有類似的情況發生,但沒想到這刀會砍到我頭上,到現在還有點緩不過神來,上一次類似的情形是18年6.1和echo分手,再上一次就是17年5.22和雲科談。其實和雲科解約那次並沒有很痛苦,反倒還有點重獲自由以及對未來未...
又一次的記錄
try courseoverview site.select span class f ib f vam 0 get text course overview site.select div class f richeditortext 0 get text syllabus site.select...