<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    rosial

    lost memory
    數(shù)據(jù)加載中……

    《爪哇夜未眠》- 系統(tǒng)篇 - Java 相關(guān)的編譯技術(shù)

    除了 Java 的編譯器和虛擬機(jī)器之外,還有一些相關(guān)的編譯技術(shù),本文章試圖做一個簡單的說明。

    JIT 編譯器

    傳統(tǒng)的 Java 虛擬機(jī)器很愚蠢,將一道 bytecode 的指令翻譯成機(jī)器碼之后,馬上執(zhí)行這些機(jī)器碼,執(zhí)行完這批機(jī)器碼之后,就把這些機(jī)器碼丟了,接著再翻譯下一道 bytecode 的指令,繼續(xù)下去 ...。即使下次執(zhí)行到以前執(zhí)行過的 bytecode 指令,依然要重新翻譯成機(jī)器碼才能執(zhí)行,如此一來,效率當(dāng)然不好。

    使用 JIT 編譯器(Just-In-Time compiler)技術(shù)的虛擬機(jī)器比較聰明,會把常常執(zhí)行的部分在第一次先翻譯好放在內(nèi)存,以后再次執(zhí)行到這里時,就不用再翻譯,直接從內(nèi)存取出機(jī)器碼即可執(zhí)行。這么一來,只要你的內(nèi)存夠大,JIT 編譯器的技術(shù)夠好,你的 Java bytecode 執(zhí)行速度也可以逼近純編譯式的程序。

    其它程序語言的編譯器

    任何檔案只要符合 Java bytecode 的格式,就可以被 Java 虛擬機(jī)器執(zhí)行。制造出 Java bytecode 的方式有許多種,不一定要使用 Java 語言來寫程序,才能編譯成 Java bytecode。Java 是語言也是平臺,你可以不使用 Java 語言(也就是 Java 編譯器),只使用 Java 平臺(也就是 Java 虛擬機(jī)器)。只要某語言有提供編譯器,能將該語言的原始碼編譯成 Java bytecode 格式,就可以在 Java 平臺上執(zhí)行。

    據(jù)我所知,目前已經(jīng)有下列語言提供兼容于 Java 平臺的編譯器(以英文字母順序排列):Aardappel,Ada,Agora 98,BAMBOO,Basic,Bistro,Bolero,C,C++,CLIPS,COBOL,Correlate,Dawn,E,EcmaScript,Eiffel,F(xiàn)oo,F(xiàn)orth,F(xiàn)ortran,F(xiàn)unnel,Haskel,Hojo,JavaScript,Jickle,JIF,Jinni,Lisp,LL,LLP,Logo,Luck,MINERVA,Mini,ML,Modula-2,NetRexx,Nice,Oberon-2,Pascal,PLAN,Pnuts,Prolog,PS3I,Python,Sather,Scheme,SELF,Simkin,Small Talk,Tcl,WebL,Yassl,Yoix,Yoyo。

    原生編譯器

    如果你不在乎 Java 程序能否跨平臺,你希望 Java 程序能如同 C/C++ 一般被編譯成機(jī)器碼而非 Java bytecode,那么你可以使用 Java 原生編譯器(native compiler)。目前已經(jīng)有不少這樣的產(chǎn)品可以使用。

    Java 原生編譯器有兩大類,一類可以把 Java 的原始碼編譯成機(jī)器碼,另一類則可以把 Java bytecode 編譯成機(jī)器碼。

    反編譯與混淆器

    Java bytecode 因?yàn)闄n案格式簡單,信息保留完整,且指令是最簡單的堆棧式(stack-based)架構(gòu)等因素,所以很容易被反編譯(de-compilation)。反編譯指的是和編譯相反的過程,對 Java 來說,反編譯就是把 Java bytecode 轉(zhuǎn)換成 Java 原始碼的過程。

    為了防止你辛苦地開發(fā)出來的 Java bytecode 被他人反編譯成原始碼,你可以透過混淆器(obfuscator)將你的 Java bytecode 轉(zhuǎn)換成更混亂的 Java bytecode,執(zhí)行起來效果一樣,但是被混淆過的 Java bytecode 比較不容易被反編譯。你通常要為此付出一點(diǎn)代價(jià),因?yàn)榛煜^的程序執(zhí)行速度通常會變慢。且混淆器只能增加反編譯的難度,不能保證你的程序一定無法被反編譯成功。畢竟道高一尺,魔高一丈,如果有人愿意花許多時間和精力反編譯你的 Java bytecode,你根本就無法攔阻。

    組譯與反組譯

    匯編語言(assembly)是一種非常接近機(jī)器碼的語言。將匯編語言轉(zhuǎn)成機(jī)器碼的工具稱為組譯器(assembler),反過來將機(jī)器碼轉(zhuǎn)成匯編語言的工具稱為反組譯器(dissembler)

    對于 Java 虛擬機(jī)器來說,Java bytecode 就如同它的機(jī)器碼,有沒有一種語言是很接近 Java bytecode 的呢?也就是說,Java 有沒有的匯編語言呢?基本上,Sun 并未定義 Java 的標(biāo)準(zhǔn)匯編語言,但是有一些人定義了自己的 Java 匯編語言,并提供 Java 的組譯器(甚至反組譯器)。例如 Jasmin 以及 javaa 都是 Java 組譯器。

    前處理器

    前處理器(pre-processor)也稱為前編譯器(pre-compiler)或前翻譯器(pre-translator),其目的在將源碼中不符合語言規(guī)范的部分轉(zhuǎn)換成符合語言規(guī)范的形式。比方說:我們可能在 Java 源碼中除了使用 Java 語言之外,還穿插使用自訂的語法。這些自訂的語法無法被 Java 編譯器處理,所以我們必須先透過一個前處理器來將自訂語法的部分轉(zhuǎn)換成 Java 語言,然后就可以交由 Java 編譯器處理。

    目前有不少 Java 的前處理器,例如 iContract、SQLJ,都是用來擴(kuò)充 Java 語言之用的。

    最佳化工具軟件

    一般來說,最佳化有兩種:
    1. 讓檔案體積變小,可以節(jié)省儲存空間并加快網(wǎng)絡(luò)傳送速度。
    2. 讓執(zhí)行速度變快。
    對于 Java 來說,還有第三種最佳化:
    3. 讓程序結(jié)構(gòu)變亂,不容易被反編譯。也就是前面提到過的混淆(obfuscation)。

    這三個目的之間常?;ハ嗯艛D:結(jié)構(gòu)變亂,通常會使得程序變慢,且體積變大;體積變小,通常會使得速度變慢,且結(jié)構(gòu)變整齊;速度變快,通常會使得體積變大,且結(jié)構(gòu)變整齊。

    ?

    posted on 2006-07-10 14:45 rosial 閱讀(231) 評論(0)  編輯  收藏 所屬分類: 蔡學(xué)鏞

    主站蜘蛛池模板: 免费看片免费播放| 午夜不卡久久精品无码免费 | 亚洲人成无码网WWW| 亚洲人成未满十八禁网站| 国产乱子精品免费视观看片| 亚洲精品国产专区91在线| 色片在线免费观看| 亚洲 日韩 色 图网站| 日韩精品视频免费网址| 黄色毛片免费观看| 亚洲色大成网站WWW久久九九| 两个人看的www免费| 亚洲最新永久在线观看| 日本免费xxxx| 亚洲中文字幕无码中文字| 国产成人免费全部网站| 国产免费内射又粗又爽密桃视频| 亚洲色WWW成人永久网址| 特级无码毛片免费视频尤物| 亚洲六月丁香六月婷婷色伊人 | 亚洲人成网国产最新在线| 国产精品免费综合一区视频| 一级做性色a爰片久久毛片免费| 最新国产AV无码专区亚洲| 99热这里只有精品6免费| 亚洲一区二区三区成人网站 | 亚洲国产精品成人久久| 18级成人毛片免费观看| 亚洲欧美日韩一区二区三区在线| 亚洲av午夜精品一区二区三区| 美女被cao网站免费看在线看| 亚洲精品中文字幕乱码| 国产一级淫片a免费播放口之| 成人性做爰aaa片免费看| 亚洲AV无码乱码麻豆精品国产| 亚洲av区一区二区三| 久久精品免费视频观看| 亚洲成AV人片高潮喷水| 精品久久久久久亚洲| 好男人www免费高清视频在线| 思思久久99热免费精品6|