3.1.2 計(jì)算機(jī)語言——人與計(jì)算機(jī)溝通的橋梁
早期人們編程時(shí),都是使用匯編語言進(jìn)行編程,編譯器將匯編語言翻譯成機(jī)器語言,交由計(jì)算機(jī)執(zhí)行,匯編語言描述了計(jì)算機(jī)的運(yùn)算過程,但是卻不符合人類的思維方式,程序員苦在其中。
1977年,巴庫斯在圖靈獎(jiǎng)受獎(jiǎng)演說時(shí)講到:“程序設(shè)計(jì)能從馮·諾伊曼風(fēng)格中解放出來嗎?”巴庫斯為什么能得到圖靈獎(jiǎng),原因在于他發(fā)明了世界上第一個(gè)高級語言Fortran,他當(dāng)時(shí)在IBM工作。巴庫斯向人們介紹了一種全新的編程概念:程序員知道自己想要做什么,而并不需要知道是怎樣做的。高級語言的編程風(fēng)格更接近于人類的自然語言,有了高級語言后,程序員就擺脫了對計(jì)算機(jī)的依賴。
后來,又陸續(xù)出現(xiàn)了C/C++、Java等高級語言,在這些語言中,兩個(gè)數(shù)求和就可以寫成C = A + B,這樣更符合人們的表達(dá)方式,編程也更為方便。
C/C++這些語言,離人們的自然語言還很遠(yuǎn),編程語言也一直向著更智能的方向發(fā)展。在C語言中,矩陣的乘法運(yùn)算要寫3級for循環(huán),而在Matlab中,只要一行語句就可以了。在數(shù)據(jù)庫語言SQL中,在一個(gè)表中找什么字段,只要SELECT xx FROM xx就可以了,如果用C語言,則需要大量的循環(huán)和比較操作。
未來,編程語言將發(fā)展到和人類的自然語言統(tǒng)一,電腦能聽懂人類的語言,這樣人們就只要告訴電腦要做什么,而不用告訴電腦怎么做。最近,參加知識競賽而聞名的IBM計(jì)算機(jī)Watson在人類語言理解上有了很大的突破,它還能夠回答一些腦筋急轉(zhuǎn)彎題目,相信未來會做得更好。
3.2 指令集發(fā)展的來龍去脈
3.2.1 CISC時(shí)代——粗放式擴(kuò)張
CISC代表Complex Instruction Set Computer(復(fù)雜指令集計(jì)算機(jī)),其實(shí)最早并沒有CISC這個(gè)詞,只是后來出現(xiàn)了新的計(jì)算機(jī)設(shè)計(jì)思想,于是將采用新思想開發(fā)的計(jì)算機(jī)稱為RISC(Reduced Instruction Set Computer,精簡指令集計(jì)算機(jī)),將以前的計(jì)算機(jī)稱為CISC。這就好比世上本沒有舊中國,只是新中國出現(xiàn)了,才有了舊中國。CISC和RISC也分別代表了兩種處理器的指令集類型。
計(jì)算機(jī)發(fā)展早期,人們使用匯編語言編程,自然更喜歡強(qiáng)大和好用的指令集,處理器的設(shè)計(jì)人員于是將指令集設(shè)計(jì)得更強(qiáng)大、更靈活。后來高級語言出現(xiàn),處理器設(shè)計(jì)人員又在指令集中增加了一些指令集和特性直接完成高級語言對應(yīng)的某些功能,如復(fù)雜的尋址模式,直接對應(yīng)指針的運(yùn)算。
那個(gè)時(shí)期的存儲器既昂貴且速度慢,因此指令使用了變長編碼,以節(jié)約存儲空間。由于一條指令能完成很多的功能,對內(nèi)存的訪問也減少了,這樣也減少了緩慢的存儲器訪問對程序性能的影響。
當(dāng)下還在使用的最出名的CISC指令集是Intel的x86指令集。
3.2.2 RISC時(shí)代——優(yōu)化配置資源,合理提升效率
上世紀(jì)70年代中葉,IBM的John Cocke發(fā)現(xiàn),很多時(shí)候,處理器提供的大量指令集和復(fù)雜尋址方式并不會被編譯器生成的代碼用到,套用當(dāng)下流行的二八定律,那就是20%的簡單指令經(jīng)常被用到,它們占程序總指令數(shù)的80%,而指令系統(tǒng)中其余80%復(fù)雜的指令則很少使用,只占程序總指令數(shù)的20%。
一些專家基于這種思想,將指令集和處理器進(jìn)行了重新的設(shè)計(jì),在新的設(shè)計(jì)中,只保留了常用的簡單的指令,這樣處理器就不需要浪費(fèi)太多的晶體管去做那些很復(fù)雜又很少使用的功能。典型的例子就是Intel的x86指令集手冊有一千多頁,而一般的RISC處理器指令集手冊則只有二、三百頁。
由于簡單指令大部分時(shí)間都能在一個(gè)cycle內(nèi)完成,因此處理器的頻率得以大幅提升。這個(gè)時(shí)期為了更好地實(shí)現(xiàn)流水線,指令集采用了定長編碼,這樣指令的譯碼過程就簡單了。
由于指令集更精簡,這種思想的指令集就叫RISC指令集,以前的指令集就叫CISC指令集。RISC是計(jì)算機(jī)歷史上的一個(gè)飛躍,RISC先驅(qū)之一Steven Przybylski半開玩笑地把RISC定義為:“1985年之后發(fā)布的所有處理器”。ARM、MIPS、Power、DSP等都屬于RISC體系,其中MIPS最遵守RISC規(guī)則。
IBM、加州大學(xué)伯克利分校的David Patterson、斯坦福大學(xué)的John Hennessy是RISC研究的先驅(qū),后來很多商業(yè)的處理器都受到他們的影響,Power處理器來自IBM,PowerPC處理器起源于Power,ARM、SPARC處理器受到伯克利RISC的影響,MIPS來自斯坦福,Alpha處理器受到它的影響。
3.2.3 后RISC時(shí)代——不管黑貓白貓,抓到老鼠就是好貓
RISC處理器通過更合理的微架構(gòu),在性能上超越了傳統(tǒng)的CISC,在最初的較量中,Intel處理器敗下陣來,服務(wù)器的處理器大部分被RISC陣營所占據(jù)。在PC領(lǐng)域,由于眾多的應(yīng)用軟件要求處理器后向兼容,因此Intel的地位暫時(shí)沒有動搖。
Intel當(dāng)時(shí)也嘗試做RISC處理器,但是因?yàn)榧嫒菪詥栴},市場不買賬?!斗钦\勿擾2》中有句經(jīng)典臺詞:“婚姻怎么選都是錯(cuò),長久的婚姻就是將錯(cuò)就錯(cuò)。”秉持這一理念,Intel決定一條路走到黑,將兼容性進(jìn)行到底,但是CISC架構(gòu)很難提升性能的壓力卻仍然擺在Intel面前。不過世界上沒有什么邁不過去的坎,任何困難都有解決的方法,Intel終于在Pentium Pro處理器問世時(shí)解決了這一問題。
David B. Papworth和他的同事一起設(shè)計(jì)了Pentium Pro處理器,它的微架構(gòu)是Intel著名的P6,在很多教科書上都會介紹。在這個(gè)處理器中,x86指令集被先解碼為類似于RISC指令的微操作(micro- operations,簡稱為uops),以后的執(zhí)行過程采用RISC內(nèi)核,這種架構(gòu)一直延續(xù)至今,成為一代經(jīng)典。CISC這種古老的架構(gòu),通過巧妙的設(shè)計(jì),又一次煥發(fā)新春,可以說是老樹發(fā)新芽的典范,Papworth也因此在Intel內(nèi)獲得很多獎(jiǎng)項(xiàng),成為Intel Fellow。
這種處理器結(jié)構(gòu)相較于沒有兼容性壓力的純RISC處理器要復(fù)雜,但好在有兼容性的優(yōu)勢來保證市場。80、90年代,服務(wù)器廠商很多,不少服務(wù)器廠商都自己生產(chǎn)處理器,而生產(chǎn)處理器是個(gè)燒錢的行當(dāng),如果沒有一定銷量的保證,就會得不償失,這也限制了處理器芯片的研發(fā),而Intel有良好的PC市場來保證研發(fā),因此x86處理器的性能逐漸超過了同期的RISC處理器,搶占了服務(wù)器市場,導(dǎo)致其他的處理器廠商只能向低功耗,或面向?qū)S蓄I(lǐng)域的嵌入式方向發(fā)展。
RISC和CISC都是時(shí)代的產(chǎn)物,也無所謂誰好誰壞。RISC作為新興事物,在很多思想上要更先進(jìn),不過CISC也有它的一些優(yōu)點(diǎn)。
CISC指令的一條指令常常對應(yīng)著RISC指令的多條指令,在RISC處理器中,過分精簡的指令數(shù)量,使得RISC 處理器與存儲器之間的數(shù)據(jù)交換增多,而存儲器的工作速度遠(yuǎn)低于處理器,很容易導(dǎo)致性能惡化。
增加處理器性能的一種方法就是多提供指令功能,RISC中的“精簡指令”也越來越變得不精簡。x86處理器近幾年逐漸增加了幾百條MMX、SSE指令,用于提高多媒體程序和其他特殊程序的性能。DSP、ARM、MIPS等處理器每代也會增加不少的指令,用于完成特殊的任務(wù),哪怕是這些功能很少被使用。
傳統(tǒng)的RISC指令集為了譯碼方便,指令采用定長編碼,因此程序空間較大,雖然存儲成本相對較低,但是在很多應(yīng)用下,程序空間較大會降低Cache的命中率,降低程序的執(zhí)行效率。
TI C64 DSP采用定長指令編碼,每個(gè)指令32bit,而在它的升級版本C64+內(nèi)核中,就將一些指令改為16bit,這樣大大減少了程序長度。Tensilica公司的可配置處理器內(nèi)核Xtensa也是采用16bit/24bit的指令長度,同樣的例子還有MIPS、ARM等處理器,ARM的Thumb指令集就是16bit的,這種簡單的變長指令集,并沒有增加多少譯碼電路,不過卻能大幅度減少程序空間和功耗。
總結(jié)
處理器/指令集呈現(xiàn)出螺旋式的發(fā)展:逐漸做大,然后優(yōu)化,然后又做大……從量變到質(zhì)變,然后進(jìn)入下一輪的量變和質(zhì)變,只是此“質(zhì)”已非彼“質(zhì)”了。