“程程,幫忙看一個(gè)問(wèn)題唄?”
一名綁著單馬尾,臉蛋圓圓的妹子蹭到了程原的身旁,并小聲向他請(qǐng)教道:“我這個(gè)程序運(yùn)行不起來(lái)!”
“哎,好吧。”程原聳了聳肩,并暫時(shí)放下了手中的筆記本。
隨后,他伸手輕輕一推桌邊,裝有輪子的辦公椅便將他送到了圓臉妹子的工位旁。接下來(lái)他抬頭看了一眼屏幕……
“我說(shuō)團(tuán)團(tuán)啊。”程原痛苦地扶了扶額頭:“程序的主入口是main函數(shù),你寫(xiě)的這個(gè)mian函數(shù)是什么鬼啊。”
“哎呀,不好意思。”被稱為團(tuán)團(tuán)的妹子下意識(shí)地吐了吐舌頭,隨后她用兩根手指飛快地敲擊了幾下鍵盤(pán),這下程序終于成功地運(yùn)行起來(lái)了。
“耶!我成功了,現(xiàn)在我也會(huì)寫(xiě)程序啦!”望著彈出窗口中顯示的一行文字,團(tuán)團(tuán)高興地握了握拳頭。
一旁的程原下意識(shí)地張了張口,但是他最終并沒(méi)有打擊妹子的積極性。雖然她寫(xiě)的只是一個(gè)最簡(jiǎn)單的菜鳥(niǎo)入門(mén)程序,但誰(shuí)還不是從菜鳥(niǎo)一步一步成長(zhǎng)起來(lái)的呢?
隨后,程原再次一推桌子,返回了自己的工位。不過(guò)還沒(méi)等他重新拿起筆記本,另一名同事就已經(jīng)帶著問(wèn)題屁顛屁顛地跑過(guò)來(lái)了。
“程遠(yuǎn)大佬,幫忙看一個(gè)問(wèn)題唄……”
好吧,程原只好再次動(dòng)身。
十秒鐘后,程原一臉無(wú)語(yǔ)地指著面前的幾行代碼道:“大熊啊,這個(gè)index我還可以理解,但是后邊的indey和indez是什么東西啊?”
被稱為大熊的漢子憨厚地張了張嘴:“x,y,z,沒(méi)問(wèn)題啊?”
程原:“……”
他感覺(jué)自己的肝在隱隱作痛。隨后,程原默默地調(diào)取了一點(diǎn)寶貴的信息點(diǎn),為自己施展了一個(gè)小型的治療術(shù)。
好說(shuō)歹說(shuō)勸服大熊修改了變量名稱的拼寫(xiě),程原還沒(méi)來(lái)得及松口氣,下一個(gè)問(wèn)題就找上了門(mén)。
“這行a[i++]+=++i+i+i++是誰(shuí)寫(xiě)的?”一看到面前的一串鬼畫(huà)符,程原就氣不打一處來(lái):“趕快換回正常人類的寫(xiě)法,這種東西以后沒(méi)人能看得懂。”
“這可是我想了好久才想出來(lái)的!”提問(wèn)的強(qiáng)子不服氣地回道:“看不懂的人說(shuō)明他水平不夠。”
面對(duì)強(qiáng)詞奪理的強(qiáng)子,程原本想批評(píng)他兩句,但想了想后還是忍住了:“在工作中,絕大部分時(shí)候都不要這樣寫(xiě)程序。代碼是用來(lái)實(shí)現(xiàn)功能的,不是用來(lái)讓你炫耀技巧的。”
“那我加上注釋說(shuō)明還不行么?”強(qiáng)子仍不死心,畢竟這行代碼中凝聚了他不少的“心血”。
“不好意思還是不行,這樣寫(xiě)會(huì)出問(wèn)題的。”程原無(wú)奈地扯過(guò)強(qiáng)子的鍵盤(pán),并在上面隨手敲了兩下,打開(kāi)了一個(gè)全是英文的網(wǎng)站:“你自己看看吧,jdk9前幾個(gè)月報(bào)出的問(wèn)題,你這個(gè)寫(xiě)法正好會(huì)觸發(fā)這個(gè)編譯器的Bug。”
聞言,強(qiáng)子連忙打開(kāi)了他寶貴的電子詞典,開(kāi)始一個(gè)單詞一個(gè)單詞地讀起了這個(gè)網(wǎng)頁(yè)中的內(nèi)容……半晌后他發(fā)出了一聲驚叫:“我的天!居然編譯器也會(huì)出問(wèn)題……大佬你是怎么發(fā)現(xiàn)這個(gè)的啊?”
程原無(wú)奈地聳了聳肩。這個(gè)問(wèn)題當(dāng)時(shí)在網(wǎng)絡(luò)上還是有一點(diǎn)討論熱度的,所以他自制的爬蟲(chóng)小程序自然不會(huì)放過(guò)將這條消息推送到他面前的機(jī)會(huì)。
“編譯器又是什么東西啊?”團(tuán)團(tuán)好奇地湊了過(guò)來(lái)。
程遠(yuǎn)微微地嘆了口氣。他本來(lái)想解釋說(shuō),編譯器是一種可以將程序轉(zhuǎn)換為程序的程序,但是很明顯地,這個(gè)說(shuō)法除了聽(tīng)上去很高端以外,它并不能對(duì)菜鳥(niǎo)妹子產(chǎn)生一點(diǎn)點(diǎn)的幫助。
所以,程原想了想后說(shuō)道:“編譯器……它就像是程序界中的‘翻譯’。”
“翻譯?”團(tuán)團(tuán)好奇地問(wèn)道:“它可以將什么翻譯成什么呢?”
“什么都可以。”程原一邊考慮著適合的措辭一邊回答道:“不過(guò)一般來(lái)說(shuō)的話,我們會(huì)使用它將平時(shí)編寫(xiě)的代碼翻譯成機(jī)器能夠看懂的二進(jìn)制指令……”
程遠(yuǎn)緩緩地講著,他的思緒漸漸飄遠(yuǎn)。
——
最開(kāi)始,人們?cè)谟?jì)算時(shí),只是使用手指,繩結(jié)和石頭。后來(lái),人們發(fā)明了簡(jiǎn)單的算盤(pán)和復(fù)雜的齒輪,幫助數(shù)學(xué)家們進(jìn)行各種各樣的運(yùn)算。
然而,齒輪的轉(zhuǎn)動(dòng)速度是緩慢的,人們的加工精度是有限的。當(dāng)需要處理復(fù)雜的運(yùn)算時(shí),即使是最好的工匠也沒(méi)辦法加工出滿足要求的齒輪,地球位面史上,曾經(jīng)的一位“機(jī)械計(jì)算機(jī)”發(fā)明者就因此抱憾而終。
然而后來(lái),人們發(fā)現(xiàn),如果使用一些特定的工藝,對(duì)一些被稱為“半導(dǎo)體”的材料進(jìn)行加工的話,就可以在其中產(chǎn)生一種被稱為“PN結(jié)”的結(jié)構(gòu)。
當(dāng)然,不了解這個(gè)“PN結(jié)”的原理并不要緊,我們只需要知道,曾經(jīng)的人們使用這個(gè)PN結(jié),發(fā)明了二極管和三極管。
當(dāng)然,不了解二極管和三極管的原理也不要緊,我們只需要知道,曾經(jīng)的人們使用二極管和三極管,組合出了與或非等邏輯門(mén)電路。
當(dāng)然,不了解邏輯門(mén)的原理也不要緊,我們只需要知道,工程師們使用一個(gè)個(gè)的邏輯門(mén),制作出了各種各樣的芯片。這些芯片中,有的能夠進(jìn)行加減運(yùn)算,有的能夠進(jìn)行乘除,有的能夠?qū)斎氲男盘?hào)進(jìn)行判斷……
雖然,這些芯片只能使用一串串的高低電壓,或者說(shuō)二進(jìn)制的“0”和“1”作為輸入與輸出,但是這就足夠了。
終于有一天,工程師們發(fā)明了這樣的一種芯片:
它可以接收最少兩個(gè)二進(jìn)制數(shù)字,一個(gè)“操作指令類型”的信號(hào),并輸出一個(gè)數(shù)字。
如果這個(gè)“操作指令”是加法,那么這個(gè)芯片便對(duì)接收的兩個(gè)數(shù)字進(jìn)行加法運(yùn)算,并輸出計(jì)算結(jié)果。
如果這個(gè)“操作指令”是乘法,那么這個(gè)芯片便對(duì)接收的兩個(gè)數(shù)字進(jìn)行乘法運(yùn)算,并輸出計(jì)算結(jié)果。
如果這個(gè)“操作指令”是比較大小,那么這個(gè)芯片便返回兩個(gè)數(shù)字的比較結(jié)果……
工程師們?yōu)檫@個(gè)芯片設(shè)計(jì)了幾十上百種可以支持的操作指令。除此之外,工程師們還在這個(gè)芯片的旁邊安裝了各種各樣的,由電容或者磁鐵粉制作而成的“存儲(chǔ)器”,這些存儲(chǔ)器可以為芯片提供輸入信號(hào),或者存儲(chǔ)芯片輸出的數(shù)值。
隨后,工程師們開(kāi)始在紙帶上打孔。紙帶上的每一段,都對(duì)應(yīng)著芯片需要執(zhí)行的一行指令。
最終,整個(gè)系統(tǒng)被組合。一條條紙帶從識(shí)別孔洞的機(jī)器中劃過(guò),一波波電脈沖忠實(shí)地將掃描到的指令存入存儲(chǔ)器。隨后,一個(gè)由信號(hào)構(gòu)成的“箭頭”便可以從第一條指令開(kāi)始,逐條地向芯片傳遞它所指向的指令。有時(shí),這個(gè)箭頭會(huì)聽(tīng)從芯片的命令,向前跳躍一段距離或是向后退兩步,或者在小范圍內(nèi)轉(zhuǎn)上幾圈……不過(guò)一般情況下,它都能夠到達(dá)最終的目的地。而在那時(shí),工程師們想要計(jì)算的復(fù)雜公式的運(yùn)算結(jié)果,已經(jīng)安安穩(wěn)穩(wěn)地躺在存儲(chǔ)器中了。
這個(gè)多功能的芯片,便是人們常說(shuō)的CPU,而那一摞摞能夠鋪滿整個(gè)地面的紙條,便是早期的計(jì)算機(jī)程序。
——
“大概的情況就是這樣吧。”程原一邊指著屏幕中的一行行如同天書(shū)一般的符號(hào)一邊介紹道:“但是,一般人很難看得懂CPU直接使用的機(jī)器指令。因此,人們發(fā)明了各種各樣的高級(jí)語(yǔ)言,然后再用編譯器將這些高級(jí)語(yǔ)言轉(zhuǎn)換為匯編指令和機(jī)器指令,這樣就方便得多啦。”
“原來(lái)如此。”團(tuán)團(tuán)似懂非懂:“那……編譯器是用什么語(yǔ)言寫(xiě)的呢?”
“嗯,現(xiàn)在的大部分語(yǔ)言的編譯器都是用‘C語(yǔ)言’寫(xiě)的。”程原想了想后,表情古怪地拋出了這樣的一個(gè)回答。
“那C語(yǔ)言的編譯器又是用什么語(yǔ)言寫(xiě)的呢?”一旁的大熊想了想后也提了一個(gè)問(wèn)題。
“C語(yǔ)言的編譯器是用C語(yǔ)言寫(xiě)的。”程原滿意地笑了笑,果然有人跳坑了。
“啊?可是沒(méi)有編譯器就翻譯不了C語(yǔ)言,沒(méi)有C語(yǔ)言就寫(xiě)不了編譯器……”旁聽(tīng)的幾人陷入了混亂當(dāng)中。
“恭喜你們成功領(lǐng)悟了遞歸。”程原得意地回道,這下他的心情終于平復(fù)了一些。
隨后,他一臉滿足地坐回了自己的位置上。不過(guò)還沒(méi)等他得意多久,他便感覺(jué)到一道目光從隔壁投射而來(lái)。程原不自覺(jué)地縮了縮脖子,并開(kāi)始了下意識(shí)的左顧右盼。
十秒鐘后。
“好吧好吧,揭曉謎底。”在那道目光的注視下,程原最終還是繳械投降了:“最早的、最簡(jiǎn)單的編譯器是用匯編寫(xiě)的,而復(fù)雜一點(diǎn)的編譯器是用最簡(jiǎn)單的編譯器生成的,復(fù)雜兩點(diǎn)的編譯器是用復(fù)雜一點(diǎn)的編譯器生成的,以此類推。”
這下,旁聽(tīng)的幾人終于擺出了一臉恍然大悟的表情。
而程原則趁機(jī)一臉無(wú)奈地望向了那道目光的主人:一名戴著眼鏡的,瘦小的文靜少女。
[于小魚(yú)同學(xué)啊,我沒(méi)做什么傷天害理的事啊。]程原用目光向少女示意道。
[誰(shuí)叫你欺負(fù)團(tuán)團(tuán)姐的,哼。]少女不客氣地白了他一眼。
[明明是你的團(tuán)團(tuán)姐先來(lái)欺負(fù)我的。]程原用目光叫屈道。
[不管,哼。]被稱為于小魚(yú)的少女再次遞給了程原一個(gè)鄙夷的眼神,隨后她又轉(zhuǎn)過(guò)頭去對(duì)著鍵盤(pán)敲敲打打了。
好吧,被發(fā)了壞人卡的程原只好一臉郁悶地坐回了自己的工位上,隨后他再次默默地打開(kāi)了手中的筆記本。
“剛才我整理到哪了……哦對(duì),程遠(yuǎn)那家伙陪著妹子去了小樹(shù)林,然后學(xué)了不少與‘程式’相關(guān)的知識(shí)回來(lái)。哎,真羨慕那個(gè)家伙還有人可以討論問(wèn)題,我就只能盼著身邊的幾只菜鳥(niǎo)早一點(diǎn)開(kāi)竅……好吧,小魚(yú)不算菜鳥(niǎo),但是不知道為什么,她總是拿眼神戳我啊!”
“哎,真是的。”程原越想越沮喪:“所以說(shuō)沒(méi)事不要做什么程序員,只能當(dāng)單身狗不說(shuō),就算天天為別人幫忙也會(huì)被鄙視!真是太過(guò)分了!”