日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
C老頭和Java小子的硬盤(pán)夜話

這是一個(gè)程序員的電腦硬盤(pán), 在一個(gè)叫做“學(xué)習(xí)”的目錄下有兩個(gè)小程序, 一個(gè)叫做Hello.java , 另外一個(gè)叫做hello.c 。

Hello.java 自視甚高,有點(diǎn)看不起老派的hello.c , 經(jīng)常叫他“C老頭”。

這hello.c 也瞧不起“囂張”的 java 程序, 也給他起來(lái)一個(gè)外號(hào): “Java 小子”。

但是這個(gè)目錄下沒(méi)有其他人, 每天深夜,主人睡去以后就是無(wú)邊的黑暗和無(wú)盡的孤獨(dú), 盡管互相看不順眼, C老頭和Java小子還是得聊聊天解悶。

“C老頭兒, 我聽(tīng)說(shuō)你們C語(yǔ)言在誕生的時(shí)候也是以可移植性著稱(chēng)?” Java 小子率先發(fā)難,充分發(fā)揮了中國(guó)人話里有話,笑里藏刀的特點(diǎn)??梢浦残允荍ava最引以為傲的亮點(diǎn), 編寫(xiě)一次,處處運(yùn)行可不是說(shuō)著玩的, 他決定以己之長(zhǎng)攻彼之短,先給C老頭挖個(gè)坑, 等他入坑后再羞辱他一番。

“哪里哪里, 我們可比不上你們Java ” 沒(méi)想到C老頭竟然不跳坑, Java 小子的招數(shù)被化于無(wú)形。

“那你們?cè)趺刺?hào)稱(chēng)移植性好啊,難道在Windows平臺(tái)上開(kāi)發(fā)的程序能運(yùn)行在Linux上?” Java小子心有不甘,繼續(xù)窮追不舍。

“我們那是代碼的可移植性,不是程序的可移植性,比方說(shuō)吧, 像我這個(gè)hello.c 可以在windows上編譯運(yùn)行, 也可以在Linux上編譯運(yùn)行, 完全不用修改代碼。 ”

Java 小子感到很吃驚, 這是一次編寫(xiě)到處編譯啊, 好像不比自己差啊。 他覺(jué)得有點(diǎn)沮喪,看來(lái)這一板斧砍不下去了。

可是轉(zhuǎn)念一想, hello.c只是個(gè)非常簡(jiǎn)單的程序,像Windows、Linux上都有他的編譯器和標(biāo)準(zhǔn)程序庫(kù), 那肯定可以移植了, 要是使用了系統(tǒng)平臺(tái)的接口了呢?

“你要是調(diào)用了Windows平臺(tái)的API,例如創(chuàng)建一個(gè)線程,拿到Linux上怎么辦?”

“那我們C語(yǔ)言就用條件編譯” C老頭早就料到Java小子會(huì)這么問(wèn)。

“哈哈,有沒(méi)有搞錯(cuò), 這么麻煩啊,源代碼中這么多古怪的#ifdef, 程序員們還不累死。 ” Java小子終于抓住了把柄。

“這已經(jīng)很不錯(cuò)了,在我們C語(yǔ)言剛剛誕生的時(shí)候, 可是上個(gè)世紀(jì)70年代, 根本沒(méi)有什么Java虛擬機(jī)之說(shuō), 沒(méi)有什么抽象層能屏蔽底層的平臺(tái)API, 可不得辛苦程序員?” C老頭說(shuō)得很客觀,Java 小子的囂張的氣焰消失了大半。

“那C語(yǔ)言怎么不與時(shí)俱進(jìn),也搞個(gè)虛擬機(jī)啊” Java 小子異想天開(kāi)。

“這你就不懂了, C語(yǔ)言生來(lái)就是做系統(tǒng)級(jí)編程的,就是要貼近硬件,追求性能和效率,弄個(gè)虛擬機(jī),我怎么去直接操作內(nèi)存? 和硬件交互? 對(duì)了,我們可以用指針可以直接操作內(nèi)存,效率極高, 你的Java就不行了吧”

“Java 當(dāng)然沒(méi)有指針了, 那玩意兒太容易出錯(cuò),也容易出現(xiàn)漏洞, 我們的James Gosling老爹就禁止我們直接操作內(nèi)存。”

“我們C語(yǔ)言一旦編譯鏈接以后,就成為一個(gè)可以獨(dú)立執(zhí)行的程序了, 而你呢,只是變成一個(gè)Hello.class 而已,沒(méi)有虛擬機(jī), 你都運(yùn)行不了, 說(shuō)得難聽(tīng)一點(diǎn), 就是一個(gè)寄生蟲(chóng)啊。” Java 老頭不動(dòng)聲色,開(kāi)始組織反擊。

Java 表示無(wú)言以對(duì)。

“還有啊, 我的hello.exe一旦運(yùn)行, 那就是一個(gè)獨(dú)立的進(jìn)程,擁有一個(gè)獨(dú)立的地址空間,被CPU獨(dú)立調(diào)度; 而你的Hello.class 什么都不是, Java虛擬機(jī)(java.exe)才是一個(gè)進(jìn)程,Hello.class 被裝載以后只能在這個(gè)進(jìn)程里作為一個(gè)線程來(lái)運(yùn)行, 生活的空間也就是什么方法區(qū)、堆..... 這境界也差得太遠(yuǎn)了吧”

姜還是老的辣, C老頭招招致命。

"等等, 你剛才說(shuō)了一個(gè)什么詞來(lái)著,鏈接?這是什么鬼東西?" Java 小子抓住了一根稻草。

“鏈接你都不懂? 真夠老土的, 趕緊去看看《深入理解計(jì)算機(jī)系統(tǒng)》第7章吧。 簡(jiǎn)單來(lái)說(shuō)是把一個(gè)符號(hào)和這個(gè)符號(hào)的地址給綁定起來(lái)。”

“我只看過(guò)《深入理解Java虛擬機(jī)》 , 沒(méi)看到什么鏈接啊, 你那個(gè)定義太抽象了,沒(méi)人能聽(tīng)懂!”

C老頭心里鄙視了一下Java小子,所學(xué)果然淺薄, 盤(pán)算著舉個(gè)例子來(lái)說(shuō)明下什么是鏈接。

“你知道編譯是怎么回事嗎? ” C 老頭打算另辟蹊徑給Java講講。

“那我肯定知道啊, 我這個(gè)Hello.java經(jīng)過(guò)編譯以后,不就變成Hello.class了”

“我們C語(yǔ)言的程序,經(jīng)過(guò)預(yù)處理,編譯,匯編等步驟以后,能變成一個(gè)叫做'目標(biāo)文件' 的東西”

“假設(shè)我這個(gè)hello.c程序又調(diào)用了cal.c中的函數(shù)add :”

hello.c :

cal.c :

“那就會(huì)生成兩個(gè)目標(biāo)文件, hello.o 和 cal.o”

Java 小子問(wèn)道: “難道你這個(gè)hello.o 不能執(zhí)行嗎? ”

“那肯定不能執(zhí)行,你看那個(gè)add函數(shù)的定義是在cal.o 這個(gè)目標(biāo)文件中, 我hello.o中根本就沒(méi)有啊!怎么執(zhí)行? 所以編譯器只好在hello.o 中記錄類(lèi)似這樣的東西:hello.o 中需要調(diào)用add 函數(shù),但是這個(gè)函數(shù)的實(shí)際地址不在本文件中,鏈接的時(shí)候需要找到實(shí)際地址,把它給替換掉! 替換的過(guò)程就是一個(gè)重定位的過(guò)程 , 這一步做完了,才可以執(zhí)行。 ”

Java 小子說(shuō): “不對(duì)吧, 假設(shè)我也調(diào)用了另外一個(gè)類(lèi)Calculator.java 中add方法, 我們倆編譯以后生成兩個(gè)class 文件,這兩個(gè)文件完全獨(dú)立, 不用做鏈接, 直接就可以運(yùn)行啊。 ”

“你們肯定會(huì)做鏈接的,只不過(guò)這個(gè)鏈接不是在編譯期做的,而是在運(yùn)行期做的。 等到Hello.class被裝入你的Java虛擬機(jī)運(yùn)行的時(shí)候, 會(huì)發(fā)現(xiàn)有個(gè)指令要調(diào)用Calculator的add方法, 這個(gè)時(shí)候就需要裝載Claculator.class ,找到add方法來(lái)調(diào)用執(zhí)行。 這也是一種鏈接,只不過(guò)是運(yùn)行時(shí)的動(dòng)態(tài)鏈接而已。” C老頭做了一個(gè)總結(jié)陳述。

Java 小子現(xiàn)在明白了C老頭說(shuō)的鏈接的含義: 把一個(gè)符號(hào)(add函數(shù)的名稱(chēng))和這個(gè)符號(hào)的地址(add函數(shù)的真正地址,那里有add函數(shù)的指令)給綁定起來(lái)。

“這老頭還挺厲害嘛” Java小子心里不由得對(duì)C老頭產(chǎn)生了敬意, 他決定從明天開(kāi)始,不再叫他C老頭了,叫他老師, 向他多多請(qǐng)教。

眼看著天馬上亮了,兩人互道晚安。

第二天半夜,Java小子興沖沖地找C老師討教, 可是hello.c已經(jīng)找不到了, 同一個(gè)目錄下來(lái)了一個(gè)叫做hello.py的新家伙, 他熱情地對(duì)Java小子打打招呼: “你好,我是Python,初來(lái)乍到,請(qǐng)多多關(guān)照?!?/p>

“你知道hello.c去哪兒了嗎?”

“他呀, 程序員主人覺(jué)得C語(yǔ)言的指針太復(fù)雜了,實(shí)在是學(xué)不會(huì),就放棄了, 順便把hello.c給刪除了。 ”

【本文為專(zhuān)欄作者“劉欣”的原創(chuàng)稿件,轉(zhuǎn)載請(qǐng)通過(guò)作者微信公眾號(hào)coderising獲取授權(quán)】


文章名稱(chēng):C老頭和Java小子的硬盤(pán)夜話
鏈接URL:http://www.5511xx.com/article/dpocpci.html