多品牌網(wǎng)站建設(shè)網(wǎng)站規(guī)劃與設(shè)計(jì)
指令集架構(gòu)就像是特定的CPU的設(shè)計(jì)圖紙,它規(guī)定了這個(gè)CPU需要支持那些指令、寄存器有那些狀態(tài)以及輸入輸出模型。根據(jù)指令集結(jié)構(gòu)的設(shè)計(jì),在CPU上通過硬件電路進(jìn)行實(shí)現(xiàn),就得到了支持該指令集的CPU。指令集就像是我們編程語(yǔ)言中的接口,只定義規(guī)范和標(biāo)準(zhǔn),不做具體的實(shí)現(xiàn),同一個(gè)指令集架構(gòu)可以有多種不同的實(shí)現(xiàn)方式,但只要是基于同一指令集架構(gòu)的應(yīng)用程序可以相互移植。所以我們上層應(yīng)用只需要關(guān)注CPU的指令集架構(gòu)即可,具體的CPU實(shí)現(xiàn)由廠商去關(guān)注。
? 很多非開發(fā)的同學(xué)指令集名稱與CPU名稱分不清。這是因?yàn)橐环N CPU 只能識(shí)別一種指令集,所以很多情況下 CPU 都以其支持的指令集名稱來(lái)稱呼,比如當(dāng)我們要下載軟件時(shí)通常關(guān)注的就是指令集的名稱x86、ARM等,但是我們?cè)谫I電腦時(shí)廠商備注的卻是酷睿12代、龍芯3C5000、飛騰2000等,所以導(dǎo)致有的同學(xué)會(huì)把龍芯、飛騰、酷睿與x86、ARM搞混。這里的龍芯、飛騰、酷睿指的是CPU的名稱,名字可以有CPU的廠商來(lái)取。而x86、ARM則是指令集的名稱,基本都是由國(guó)外最早的幾家處理器廠商創(chuàng)造并命名的如:x86是美國(guó)Intel公司、ARM是英國(guó)的ARM公司。
? CPU本身只是在塊硅晶片上所集成的超大規(guī)模的集成電路,集成的晶體管數(shù)量可達(dá)到上億個(gè),是由非常先進(jìn)復(fù)雜的制造工藝制造出來(lái)的,所以CPU的性能不僅僅受指令集的影響,相同的指令集下好的CPU廠商和差的CPU廠商制造出來(lái)的CPU性能也是天差地別的,如:蘋果自研的m1芯片,使用的就是ARM指令集,但其性能吊打很多使用ARM指令集的CPU廠商(這個(gè)不得不承認(rèn))。
? 相信大家也知道國(guó)內(nèi)很多優(yōu)秀CPU廠商如:long xin、fei teng、kun peng等,目前只有老大哥long xin自研了LoongArch指令集。為何其他廠商都選擇走捷徑采用的國(guó)外的指令集呢?指令集的創(chuàng)造真的那么難嗎?雖然創(chuàng)造一套指令集并不容易,但也沒有到望而卻步的程度,真正難的是指令集背后的生態(tài)和推廣。就像我自己可以發(fā)明一門語(yǔ)言,語(yǔ)言本身沒什么問題,問題是我用自己發(fā)明的語(yǔ)言和別人交流,誰(shuí)聽得懂呢,誰(shuí)又愿意去學(xué)這門語(yǔ)言呢?大家都很忙,不通用的東西沒人愿意花精力去學(xué)。同一段機(jī)器指令010001110(隨便寫的),在A指令集下這組機(jī)器語(yǔ)言可能表示賦值,在B指令集下,這組機(jī)器語(yǔ)言可能表示循環(huán),所以相同一段源代碼,在不同指令集的編譯器下,最終呈現(xiàn)的編譯結(jié)果是不同的,雖然都是由01組成的二進(jìn)制數(shù)字,但是長(zhǎng)短和順序是不同的,所以每個(gè)指令集都要有對(duì)應(yīng)的編譯器、匯編器、解釋器(后文暫且統(tǒng)稱編譯器),編譯后的匯編語(yǔ)言和機(jī)器語(yǔ)言是不能跨指令集使用的。試想如果要自立門戶創(chuàng)造新的指令集,那有誰(shuí)愿意給它寫編譯器呢?這可不是一個(gè)小工程,他要跟著指令集的迭代而迭代,也要自己不斷的優(yōu)化迭代,需要大量的人力成本和時(shí)間成本。即使自己完成了編譯器,要知道每種指令集都有他自己的新特性以及一些特殊指令,不然也沒必要重復(fù)造輪子,如果一些軟件使用了ARM或者x86的特殊指令(一些內(nèi)嵌匯編語(yǔ)言的軟件,如:jvm的模版解釋器就使用了匯編語(yǔ)言),那這些軟件就要自己修改源代碼來(lái)適配新的指令集,軟件的開發(fā)程序員自然罵娘。所以自研指令集并不難,難的是如何推廣,讓大家用起來(lái)。這里要再吹一下老大哥long xin,long xin發(fā)布LoongArch指令集的同時(shí),完成了針對(duì)GCC、LLVM、GoLang三大編譯器的開發(fā),完成了針對(duì)Java、JavaScript、.NET三大虛擬機(jī)的開發(fā),使操作系統(tǒng)廠商和應(yīng)用伙伴,可基于long xin的軟件環(huán)境,更方便地開發(fā)應(yīng)用。long xin為了能夠更好的適應(yīng)市場(chǎng),也為了避免軟件程序員罵娘,投入巨大成本完成ARM和x86指令集的二進(jìn)制翻譯工作,使運(yùn)用了ARM和x86特性的軟件也不用修改源碼即可適配,但指令集翻譯本身只是過渡的手段,為了增加用戶群體,我相信隨著long xin的獨(dú)立軟件生態(tài)逐漸強(qiáng)大,指令集翻譯就會(huì)越來(lái)越邊緣化,成為錦上添花之舉。long xin的自研指令集也為全面國(guó)產(chǎn)化奠定了牢固的基礎(chǔ),在此也希望國(guó)內(nèi)更多軟件廠商能給與long xin支持,待到中華騰飛日,且讓世界聽龍吟。
? 至此CPU和指令集的關(guān)系已經(jīng)講解完畢,我們?cè)谙螺d軟件時(shí)除了要選擇指令集之外,還要選擇32位還是64位如: * * * .x86_32、 * * *.x86_64,我們已經(jīng)知道了x86代表的是指令集,那32位和64位是指什么呢?
? 這里32 位和 64 位中的“位”就是bit,也叫字長(zhǎng),是指的是cpu一次能處理的數(shù)據(jù)的長(zhǎng)度(也就是寄存器的位數(shù))。這里有一個(gè)誤區(qū)很多人一直認(rèn)為32位和64位代表的是CPU地址總線引腳的數(shù)量,因?yàn)檎勂?2位和64位CPU的不同第一個(gè)想到的就是尋址空間不同,32位CPU最大可以尋址4GB的內(nèi)存地址,64位CPU尋址范圍可以遠(yuǎn)超4GB,而地址總線的數(shù)量對(duì)應(yīng)著CPU的尋址能力(由于32位CPU地址總線引腳是32條,每根地址總線的狀態(tài)只能是高電平或低電平,也就是只能是1或0。 所以32位地址總線一共有232種狀態(tài),每種狀態(tài)代表一個(gè)內(nèi)存地址,每個(gè)內(nèi)存地址為1字節(jié),所以232種狀態(tài)一共可以表示4GB的內(nèi)存地址),所以這個(gè)誤區(qū)坑騙了很多人。在Intel x86指令集架構(gòu)下的第一款CPU 80x86中,CPU是16位但地址引線卻是20條,通過將段基址寄存器中段基地址左移4位再加段內(nèi)偏移地址的方式實(shí)現(xiàn)了20位地址尋址,所以說32和64指的并不是地址總線的數(shù)量。至于為什么現(xiàn)在CPU不管是32位的還是64位其地址總線引腳數(shù)量都等于其位數(shù),是因?yàn)楝F(xiàn)在不管是資源還是制造工藝都遠(yuǎn)勝當(dāng)年,沒必要因?yàn)閹赘刂房偩€再去做段基地址左移這種設(shè)計(jì)上的妥協(xié),不然每次尋址前都要先做一次乘法對(duì)CPU的性能還是影響很大的。