久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 3155|回復(fù): 1
打印 上一主題 下一主題
收起左側(cè)

漫談?dòng)?jì)算機(jī)硬件體系對(duì)編程的影響和意義

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:101093 發(fā)表于 2019-9-16 22:27 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
今天由于時(shí)間不多,難有旁征博引的長(zhǎng)文來(lái)跟大家解釋清楚計(jì)算機(jī)、存儲(chǔ),及其對(duì)編程的影響。不過(guò),有一點(diǎn)自己微小的見解與大家分享。雖然微小,但確實(shí)給自己減輕了很多在技術(shù)方面的理解成本和成長(zhǎng)負(fù)擔(dān)。個(gè)人覺得也應(yīng)是有些分享價(jià)值的。
1. 計(jì)算機(jī)組成
現(xiàn)代電子計(jì)算機(jī)從二十世紀(jì)四十年代末發(fā)展至今,以EDVAC計(jì)算機(jī)為標(biāo)志,到目前為止67年間計(jì)算機(jī)硬件體系的核心都未曾發(fā)生過(guò)變化,都是馮諾依曼體系的。注意這里說(shuō)的是EDVAC而非第一臺(tái)通用計(jì)算機(jī)ENIAC。EDVAC于1949年交付,1951年正式運(yùn)行,1961年完成使命退出歷史舞臺(tái)。
1.1 題外話:編程語(yǔ)言與軟件系統(tǒng)的發(fā)展和自舉
本小節(jié)的目的是為了解決大家常有的疑惑:現(xiàn)代編程語(yǔ)言和軟件都是逐步迭代的方式演進(jìn),那最早最早的編程語(yǔ)言和操作系統(tǒng)是怎么來(lái)的? 越是追溯事物的起源,越是能發(fā)現(xiàn)其本質(zhì)。
先提及一下EDVAC服役的這幾年(1949-1961)間出現(xiàn)過(guò)的,至今影響深遠(yuǎn)的編程語(yǔ)言。在這12年間,與硬件平臺(tái)強(qiáng)相關(guān)的特定匯編于1949年最早出現(xiàn),1951年各種匯編方言開始興起。Fortran于1954年開始開發(fā),1957年正式由IBM發(fā)布。約翰·麥卡錫于1958年基于IPL語(yǔ)言發(fā)明了Lisp函數(shù)式編程語(yǔ)言,主要用于人工智能。同年, ALGOL也誕生了。1959年COBOL也問(wèn)世。Fortran、Lisp、ALGOL,就是后來(lái)幾乎所有高級(jí)編程語(yǔ)言的鼻祖,它們至今自己也發(fā)揮著巨大的作用。
最早的都是用機(jī)器語(yǔ)言通過(guò)穿孔卡片的形式搞出來(lái)的,像Fortran早期都是穿孔卡片進(jìn)行編程。后來(lái)的新語(yǔ)言和新系統(tǒng),都是基于前輩們自舉而來(lái)。有了編程語(yǔ)言之后,程序,包括操作系統(tǒng)程序是如何誕生出來(lái)的就可想而知。
編程語(yǔ)言和軟件自舉的過(guò)程。純手工用穿孔紙的形式用機(jī)器語(yǔ)言編寫了早期的具有特定功能的程序,比如存粹為了計(jì)算導(dǎo)彈等軍事用途的程序。后來(lái)為了編程方便,各類匯編方言誕生,所以同樣純手工機(jī)器碼編程寫個(gè)匯編翻譯器,能把匯編源碼翻譯成機(jī)器語(yǔ)言,故而就能用匯編語(yǔ)言來(lái)寫各種各樣的特定功能的程序了。因?yàn)閰R編語(yǔ)言翻譯之后得到的最終程序是機(jī)器可直接執(zhí)行的機(jī)器碼,所以用匯編1.0寫個(gè)匯編2.0翻譯器也沒問(wèn)題的,匯編2.0成熟后,就能完全拋棄匯編匯編1.0了。同樣的,直接用機(jī)器碼或者匯編語(yǔ)言,寫個(gè)A語(yǔ)言的編譯器也沒問(wèn)題,A語(yǔ)言編譯器穩(wěn)定之后,也可以用A語(yǔ)言來(lái)寫A語(yǔ)言自己的編譯器,用匯編寫的A語(yǔ)言編譯器就可以拋棄了。
如雷貫耳的C語(yǔ)言,就是按上述過(guò)程基于CPL和BCPL語(yǔ)言發(fā)展而來(lái)的,后來(lái)很多語(yǔ)言用C寫第一版編譯器也不足為奇了,比如Python官方實(shí)現(xiàn)就一直用的是C,而Pypy是用Python自舉的。
1.2 馮諾依曼體系精要
首先要明確一點(diǎn),馮諾依曼體系因其設(shè)計(jì)EDVAC時(shí)而系統(tǒng)提出來(lái)的,但是其中的核心思想和觀念,絕不是馮諾依曼一人靈光乍現(xiàn)的個(gè)人杰作。有很多前輩們的努力,馮諾依曼是那個(gè)有機(jī)會(huì)總結(jié)并在大型項(xiàng)目中實(shí)踐的幸運(yùn)兒。
1.2.1 兩個(gè)核心原則:
  • 計(jì)算機(jī)程序和待處理的數(shù)據(jù)無(wú)差別存儲(chǔ)在存儲(chǔ)器中
      這里隱含了兩點(diǎn),運(yùn)行時(shí)存在哪里?掉電后存在哪里?也就是主存和外存,馮諾依曼的報(bào)告中是有專門提及主存和外存的。更進(jìn)一步說(shuō),程序亦是數(shù)據(jù)的一種
  • 使用二進(jìn)制,而非十進(jìn)制
      ENIAC使用的就是十進(jìn)制。
1.2.2 五個(gè)組成部分
  • 運(yùn)算器、控制器
  • 存儲(chǔ)器
  • 輸入設(shè)備、輸出設(shè)備
1.2.3 更簡(jiǎn)化地理解
在本人理解來(lái)看,計(jì)算機(jī)拋開外圍設(shè)備后,最核心的東西就是運(yùn)算器和存儲(chǔ)器。 簡(jiǎn)言之,運(yùn)算與存儲(chǔ)?刂破魇强梢詥为(dú)列出來(lái)的,但是由于控制器本質(zhì)就是根據(jù)不同的判定條件選擇不同的處理過(guò)程,和一般的運(yùn)算沒有根本上的區(qū)別,我把它粗略地歸為運(yùn)算類。這樣歸納也是有理由的,因?yàn)樵谠缙诘臋C(jī)電計(jì)算機(jī)中,有運(yùn)算器和存儲(chǔ)器就完全可以工作了(后來(lái)有了晶體管的計(jì)算機(jī)稱為電子計(jì)算機(jī))。
這樣的簡(jiǎn)化的作用是為了減輕對(duì)計(jì)算機(jī)體系的理解成本,如何個(gè)減輕法,請(qǐng)繼續(xù)看后文。
1.3 計(jì)算機(jī)組成總結(jié)
關(guān)鍵字:程序亦數(shù)據(jù)、二進(jìn)制、運(yùn)算器、存儲(chǔ)器。
其中進(jìn)制不必多談,以后會(huì)發(fā)文專門談?wù)劄楹畏且嵌M(jìn)制在這種體系結(jié)構(gòu)下最恰當(dāng),可不僅僅是高電平、低電平那么表面的解釋。程序亦是數(shù)據(jù),這原本是指馮諾依曼體系中程序和數(shù)據(jù)無(wú)差別對(duì)待,一起存放在存儲(chǔ)器里就行。但我們可以從這條延伸出很多編程上的思想,程序就是指令集,指令等同于數(shù)據(jù)對(duì)待時(shí),問(wèn)題就會(huì)簡(jiǎn)化很多,也會(huì)靈活很多。
函數(shù)式編程語(yǔ)言說(shuō)函數(shù)是一等公民,而一個(gè)函數(shù)本就是一段程序,當(dāng)有了“程序亦數(shù)據(jù)”的思想后,拿函數(shù)作為入?yún)鱽?lái)傳去不是很自然地事嗎?不知道當(dāng)初Lisp的誕生,有沒有受到這一點(diǎn)的啟發(fā),也許Lisp純粹是按數(shù)學(xué)上對(duì)待函數(shù)的態(tài)度來(lái)的。不過(guò)應(yīng)了我常說(shuō)那句話:世界是圓的。
同理,面向?qū)ο缶幊痰恼Z(yǔ)言中,一個(gè)對(duì)象本就是一組數(shù)據(jù)和其操作的封裝,把對(duì)象當(dāng)做參數(shù)傳來(lái)傳去也在情理之中。命令式語(yǔ)言把命令當(dāng)做數(shù)據(jù)操作,這本就是它們的工作方式,由計(jì)算機(jī)硬件組成結(jié)構(gòu)而來(lái)的工作方式。
2. 存儲(chǔ)
曾經(jīng)在”細(xì)學(xué)Python”QQ群里問(wèn)群友,大家覺得存儲(chǔ)的本質(zhì)是為了什么?回答五花八門,有的說(shuō)是為了賺錢讓公司不倒閉,那為什么、憑什么能賺錢了?有的說(shuō)是為了再利用,再利用來(lái)干什么?有的說(shuō)是為了備份。有的說(shuō)是為了能給程序處理,各種各種。這些回答都是有道理的,但是從一種“事物原本”的角度來(lái)講,不是很到位。
不論是外存、內(nèi)存、數(shù)據(jù)庫(kù)軟件、瀏覽器端的Cookie、服務(wù)端的Session、磁盤上的文件等等,乃至是超越計(jì)算機(jī)體系之外,人腦中的記憶,各種各樣,五花八門的存儲(chǔ)形式,都有一個(gè)共同點(diǎn):為了狀態(tài)的延續(xù)。不論是從運(yùn)行原理上、業(yè)務(wù)邏輯上、商業(yè)目的上等各種層次各種維度來(lái)觀察,這個(gè)結(jié)論都能得到解釋。
瀏覽器端的Cookie和服務(wù)端的Session不必多說(shuō),為了使用戶的登錄狀態(tài)得以延續(xù);程序運(yùn)行時(shí)在內(nèi)存中的數(shù)據(jù)存儲(chǔ)是為了程序的運(yùn)行時(shí)狀態(tài)得以延續(xù);電腦關(guān)機(jī)以后要將數(shù)據(jù)數(shù)據(jù)回寫磁盤,是為了下次開機(jī)后能夠延續(xù)上一次關(guān)機(jī)前的開機(jī)狀態(tài);數(shù)據(jù)庫(kù)中存儲(chǔ)的數(shù)據(jù),是為了讓業(yè)務(wù)系統(tǒng)的運(yùn)行時(shí)狀態(tài)、業(yè)務(wù)邏輯狀態(tài)不斷延續(xù);人腦能夠根據(jù)存儲(chǔ)的記憶觸景生情,是為了在若干時(shí)間后延續(xù)之前的那種情緒狀態(tài),比如運(yùn)動(dòng)員若干年后看著自己曾經(jīng)拿到的金牌能夠置身于當(dāng)初得獎(jiǎng)的喜悅感受中。還有很多例子拿來(lái)解釋。
3. 硬件體系和存儲(chǔ)的本對(duì)編程的意義
在上一篇《編程到底是個(gè)什么玩意》中已經(jīng)說(shuō)了一條很重要的原則:事物是分層次的,軟件也是。層次思維明晰的話,就容易思考清楚很多軟件中的架構(gòu)和設(shè)計(jì)。
3.1 運(yùn)算器與存儲(chǔ)器對(duì)編程的意義
編程語(yǔ)言各種各樣,之前我們已經(jīng)談過(guò)了程序的共同本質(zhì),那么硬件體系對(duì)編程有什么影響呢?首先是硬件的可能性直接決定了軟件的可能性。其次,既然硬件體系可歸納為兩大類:運(yùn)算器與存儲(chǔ)器。那么軟件體系也逃不脫這兩大類,做運(yùn)算的與做存儲(chǔ)的。
運(yùn)算與存儲(chǔ),就好比是兩個(gè)基本元素,它們?cè)谟布w系中存在,也在軟件體系中存在。它們還能夠按層次組織,大層次的元素可以囊括小層次的元素。舉個(gè)例子:MySQL數(shù)據(jù)庫(kù)從宏觀看是一個(gè)存儲(chǔ)程序,而要讓MySQL這個(gè)級(jí)別的程序正確工作,只有一個(gè)層次是不可能的,它必須包含運(yùn)算類的模塊(按上文所述,控制類的也屬于此),也包含了存儲(chǔ)類的模塊,還有各種不同的層次逐級(jí)分下來(lái),最終落實(shí)到MySQL的每一行源代碼,哪函數(shù)是是它所在的那個(gè)級(jí)別的存儲(chǔ)作用的,哪個(gè)函數(shù)是該級(jí)別的運(yùn)算作用的;某個(gè)函數(shù)中,哪一行數(shù)和存取數(shù)據(jù)相關(guān)的,哪一行是與運(yùn)算數(shù)據(jù)相關(guān)的……最終,指令而且還會(huì)落實(shí)到硬件上的運(yùn)算器與存儲(chǔ)器上。
由于存儲(chǔ)到底還是存儲(chǔ)的是數(shù)據(jù),故而明白了存儲(chǔ)的地位以后,就知道了計(jì)算機(jī)程序所操作的存儲(chǔ)器與存儲(chǔ)器中的數(shù)據(jù)的重要性。程序要操作的存儲(chǔ)器是內(nèi)存,而數(shù)據(jù)在編程語(yǔ)言中的表現(xiàn)形式就是該語(yǔ)言支持的各種數(shù)據(jù)結(jié)構(gòu),包括基本數(shù)據(jù)結(jié)構(gòu)和擴(kuò)展數(shù)據(jù)結(jié)構(gòu),基本數(shù)據(jù)結(jié)構(gòu)是就是整數(shù)、浮點(diǎn)數(shù)等,擴(kuò)展數(shù)據(jù)結(jié)構(gòu)包括結(jié)構(gòu)體、對(duì)象等等。故而學(xué)習(xí)一門編程新語(yǔ)言,你首要關(guān)注的是如何進(jìn)行內(nèi)存的分配與使用,以及數(shù)據(jù)結(jié)構(gòu)的操作。
還有一個(gè)很明確的編程指導(dǎo)思路:從程序功能講,你所要完成的項(xiàng)目應(yīng)該歸為運(yùn)算類還是存儲(chǔ)類?當(dāng)要做模塊拆分時(shí),這兩種分類又能指導(dǎo)你進(jìn)行模塊劃分。為了更清晰,你可以按運(yùn)算器、控制器、存儲(chǔ)器三種來(lái)分。再往下可以指導(dǎo)你的類、函數(shù)的劃分,再往下就能指導(dǎo)代碼的編寫,哪一行該操作哪個(gè)數(shù)據(jù)對(duì)象,它存在于哪里?要經(jīng)過(guò)怎么樣的運(yùn)算,要到哪里去?……
當(dāng)軟件需要優(yōu)化時(shí),有兩個(gè)大方向可以考慮,是運(yùn)算需要優(yōu)化,還是存儲(chǔ)需要優(yōu)化?假如當(dāng)運(yùn)算需要優(yōu)化時(shí),哪個(gè)級(jí)別負(fù)責(zé)運(yùn)算的程序需要優(yōu)化?要優(yōu)化這個(gè)級(jí)別的運(yùn)算,那其子級(jí)別中的運(yùn)算和存儲(chǔ)兩大類程序又是哪類更應(yīng)該優(yōu)化?當(dāng)程序功能不足需要添加功能時(shí),要添加充當(dāng)運(yùn)算角色的功能呢?還是要添加充當(dāng)控制角色的?抑或是要充當(dāng)存儲(chǔ)功能的?……
有的同學(xué)可能會(huì)想,像WEB界面的內(nèi)容,應(yīng)該歸為哪類?宏觀看,WEB界面只是服務(wù)端輸出的結(jié)果,通過(guò)網(wǎng)絡(luò)I/O這種方式暫時(shí)存放到了客戶端,瀏覽器把這些數(shù)據(jù)處理渲染給了終端用戶。網(wǎng)絡(luò)I/O屬于我理解的計(jì)算機(jī)外圍設(shè)備,當(dāng)然,非要?jiǎng)澐謧(gè)歸類,那應(yīng)當(dāng)歸為存儲(chǔ)類。
總而言之,運(yùn)算與存儲(chǔ)這兩個(gè)基本元素,構(gòu)建起了馮諾依曼體系下計(jì)算機(jī)軟硬件的高樓大廈。
3.2 狀態(tài)延續(xù)性對(duì)編程的意義
無(wú)需多言,將會(huì)指導(dǎo)我們定義程序中的數(shù)據(jù)種類、數(shù)據(jù)結(jié)構(gòu),優(yōu)化數(shù)據(jù)的的核心指南。你希望程序這一刻是個(gè)什么狀態(tài)?經(jīng)過(guò)運(yùn)算后,下一刻又是一個(gè)什么狀態(tài)?要不要延續(xù)?那些基本數(shù)據(jù)齊活了以后才能使這個(gè)狀態(tài)得以延續(xù)?如果1個(gè)字節(jié)的數(shù)據(jù)就能讓狀態(tài)延續(xù)下去,用1KB數(shù)據(jù)來(lái)解決問(wèn)題是不是有些浪費(fèi)?
在有些程序里,磁盤IO速度不足,滿足不了CPU的處理速度,那怎么辦?那是CPU里的計(jì)算狀態(tài)延續(xù)不下去了,出現(xiàn)等待磁盤IO的斷檔,很明顯的優(yōu)化思路就是增加一種程序來(lái)解決這個(gè)事情。增加運(yùn)算類的程序能解決這個(gè)問(wèn)題嗎?看樣子不太行,應(yīng)為CPU作為運(yùn)算器的存在它已經(jīng)有強(qiáng)大優(yōu)勢(shì)了。那就加存儲(chǔ)類程序唄,用內(nèi)存來(lái)做存儲(chǔ)嘛,好像問(wèn)題可以得解了。
如果隨著程序發(fā)展,又滿足不了了怎么辦?換性能更好的存儲(chǔ)器,一種存儲(chǔ)器解決不了的問(wèn)題就兩種存儲(chǔ)器解決,兩種存儲(chǔ)器解決不了的就三種來(lái)解決…… 君不見,這就是馮諾依曼體系下的硬件發(fā)展與軟件優(yōu)化趨勢(shì),硬件中的多級(jí)緩存,從CPU到內(nèi)存到磁盤,軟件中的多級(jí)緩存從應(yīng)用程序到數(shù)據(jù)庫(kù)程序到操作系統(tǒng)程序,無(wú)處不在……
以后再發(fā)文說(shuō)說(shuō)多級(jí)緩存的事。
另外,存儲(chǔ)是為了狀態(tài)延續(xù)這條指導(dǎo)規(guī)則,還可以發(fā)揮更多的作用,比如在數(shù)據(jù)災(zāi)難恢復(fù)、程序不間斷服務(wù)而切換存儲(chǔ)介質(zhì)或者切換數(shù)據(jù)庫(kù)上。大家可以發(fā)揮一下,不再多寫。
4. 總結(jié)
本文也許有些同學(xué)看起來(lái)就是“假大空”,原因之一是確實(shí)篇幅有限,不能再多啰嗦;其二是偏理論經(jīng)驗(yàn)性的闡述,而缺少實(shí)例;其三是這部分同學(xué)可能編程經(jīng)驗(yàn)還不足。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:281879 發(fā)表于 2019-9-17 10:21 | 只看該作者
分析的有道理 學(xué)習(xí)了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩成人| 午夜欧美一区二区三区在线播放 | 国产亚洲一区二区三区在线观看 | 国产精品久久二区 | 久久久久久久一区 | 日韩福利一区 | 毛片免费看的 | 一区二区三区精品视频 | 国产视频一视频二 | 久久爱综合 | www.47久久青青 | 日韩av在线不卡 | 第一色在线 | 国产又色又爽又黄又免费 | 亚洲视频免费在线观看 | 九一精品 | 少妇一级淫片免费放播放 | 国产精品视频综合 | 国产一区二区黑人欧美xxxx | 亚洲视频在线播放 | 两性午夜视频 | 亚洲一区二区三区乱码aⅴ 四虎在线视频 | 亚洲高清在线观看 | 天堂成人国产精品一区 | 妞干网av| 91中文字幕在线观看 | 国产激情视频网站 | 国产成人精品一区二区三区 | 91素人| 国产精品一区二区视频 | 亚洲精品高清视频在线观看 | 深夜福利影院 | 玖玖综合在线 | 免费国产视频在线观看 | 成人av一区二区三区 | 国产精品永久免费 | 成人精品久久 | 国产成人在线播放 | 亚洲综合国产精品 | 一区二区三区国产视频 | 久久国产一区二区三区 |