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