想成為編程高手,一定要學(xué)匯編嗎?
匯編語(yǔ)言這門(mén)課, 是我大學(xué)的一段灰色記憶。
有很長(zhǎng)一段時(shí)間,我都搞不明白為什么匯編語(yǔ)言中有各種各樣的尋址方式 , 還有為什么叫立即數(shù)呢? 它明明就是一個(gè)數(shù)字啊,起個(gè)這么古怪的名稱(chēng)。
老師布置的作業(yè)也不復(fù)雜, 例如用匯編控制主板的喇叭發(fā)聲, 在屏幕上輸出白底藍(lán)色字、綠底白色字、紅底黑色字..... 我都做得非常辛苦, 沒(méi)記錯(cuò)的話還經(jīng)常抄同班張同學(xué)的作業(yè)。
所以我一直對(duì)能用匯編語(yǔ)言編程的人充滿了敬仰和帶點(diǎn)兒嫉妒的敬畏, 尤其是聽(tīng)說(shuō)求伯君竟然用匯編寫(xiě)出了WPS! Ken Thompson、Dennis Ritchie 居然用匯編寫(xiě)出操作系統(tǒng)Unix! 只能是一聲嘆息,人和人的差距真是大啊。
畢業(yè)后對(duì)操作系統(tǒng)癡迷,去看MINIX的源代碼,一開(kāi)頭就被嚇住了,在bootstrap階段竟然是通篇的匯編! 在后悔為什么大學(xué)沒(méi)有好好學(xué)的同時(shí), 我還特別又買(mǎi)了一本匯編的書(shū)《80X86匯編語(yǔ)言程序設(shè)計(jì)教程》, 準(zhǔn)備把匯編撿起來(lái)。
艱苦地復(fù)習(xí)了一段時(shí)間就明白了一點(diǎn), 操作系統(tǒng)用到的匯編其實(shí)和CPU密切相關(guān),什么實(shí)模式、保護(hù)模式, GDT, LDT,數(shù)據(jù)段,代碼段......這些Intel CPU的概念如果沒(méi)搞明白, 根本不可能讀懂操作系統(tǒng)的啟動(dòng)過(guò)程。
那時(shí)候網(wǎng)絡(luò)上資料很少, 不像現(xiàn)在這么信息爆炸, 我孤獨(dú)的在Minix的世界中掙扎了一段時(shí)間就放棄了, 我也許不是搞系統(tǒng)編程的那塊料, 從此走向應(yīng)用層編程之路。
米國(guó)那些早期的程序員很幸福, 他們隨著計(jì)算機(jī)的發(fā)展而不斷前進(jìn),經(jīng)歷了完整的從底層編程到高層編程的全過(guò)程。 最開(kāi)始的時(shí)候就是直接對(duì)硬件編程, 例如比爾蓋茨和保羅艾倫就是直接用匯編在牽牛星電腦上寫(xiě)B(tài)asic的解釋器, 那批程序員對(duì)硬件和底層的理解是非常的透徹。
雖然我是屬于從入門(mén)到放棄類(lèi)型, 但是能深切的體會(huì)到學(xué)習(xí)匯編的好處: 匯編和最底層的硬件打交道( 注意是硬件啊) , 所以學(xué)習(xí)匯編能對(duì)計(jì)算機(jī)的運(yùn)行機(jī)制有個(gè)透徹的了解:
什么是寄存器
程序在內(nèi)存和CPU中是怎么折騰的
CPU是如何訪問(wèn)內(nèi)存的
程序的分段
機(jī)器層面如何實(shí)現(xiàn)函數(shù)調(diào)用(理解緩沖區(qū)溢出攻擊的基礎(chǔ))
中斷及其處理
......
有了這些知識(shí),肯定對(duì)馮諾依曼計(jì)算機(jī)有了深刻認(rèn)識(shí)。
而這些知識(shí)又構(gòu)成了操作系統(tǒng)的基礎(chǔ), 有了這些基礎(chǔ),理解進(jìn)程/線程的概念,同步和互斥,以及他們的實(shí)現(xiàn)就非常容易,還有虛擬內(nèi)存、文件系統(tǒng)、 I/O 等等。
并不是說(shuō)必須學(xué)了匯編才能理解操作系統(tǒng),而是說(shuō)看問(wèn)題的深度不一樣。 有了匯編的保駕護(hù)航, 你可以在頭腦中建立起一個(gè)有更多細(xì)節(jié),更多實(shí)現(xiàn)的計(jì)算機(jī), 那些概念不是模糊的,而是清晰的、鮮活的。
操作系統(tǒng)的運(yùn)行原理, 絕對(duì)是程序員受益一生的知識(shí)。 比如說(shuō)后端編程,不了解OS的進(jìn)程、線程、 頁(yè)面緩存,文件系統(tǒng),I/O 就去大談如何實(shí)現(xiàn)一個(gè)高并發(fā)、大數(shù)據(jù)量的網(wǎng)站簡(jiǎn)直就是笑話。
再比如對(duì)JVM的學(xué)習(xí), 如果你懂得匯編, 看到JVM的字節(jié)碼、看到棧幀就會(huì)覺(jué)得很親切,只需要把基于寄存器的計(jì)算方式轉(zhuǎn)換成基于棧的計(jì)算方式就可以了。
我們的計(jì)算機(jī)知識(shí)就像一座金字塔, 底層是數(shù)學(xué), 上面是數(shù)字電路,然后是匯編,再往上是操作系統(tǒng)、網(wǎng)絡(luò),數(shù)據(jù)庫(kù)、高級(jí)編程語(yǔ)言、框架等等......
我們每個(gè)人不可能精通這個(gè)金子塔的每一層, 但是要掌握、理解構(gòu)成這個(gè)金字塔的核心概念。
在應(yīng)用層編程, 不一定要掌握匯編, 但是掌握匯編能讓我們更透徹的看待我們賴以為生的虛擬世界 , 沒(méi)錯(cuò), 你要想成為黑客帝國(guó)中的Neo, 匯編必須得學(xué)。
我有時(shí)候會(huì)胡思亂想: 如果這個(gè)編程世界根本沒(méi)有什么Java, Python, C++, Javascript , PHP, 只有匯編這么一種語(yǔ)言, 像 Rod Johnson(Spring之父), DHH(Ruby on Rail之父) , Eric Gamma (JUnit, Eclipse) , Gavin King(Hibernate之父) 這些在應(yīng)用層編程的大牛們, 他們用匯編寫(xiě)程序會(huì)是什么樣子? 他們會(huì)創(chuàng)造出什么東西出來(lái)?
我想有一點(diǎn)是肯定的: 即使是使用匯編,他們的編程技能仍然會(huì)毫不留情的把我碾壓成渣渣。 原因很簡(jiǎn)單, 一個(gè)駕馭過(guò)復(fù)雜系統(tǒng)的人,他的邏輯思維能力肯定是強(qiáng)悍無(wú)比的, 匯編只是讓他換了一個(gè)工具而已。
更可怕的是由于軟件極難編寫(xiě), 只有一幫大牛才有資格編程,才能成為程序員, 像我這樣資質(zhì)平庸者估計(jì)只能去搬磚吧。
所以感謝這個(gè)時(shí)代,有這么多語(yǔ)言讓我選擇,不用被大牛碾壓,還可以靠編程過(guò)活。
【本文為51CTO專(zhuān)欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】