熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

Java 相關的編譯技術

2013-11-23 19:31:03  來源: Java核心技術 

  除了 Java 的編譯器和虛擬機器之外還有一些相關的編譯技術本文章試圖做一個簡單的說明
  
  JIT 編譯器
  
  傳統的 Java 虛擬機器很愚蠢將一道 bytecode 的指令翻譯成機器碼之後馬上執行這些機器碼執行完這批機器碼之後就把這些機器碼丟了接著再翻譯下一道 bytecode 的指令繼續下去 即使下次執行到以前執行過的 bytecode 指令依然要重新翻譯成機器碼才能執行如此一來效率當然不好
  使用 JIT 編譯器(JustInTime compiler)技術的虛擬機器比較聰明會把常常執行的部分在第一次先翻譯好放在內存以後再次執行到這裡時就不用再翻譯直接從內存取出機器碼即可執行這麼一來只要你的內存夠大JIT 編譯器的技術夠好你的 Java bytecode 執行速度也可以逼近純編譯式的程序
  
  其它程序語言的編譯器
  
  任何檔案只要符合 Java bytecode 的格式就可以被 Java 虛擬機器執行制造出 Java bytecode 的方式有許多種不一定要使用 Java 語言來寫程序才能編譯成 Java bytecodeJava 是語言也是平台你可以不使用 Java 語言(也就是 Java 編譯器)只使用 Java 平台(也就是 Java 虛擬機器)只要某語言有提供編譯器能將該語言的原始碼編譯成 Java bytecode 格式就可以在 Java 平台上執行
  據我所知目前已經有下列語言提供兼容於 Java 平台的編譯器(以英文字母順序排列)AardappelAdaAgora BAMBOOBasicBistroBoleroCC++CLIPSCOBOLCorrelateDawnEEcmaScriptEiffelFooForthFortranFunnelHaskelHojojavascriptJickleJIFJinniLispLLLLPLogoLuckMINERVAMiniMLModulaNetRexxNiceOberonPascalPLANPnutsPrologPSIPythonSatherSchemeSELFSimkinSmall TalkTclWebLYasslYoixYoyo
  
  原生編譯器
  
  如果你不在乎 Java 程序能否跨平台你希望 Java 程序能如同 C/C++ 一般被編譯成機器碼而非 Java bytecode那麼你可以使用 Java 原生編譯器(native compiler)目前已經有不少這樣的產品可以使用
  Java 原生編譯器有兩大類一類可以把 Java 的原始碼編譯成機器碼另一類則可以把 Java bytecode 編譯成機器碼
  
  反編譯與混淆器
  
  Java bytecode 因為檔案格式簡單信息保留完整且指令是最簡單的堆棧式(stackbased)架構等因素所以很容易被反編譯(decompilation)反編譯指的是和編譯相反的過程對 Java 來說反編譯就是把 Java bytecode 轉換成 Java 原始碼的過程
  為了防止你辛苦地開發出來的 Java bytecode 被他人反編譯成原始碼你可以透過混淆器(obfuscator)將你的 Java bytecode 轉換成更混亂的 Java bytecode執行起來效果一樣但是被混淆過的 Java bytecode 比較不容易被反編譯你通常要為此付出一點代價因為混淆過的程序執行速度通常會變慢且混淆器只能增加反編譯的難度不能保證你的程序一定無法被反編譯成功畢竟道高一尺魔高一丈如果有人願意花許多時間和精力反編譯你的 Java bytecode你根本就無法攔阻
  
  組譯與反組譯
  
  匯編語言(assembly)是一種非常接近機器碼的語言將匯編語言轉成機器碼的工具稱為組譯器(assembler)反過來將機器碼轉成匯編語言的工具稱為反組譯器(dissembler)
  對於 Java 虛擬機器來說Java bytecode 就如同它的機器碼有沒有一種語言是很接近 Java bytecode 的呢?也就是說Java 有沒有的匯編語言呢?基本上Sun 並未定義 Java 的標准匯編語言但是有一些人定義了自己的 Java 匯編語言並提供 Java 的組譯器(甚至反組譯器)例如 Jasmin 以及 javaa 都是 Java 組譯器
  
  前處理器
  
  前處理器(preprocessor)也稱為前編譯器(precompiler)或前翻譯器(pretranslator)其目的在將源碼中不符合語言規范的部分轉換成符合語言規范的形式比方說我們可能在 ??????????Java 源碼中除了使用 Java 語言之外還穿插使用自訂的語法這些自訂的語法無法被 Java 編譯器處理所以我們必須先透過一個前處理器來將自訂語法的部分轉換成 Java 語言然後就可以交由 Java 編譯器處理
  目前有不少 Java 的前處理器例如 iContractSQLJ都是用來擴充 Java 語言之用的
  
  最佳化工具軟件
  
  一般來說最佳化有兩種
   讓檔案體積變小可以節省儲存空間並加快網絡傳送速度
   讓執行速度變快
  對於 Java 來說還有第三種最佳化
   讓程序結構變亂不容易被反編譯也就是前面提到過的混淆(obfuscation)
  
  這三個目的之間常常互相排擠結構變亂通常會使得程序變慢且體積變大體積變小通常會使得速度變慢且結構變整齊速度變快通常會使得體積變大且結構變整齊

From:http://tw.wingwit.com/Article/program/Java/hx/201311/27007.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.