【討論】C++程序員是否該掌握(wo)某種(zhong)匯(hui)編語言(yan)?
時間(jian):2010-09-13 來源:未知
導語:日前網絡上關于C++程序員是否應該對匯編語言有一定的掌握程度的問題討論比較激烈。反對的觀點大(da)(da)致有(you)幾點: 1.對于(yu)(yu)普通軟件開(kai)發(fa)人員(yuan)來(lai)講,關(guan)(guan)注于(yu)(yu)上層(ceng)(ceng)(ceng)實現,關(guan)(guan)注于(yu)(yu)功能和產(chan)品才(cai)是(shi)(shi)主要(yao),匯(hui)(hui)編也(ye)用不到(dao);2.很(hen)(hen)(hen)多(duo)(duo)(duo)的C++程(cheng)序(xu)員(yuan)不懂匯(hui)(hui)編,也(ye)成為了某(mou)公司某(mou)項目組主程(cheng)序(xu)、核心研發(fa),因(yin)此匯(hui)(hui)編可以不學不用;3.絕(jue)大(da)(da)多(duo)(duo)(duo)數(shu)C++程(cheng)序(xu)員(yuan)還(huan)是(shi)(shi)在做(zuo)上層(ceng)(ceng)(ceng)開(kai)發(fa),絕(jue)大(da)(da)多(duo)(duo)(duo)數(shu)項目也(ye)是(shi)(shi)上層(ceng)(ceng)(ceng)開(kai)發(fa),不了解(jie)底層(ceng)(ceng)(ceng)也(ye)能賺(zhuan)到(dao)大(da)(da)錢,而且是(shi)(shi)更(geng)多(duo)(duo)(duo)的錢;4.做(zuo)底層(ceng)(ceng)(ceng),比如:逆向、破解(jie)、寫病(bing)毒(du)等,很(hen)(hen)(hen)多(duo)(duo)(duo)致力于(yu)(yu)這層(ceng)(ceng)(ceng)的程(cheng)序(xu)員(yuan),感覺整天(tian)(tian)昏天(tian)(tian)暗地(di),無數(shu)的重復勞動也(ye)沒賺(zhuan)到(dao)大(da)(da)錢,覺得(de)沒意義;5.對于(yu)(yu)做(zuo)C#、Java、WEB等領(ling)域(yu)的程(cheng)序(xu)員(yuan)們,大(da)(da)多(duo)(duo)(duo)數(shu)不會去(qu)關(guan)(guan)注底層(ceng)(ceng)(ceng)實現,他(ta)們照樣(yang)過(guo)得(de)很(hen)(hen)(hen)好,以此類推,匯(hui)(hui)編也(ye)是(shi)(shi)可以不掌握的;6.匯(hui)(hui)編語(yu)(yu)言(yan)幾乎是(shi)(shi)不跨(kua)平臺的,于(yu)(yu)是(shi)(shi)就(jiu)算掌握了某(mou)個平臺的匯(hui)(hui)編,但在匯(hui)(hui)編語(yu)(yu)言(yan)上,例如語(yu)(yu)法、機制等還(huan)是(shi)(shi)有(you)局限性(xing)。
本文作(zuo)者作(zuo)為(wei)(wei)一(yi)名C++程(cheng)序員(yuan)也參與(yu)了討論。作(zuo)為(wei)(wei)站在(zai)支持一(yi)方,他就(jiu)上面幾(ji)種反對(dui)的觀點(dian)的看(kan)(kan)法(可以(yi)總體分(fen)為(wei)(wei)幾(ji)個關鍵點(dian):利益、收入和興(xing)趣)以(yi)及個人的體會分(fen)享了看(kan)(kan)法,有(you)一(yi)定參考價值。
以下是根據他(ta)的文章整(zheng)理而成的內容:
從上面幾種(zhong)反對的觀(guan)點(dian)來(lai)(lai)(lai)看(kan),可以(yi)(yi)總體(ti)分(fen)為(wei)幾個關(guan)鍵點(dian):利(li)益(yi)、收入和興(xing)趣。我不(bu)(bu)打算將這三個關(guan)鍵點(dian)分(fen)別進行針對性闡(chan)述,因為(wei)它們之間都是息息相關(guan)分(fen)不(bu)(bu)開的。對于利(li)益(yi)和收入上來(lai)(lai)(lai)講(jiang),的確是有很多(duo)公(gong)司的高(gao)職位且收入不(bu)(bu)錯(cuo)的程序員并不(bu)(bu)了解匯編和底層,這樣也不(bu)(bu)代(dai)表他們沒有能力,而(er)往往他們是非常有能力的人(ren)(ren)。這樣一來(lai)(lai)(lai)似(si)乎和我個人(ren)(ren)的支持類的觀(guan)點(dian)有所沖突,但(dan)我認為(wei)這個沖突可以(yi)(yi)用追求(qiu)二字來(lai)(lai)(lai)化解。為(wei)什么可以(yi)(yi)用追求(qiu)來(lai)(lai)(lai)化解呢?因為(wei)追求(qiu)可以(yi)(yi)是任(ren)何(he)領域(yu)、任(ren)何(he)方向、任(ren)何(he)目的和任(ren)何(he)標準的,因此(ci)也就是我前面所說的,歸結到根本(ben),掌(zhang)握(wo)(wo)不(bu)(bu)掌(zhang)握(wo)(wo)都沒有對錯(cuo)。
我們(men)(men)進入這個行業(ye),從事了編(bian)程(cheng)(cheng)工作(大(da)多數程(cheng)(cheng)序員都是編(bian)程(cheng)(cheng)開發做(zuo)起的)。我相信很(hen)多程(cheng)(cheng)序員的初(chu)衷,都是對(dui)編(bian)程(cheng)(cheng)開發有很(hen)大(da)的興趣,興趣驅使著我們(men)(men)熬夜,驅使著我們(men)(men)研究, 驅使著我們(men)(men)進步。對(dui)于C++程(cheng)(cheng)序員,我相信興趣占有很(hen)大(da)的比重。那(nei)么,我們(men)(men)來舉(ju)幾個例子:
你應(ying)該看過(guo)《深入C++對(dui)象模(mo)型》這本書(shu)(shu)吧,這是(shi)一(yi)本非(fei)常(chang)細致(zhi)和(he)(he)美妙的(de)(de)(de)書(shu)(shu),我想你應(ying)該有(you)這樣(yang)的(de)(de)(de)感受。那么在此(ci)基礎之上,你有(you)過(guo)更多的(de)(de)(de)思考(kao)嗎?這本書(shu)(shu)里都是(shi)以(yi)實例和(he)(he)理論來進(jin)行(xing)講解(jie)的(de)(de)(de),實例是(shi)以(yi)C++語言進(jin)行(xing)描述(shu)的(de)(de)(de)。于是(shi)你是(shi)否有(you)想知道在具體的(de)(de)(de)編譯器和(he)(he)平臺下的(de)(de)(de)這樣(yang)一(yi)些疑問:
1.this指針是怎(zen)么傳遞進成(cheng)員(yuan)(yuan)函數的?成(cheng)員(yuan)(yuan)函數和(he)(he)普(pu)通函數以及靜態成(cheng)員(yuan)(yuan)函數有何區別和(he)(he)聯系(xi)?
2.透過語(yu)法,成(cheng)員(yuan)函數和類在內存中有什么聯(lian)系?對象和成(cheng)員(yuan)函數有何(he)種聯(lian)系?
3.函(han)數間(jian)的調用原理,是怎么(me)實現的?
4.__cdecl、__stdcall、__thiscall和(he)__fastcall這幾種函數調用方式,在本質上(shang)有什么(me)區別?具體(ti)是(shi)怎(zen)么(me)實現的?
5.虛函數(shu)、多態和繼(ji)承在本(ben)質上的體現,以及這些機制在底層是怎么(me)實現的?
除(chu)此(ci)之外(wai),你(ni)在學習(xi)和(he)使(shi)用(yong)C++的(de)時候(hou),我想(xiang)你(ni)還會在乎一(yi)些細節,例如:
1).遞歸函數(shu)一(yi)定(ding)會導致低效?編譯器針對遞歸函數(shu)會不(bu)會有什(shen)么樣的優化?你怎么知道這些優化細節(jie)?
2).對于(yu)這句(ju)代碼:int b = a > 0 ? 100 : 200; // int a; 編譯(yi)器會有(you)什么細節(jie)上的(de)優化?這句(ju)代碼會有(you)比較并跳轉的(de)過程嗎?
3).對于(yu)這(zhe)樣的代碼:
view plaincopy to clipboardprint?
1.#include <stdio.h>
2.int a = 10;
3.int main( void )
4.{
5. printf( "%d", a );
6. return 0;
7.}
在VC下,開啟全(quan)局(ju)優化,全(quan)局(ju)變量a還存在嗎?你怎么通過本(ben)質的論證(zheng)來證(zheng)明?
4).對(dui)于:float a = 100; int b = a / 30; 在(zai)VC下,你會(hui)(hui)不會(hui)(hui)懷疑這兩句代碼背后會(hui)(hui)存在(zai)函(han)數調用(yong)?如果有,調用(yong)了(le)什么(me)函(han)數?為什么(me)?
5).對(dui)于__declspec( thread ) int g_nNum = 0; 你知道g_nNum++;這(zhe)句代碼(ma)背后的具體實現機(ji)制嗎?
6).對于調試,你會怎么根據自己記(ji)錄的(de)程序崩潰時的(de)堆棧現場及其它信息(xi)來錯誤跟蹤查找呢(ni)?
7).對于開發游戲(xi)來說,你怎(zen)么(me)(me)知道外掛是怎(zen)么(me)(me)修改(gai)游戲(xi)程序的,修改(gai)了哪個地(di)方呢?
8).你要怎么(me)(me)熟悉編譯器的優化細節,怎么(me)(me)寫出適應它(ta)的代(dai)碼,怎么(me)(me)寫出比它(ta)優化得更好(hao)的代(dai)碼?
還有很多(duo)這(zhe)樣(yang)上層(ceng)開(kai)(kai)(kai)發(fa)的(de)例(li)子,這(zhe)里就不一(yi)一(yi)列(lie)舉了。從上面列(lie)舉的(de)這(zhe)些(xie)疑問(wen),我(wo)(wo)想作(zuo)為(wei)一(yi)名C++程序(xu)(xu)員(yuan),熱(re)愛編(bian)(bian)程開(kai)(kai)(kai)發(fa)的(de)程序(xu)(xu)員(yuan)來講(jiang)(jiang),你都想知道其中的(de)原委。作(zuo)為(wei)上層(ceng)開(kai)(kai)(kai)發(fa)者,是應該(gai)關注上層(ceng)的(de)功能(neng)開(kai)(kai)(kai)發(fa)和產品(pin)方面的(de)東西。但(dan)是我(wo)(wo)個人(ren)覺(jue)得,本(ben)著(zhu)技術,本(ben)著(zhu)這(zhe)份(fen)熱(re)愛,本(ben)著(zhu)自(zi)身的(de)技術發(fa)展,了解更底層(ceng)一(yi)些(xie),有助于上層(ceng)開(kai)(kai)(kai)發(fa)的(de)通(tong)透性,以(yi)(yi)及全局的(de)掌控力度。從我(wo)(wo)個人(ren)的(de)感受來講(jiang)(jiang),當把握了關鍵細(xi)節(jie)(jie)以(yi)(yi)及全局設計(ji)之(zhi)后,任何地方出了問(wen)題,都能(neng)很及時的(de)反應并予以(yi)(yi)追查和處理(li)(li)。在(zai)當前的(de)編(bian)(bian)譯器技術上,已經非常(chang)強(qiang)大(da)了,很多(duo)細(xi)節(jie)(jie)可以(yi)(yi)放(fang)心的(de)交給(gei)編(bian)(bian)譯器來優化和處理(li)(li)。但(dan)是我(wo)(wo)想,編(bian)(bian)譯器不是萬(wan)能(neng)的(de),人(ren)才是智能(neng)的(de)。掌握不是必然(ran),但(dan)掌握了會(hui)更好。
對于(yu)初學(xue)者乃(nai)至工作了(le)一定時間的(de)(de)程(cheng)序(xu)(xu)(xu)員,對于(yu)C++,很多處(chu)于(yu)C++語(yu)(yu)法(fa)的(de)(de)層面,在(zai)語(yu)(yu)法(fa)上(shang)的(de)(de)條條款(kuan)款(kuan)使用得(de)得(de)心應手,問其本質,可能就缺(que)乏一二了(le)。我個人(ren)的(de)(de)經歷來看(kan),在(zai)掌握語(yu)(yu)法(fa)之后,在(zai)向下(xia)關注一下(xia)語(yu)(yu)法(fa)背后的(de)(de)具體實現,會通透(tou)很多。你會在(zai)內存(cun)上(shang)、數(shu)據上(shang)和程(cheng)序(xu)(xu)(xu)的(de)(de)各種底層運行機制上(shang)會有(you)深刻(ke)的(de)(de)認識。這也就是為(wei)什么去海邊(bian)玩兒,還(huan)要潛水去看(kan)看(kan)海底世界。錯過(guo)了(le)海底,你會失去很多精(jing)彩,而這些精(jing)彩我想(xiang)也是作為(wei)程(cheng)序(xu)(xu)(xu)員應有(you)的(de)(de)追(zhui)求之一。
對(dui)于(yu)Java、C#以(yi)及WEB類(lei)領域的(de)(de)(de)程(cheng)序(xu)員(yuan),我(wo)想(xiang)匯編可(ke)能相對(dui)遙遠一(yi)些(xie)。在這方(fang)面(mian)(mian)的(de)(de)(de)關注(zhu)也(ye)會相對(dui)少一(yi)些(xie),但結(jie)合前(qian)面(mian)(mian)的(de)(de)(de)觀點,作(zuo)(zuo)為(wei)(wei)程(cheng)序(xu)員(yuan)這個角色,都是讓(rang)自己的(de)(de)(de)程(cheng)序(xu)在機器上面(mian)(mian)跑起來(lai),那(nei)(nei)么我(wo)想(xiang)這之間的(de)(de)(de)諸多底(di)層的(de)(de)(de)疑問(wen)可(ke)以(yi)作(zuo)(zuo)為(wei)(wei)程(cheng)序(xu)員(yuan)的(de)(de)(de)一(yi)種(zhong)興趣來(lai)研究(jiu)。目的(de)(de)(de)也(ye)是為(wei)(wei)了讓(rang)自己更通透(tou),更熟悉自己的(de)(de)(de)平臺。我(wo)不知道(dao)怎么表達通透(tou)二字,就(jiu)(jiu)我(wo)個人的(de)(de)(de)感(gan)(gan)受(shou)就(jiu)(jiu)是,能夠從(cong)現(xian)象聯系到本(ben)質(zhi)實(shi)現(xian),并且(qie)能夠從(cong)本(ben)質(zhi)實(shi)現(xian)勾(gou)勒(le)出一(yi)幅很(hen)清晰生動的(de)(de)(de)圖像在腦(nao)子里(li),一(yi)切都一(yi)目了然盡收(shou)眼(yan)底(di)。有點居高臨下(xia),望長城內外,惟余莽(mang)莽(mang)的(de)(de)(de)那(nei)(nei)種(zhong)寬(kuan)廣(guang)的(de)(de)(de)感(gan)(gan)觸。
對(dui)(dui)于本(ben)身就處(chu)于底(di)層開發(fa)的(de)(de)程(cheng)序員來(lai)說,無可(ke)厚非(fei),掌(zhang)握(wo)匯編就是(shi)(shi)必須(xu)的(de)(de)了(le)。但(dan)是(shi)(shi)澄清一(yi)點,本(ben)文的(de)(de)觀(guan)點更多的(de)(de)是(shi)(shi)從興趣和(he)通(tong)透(tou)性(xing)上(shang)出發(fa),對(dui)(dui)于底(di)層開發(fa)者(zhe)可(ke)能會覺得(de)底(di)層有(you)一(yi)定的(de)(de)枯燥,特別是(shi)(shi)整(zheng)天破(po)解(jie)、逆(ni)向等工作,非(fei)常多的(de)(de)體力活(huo),從我幾年(nian)的(de)(de)業余破(po)解(jie)和(he)逆(ni)向經(jing)驗來(lai)看的(de)(de)確是(shi)(shi)這樣的(de)(de)。但(dan)是(shi)(shi)我覺得(de),破(po)解(jie)和(he)逆(ni)向只是(shi)(shi)領域之一(yi),我之所以破(po)解(jie)和(he)逆(ni)向,很多時候(hou)是(shi)(shi)處(chu)于興趣和(he)為了(le)對(dui)(dui)上(shang)層進行更本(ben)質和(he)合(he)理(li)的(de)(de)解(jie)釋。所以,上(shang)層和(he)底(di)層結合(he),才(cai)是(shi)(shi)我的(de)(de)根本(ben)目的(de)(de),也是(shi)(shi)本(ben)文想推崇(chong)的(de)(de)一(yi)種思路(lu)。
綜上所述,我的觀點是C++程序(xu)員乃至(zhi)程序(xu)員,不管是作(zuo)為興趣還是工作(zuo),掌(zhang)握或者了解一(yi)下(xia)匯編(bian)都是有一(yi)定必(bi)要的,但不是強(qiang)制性(xing)的,也正所謂需求(qiu)和追(zhui)求(qiu)不盡相(xiang)同罷了。因(yin)此,不要問別人到底(di)是否應該關注(zhu)一(yi)下(xia)底(di)層,掌(zhang)握一(yi)下(xia)某種匯編(bian)語言,答(da)案很明(ming)顯(xian)。

