備注:這是我問答內(nèi)容的一個(gè)精編版,增加了一些內(nèi)容,所以和原內(nèi)容略有不同。
去年底,有中國開發(fā)者已經(jīng)開發(fā)出文言文編程語言,并在GitHub上摘得了5500星,在國內(nèi)引起不小反響。這件事給普通人的印象是,科技發(fā)展日新月異,電腦CPU太厲害,都能讀懂文言文了!
CPU真的能看懂文言文代碼嗎?答案是CPU既看不懂文言文代碼,也看不懂英文代碼。
現(xiàn)在的CPU晶體管數(shù)量動(dòng)輒幾十億個(gè),結(jié)構(gòu)非常復(fù)雜,但內(nèi)部傳輸?shù)男盘?hào)只有兩種:高電壓和低電壓,分別代表數(shù)字信號(hào)“1”和“0”(也有相反的),因此CPU唯一能看懂的就是由“1”和“0”組成的代碼。
由于程序(代碼)存儲(chǔ)在電腦硬盤中時(shí),也是“1”和“0”的形式,是否就意味著,只要程序存到硬盤中,CPU就能認(rèn)識(shí)呢?
答案是CPU仍然看不懂這些程序,因?yàn)橐浴?”和“0”位模式存儲(chǔ)的程序和以“1”和“0”寫成的機(jī)器語言完全是兩回事,簡單說,兩者的區(qū)別類似于漢語書和英語書都用紙和油墨印制,但依然是兩種不同的語言,不會(huì)英語的依然看不懂英語書。
機(jī)器語言是CPU唯一能看懂的語言,也是第一代編程語言。
?
?
圖片說明:早期的計(jì)算機(jī)程序員使用機(jī)器語言編程,將用0和1數(shù)字編成的程序代碼打在紙帶或卡片上(打孔代表1,不打孔代表0),再將它通過紙帶機(jī)或卡片機(jī)輸入計(jì)算機(jī),進(jìn)行運(yùn)算。
機(jī)器語言的最大特點(diǎn)是面向計(jì)算機(jī)硬件編程,簡單說就是程序員需要通曉計(jì)算機(jī)硬件知識(shí),寫的程序要真實(shí)表示數(shù)據(jù)是如何被計(jì)算機(jī)操縱的。對(duì)程序員來說這就比較頭大,一方面不僅需要通曉計(jì)算機(jī)硬件知識(shí),另一方面如果計(jì)算機(jī)使用了不同的硬件,那么就得重新編程。
畢竟上得了“廳堂”(搞掂硬件)下得了“廚房”(玩得轉(zhuǎn)軟件),只有少數(shù)大神能做到,加上機(jī)器語言純用“0”和“1”序列組成,非常單調(diào)枯燥,不僅扼殺了編程的趣味,而且對(duì)視力也是一種考驗(yàn),稍微一眼花,看錯(cuò)1或0的排列位置,就會(huì)制造一個(gè)大BUG。
于是,有一幫人開始琢磨了:能不能將計(jì)算機(jī)硬件從編程中分離出來,讓硬件知識(shí)小白也能編程?
最先開竅的是藍(lán)色巨人IBM,它在其System/360計(jì)算機(jī)中引入了ISA(Instruction Set Architecture)概念,將編程所需要了解的硬件信息從硬件中抽象出來,這樣編程人員就可以面向ISA編程。由于ISA是用來描述編程時(shí)用到的抽象機(jī)器(不是具體的電腦CPU),包括了一套指令集和一些寄存器,因此,程序員只要知道ISA,不需要了解具體的硬件知識(shí),就可以編寫程序,在ISA相同的電腦上運(yùn)行。
這樣一來,就出現(xiàn)了匯編語言,但匯編語言用符號(hào)寫成,還是不夠接地氣兒,于是高級(jí)語言就誕生了。高級(jí)語言的誕生,使程序員將精力從復(fù)雜的計(jì)算機(jī)結(jié)構(gòu)轉(zhuǎn)移到要解決的問題,從而可以專心烹調(diào)程序大餐。
由此也可以看出,現(xiàn)在的程序員并不都是了解計(jì)算機(jī)硬件的,所以妹子們不要指望自己的程序員男朋友給你DIY電腦,或者電腦壞了,他能給你省下一筆修理費(fèi)。他說不會(huì)修,那就是真的不會(huì)修。
自從高級(jí)語言出現(xiàn)后,人類開始了在編程語言上的放飛自我,經(jīng)過數(shù)十年的發(fā)明創(chuàng)造,現(xiàn)在的高級(jí)編程語言已超過2500種,像比較知名的C++和Java等,都屬于高級(jí)語言。
極客漫畫《編程語言之戰(zhàn)》,展示的是高級(jí)編程語言之間的市場競爭,也揭示了高級(jí)編程語言多如牛毛。
但問題出現(xiàn)了,CPU能理解的機(jī)器語言還是那個(gè)機(jī)器語言,幾十年來沒有變化,讓它讀懂高級(jí)語言那是不可能的。
怎么辦?
其實(shí),早在高級(jí)語言出現(xiàn)之前的匯編語言時(shí)代,聰明的計(jì)算機(jī)研發(fā)人員就開發(fā)出了專門的程序,用來將匯編語言和高級(jí)語言翻譯成機(jī)器語言,其過程相當(dāng)于將英語名著翻譯成漢語著作。
說白了,這種翻譯程序相當(dāng)于人類中的翻譯家。
翻譯程序有兩種工作方法:編譯和解釋,相應(yīng)的程序名稱是編譯器和解釋器。兩者的區(qū)別是,編譯是在執(zhí)行前把整個(gè)源程序(高級(jí)語言程序)翻譯成目標(biāo)程序(機(jī)器語言程序),而解釋是一次只翻譯和執(zhí)行源程序中的一行。
?
?
打個(gè)形象的比方,解釋器相當(dāng)于發(fā)布會(huì)的實(shí)時(shí)翻譯,演講的嘉賓說一句,實(shí)時(shí)翻譯馬上翻譯一句。編譯器則相當(dāng)于著作翻譯家,整本翻譯完成后,再讓出版社印刷上市。
經(jīng)過翻譯程序的努力,現(xiàn)在CPU能看懂程序員寫的程序了。當(dāng)然,用開頭提到的文言文編程語言編寫的程序想要讓CPU看懂,還得多一道翻譯步驟,即要么翻譯成Javascript,要么翻譯成Python。多轉(zhuǎn)了一圈,不知道程序執(zhí)行效率如何。
由于CPU不能直接理解用高級(jí)語言寫成的代碼,必須依賴翻譯程序翻譯成機(jī)器語言,因此翻譯程序可以極大地影響甚至決定處理器性能的發(fā)揮。如果沒有一個(gè)好的翻譯程序,那么CPU的性能再強(qiáng)大,也好比茶壺裝的餃子,倒不出來。
正因?yàn)槿绱?,谷歌在安?.4之后,拋棄了Dalvik虛擬機(jī),改為ART,實(shí)際是將翻譯程序從解釋器切換到編譯器,發(fā)揮了芯片的性能,提高了程序運(yùn)行效率。
現(xiàn)在,手機(jī)大廠包括華為、OPPO和vivo都開始重視編譯器開發(fā),說到底就是為了發(fā)揮芯片性能,讓它不再成為倒不出餃子的茶壺。
最后總結(jié)一下,用翻譯程序把程序員編寫的程序翻譯成二進(jìn)制代碼的機(jī)器語言后,CPU就能看懂代碼了,而且翻譯程序的優(yōu)劣可以影響乃至決定CPU性能發(fā)揮。
?
關(guān)注【深圳科普】微信公眾號(hào),在對(duì)話框:
回復(fù)【最新活動(dòng)】,了解近期科普活動(dòng)
回復(fù)【科普行】,了解最新深圳科普行活動(dòng)
回復(fù)【研學(xué)營】,了解最新科普研學(xué)營
回復(fù)【科普課堂】,了解最新科普課堂
回復(fù)【團(tuán)體定制】,了解最新團(tuán)體定制活動(dòng)
回復(fù)【科普基地】,了解深圳科普基地詳情
回復(fù)【口罩】,預(yù)約報(bào)名官方口罩免費(fèi)領(lǐng)取
回復(fù)【科學(xué)防控】,學(xué)習(xí)疫情相關(guān)科普知識(shí)
回復(fù)【科普小達(dá)人】,報(bào)名參賽贏取萬元大獎(jiǎng)