學(xué)習(xí)Java虛擬機(jī)沒(méi)用? 聽(tīng)聽(tīng)當(dāng)事人是怎么說(shuō)的!
我是大名鼎鼎的Java 虛擬機(jī), 據(jù)說(shuō)這個(gè)星球上每天有900多萬(wàn)程序員和我打交道,這真是一個(gè)驚人的數(shù)字。 這900多萬(wàn)人中不少人對(duì)我的技術(shù)內(nèi)幕非常感興趣, 有事兒沒(méi)事兒都要把我“大卸八塊”, 深入了解一下。甚至還有人從我的出生地--源代碼--開(kāi)始看起,弄得人家連一點(diǎn)隱私都沒(méi)有了。
當(dāng)然也有很多人對(duì)我的運(yùn)行機(jī)理愛(ài)理不理, 理由很簡(jiǎn)單: Java虛擬機(jī)相關(guān)的事情只有在面試時(shí)才會(huì)問(wèn)道,背誦一下那些垃圾回收算法,應(yīng)付過(guò)去就可以了!
真的是這樣嗎? 面試官為什么喜歡問(wèn)JVM原理? 難道他們沒(méi)什么可問(wèn)的了? 或者是只是為了展示他們的卓爾不群? 高人一等?壓你一頭?
我想都不是, 請(qǐng)注意一下我的名字: Java虛擬機(jī), 我是一個(gè)虛擬機(jī)??!
雖然不是像VMWare, VirtualBox那樣可以完全虛擬出一個(gè)包括內(nèi)存,硬盤,CPU的硬件計(jì)算機(jī)出來(lái), 我至少也是個(gè)Soft CPU啊, 有自己的指令集,有自己獨(dú)有的可執(zhí)行文件格式, 有自己獨(dú)特的基于棧而不是寄存器的執(zhí)行方式,還有那久經(jīng)考驗(yàn)的垃圾回收機(jī)制......
作為一個(gè)口口聲聲說(shuō)熱愛(ài)編程,立志有寫(xiě)出偉大軟件來(lái)改變世界的程序員, 少年, 難道你竟然對(duì)這么有趣的東西視而不見(jiàn)?
對(duì)軟件技術(shù)的好奇心是你最終成為偉大程序員的第一驅(qū)動(dòng)力, 如果你對(duì)技術(shù)不愿意深究, 不愿意了解背后的原理,如果你不愿意像一個(gè)調(diào)皮搗蛋的熊孩子那樣把一個(gè)玩具變成零件,然后再組裝起來(lái)(嗯, 實(shí)際上永遠(yuǎn)都組裝不起來(lái)了) , 我真的懷疑你在這個(gè)行業(yè)能呆多久,走多遠(yuǎn)。
我剛才提到了有趣, 那真的有用嗎?
表面上看是沒(méi)有用處的,至少短期看來(lái)是沒(méi)有用處的, 你寫(xiě)程序,運(yùn)行程序,然后吃飯,睡覺(jué)。
管你什么基于棧的虛擬機(jī),什么方法區(qū),堆, 垃圾回收, 生活很美好,世界也很大, 我想去看看, 不要用這些煩心事來(lái)煩我。
如果你想一直生活在軟件開(kāi)發(fā)的表層, 那肯定是沒(méi)有問(wèn)題的, 如果你想像Neo那樣,把這個(gè)世界看個(gè)清清楚楚,明明白白,真真切切, 就需要修煉一下內(nèi)力, 做為Java 程序員, 理解Java虛擬機(jī)就是那個(gè)扎馬步的基本功。
舉個(gè)例子, 理解Class 文件格式, 就能理解ASM是怎么在運(yùn)行時(shí)“艱難的”動(dòng)態(tài)生成字節(jié)碼的, 然后就會(huì)知道CGLib是怎么改善它, 讓它容易使用的。 而CGLib可是Spring AOP賴以生存的一大基礎(chǔ)啊。 這一路走來(lái),是不是對(duì)AOP的理解更加透徹了?
你腦海中甚至能想象出來(lái)字節(jié)碼怎么被動(dòng)態(tài)的創(chuàng)建,被Classloader 加載, 形成新的Class, 然后對(duì)你的業(yè)務(wù)類進(jìn)行攔截的過(guò)程。
看透世界的感覺(jué)不要太爽, 如果你非要說(shuō)我會(huì)用Spring 的AOP就行了, 那我也沒(méi)辦法, 人各有志嘛。
擴(kuò)展一下, 現(xiàn)在我的家中上入住了不少動(dòng)態(tài)語(yǔ)言, Jython, JRuby , Clojure , Scala 等等, 他們可都需要?jiǎng)討B(tài)的生成字節(jié)碼來(lái)運(yùn)行啊(碼農(nóng)翻身備注: Scala 也可以直接編譯成class 文件), 你看看理解了Class 文件格式得有多大的好處。
還有啊, 理解了一些重要的字節(jié)碼指令以后,你就會(huì)知道所謂的面向?qū)ο螅?尤其是你寫(xiě)的那些個(gè)漂亮的OO代碼, 在我這里已經(jīng)“退化”成函數(shù)調(diào)用了, 不知道你會(huì)不會(huì)沮喪, 但是沒(méi)有辦法, 咱們計(jì)算機(jī)的本質(zhì)就是這樣,順序,循環(huán),分支, 函數(shù)調(diào)用。 作為補(bǔ)償, 我會(huì)讓你了解多態(tài)的秘密, 這可是很多面向?qū)ο笳Z(yǔ)言的基礎(chǔ)。
說(shuō)到函數(shù)調(diào)用, 你寫(xiě)的Java程序在運(yùn)行時(shí)會(huì)形成的棧幀, 這可真是一個(gè)超級(jí)重要的概念, 不僅在我這里有,物理CPU和內(nèi)存在運(yùn)行本地代碼的時(shí)候也有,雖然我和他們的結(jié)構(gòu)不同, 但都是為了完成一個(gè)目的: 表達(dá)一個(gè)函數(shù)在運(yùn)行時(shí)的結(jié)構(gòu)。
了解了這個(gè)家伙, 你就知道函數(shù)在機(jī)器級(jí)是怎么調(diào)用的, 參數(shù)是怎么傳遞的, 遞歸是怎么回事, 尾遞歸是怎么回事(我竟然不支持!) 。 也許你會(huì)跑去看看匯編, 去看看緩沖區(qū)溢出攻擊, 各種知識(shí)點(diǎn)開(kāi)始連接,形成一張大網(wǎng),這種感覺(jué)是極爽的。
這樣的例子我還可以舉出很多,但是估計(jì)很多人已經(jīng)不耐煩了,就此打住。
你們?nèi)祟愓f(shuō)計(jì)算機(jī)是門科學(xué), 但是科學(xué)的成分在哪里呢? 在我看來(lái)更像一門工程或者技術(shù), 核心的基礎(chǔ)概念真的不多, 花點(diǎn)功夫把他們掌握了,受益終生。
前些天我偷偷地閱讀了你們的小說(shuō)《天龍八部》, 里邊的掃地僧可真是厲害, 輕輕松松就把慕容博和蕭遠(yuǎn)山兩位絕頂高手制得服服帖帖,老老實(shí)實(shí), 這說(shuō)明的什么問(wèn)題? 內(nèi)功的修煉真是很重要啊。
【本文為51CTO專欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】