除了 Java 的編譯器和虛擬機器之外
還有一些相關的編譯技術
本文章試圖做一個簡單的說明
JIT 編譯器 傳統的 Java 虛擬機器很愚蠢
將一道 bytecode 的指令翻譯成機器碼之後
馬上執行這些機器碼
執行完這批機器碼之後
就把這些機器碼丟了
接著再翻譯下一道 bytecode 的指令
繼續下去
即使下次執行到以前執行過的 bytecode 指令
依然要重新翻譯成機器碼才能執行
如此一來
效率當然不好
使用 JIT 編譯器(Just
In
Time compiler)技術的虛擬機器比較聰明
會把常常執行的部分在第一次先翻譯好放在內存
以後再次執行到這裡時
就不用再翻譯
直接從內存取出機器碼即可執行
這麼一來
只要你的內存夠大
JIT 編譯器的技術夠好
你的 Java bytecode 執行速度也可以逼近純編譯式的程序
其它程序語言的編譯器 任何檔案只要符合 Java bytecode 的格式
就可以被 Java 虛擬機器執行
制造出 Java bytecode 的方式有許多種
不一定要使用 Java 語言來寫程序
才能編譯成 Java bytecode
Java 是語言也是平台
你可以不使用 Java 語言(也就是 Java 編譯器)
只使用 Java 平台(也就是 Java 虛擬機器)
只要某語言有提供編譯器
能將該語言的原始碼編譯成 Java bytecode 格式
就可以在 Java 平台上執行
據我所知
目前已經有下列語言提供兼容於 Java 平台的編譯器(以英文字母順序排列)
Aardappel
Ada
Agora
BAMBOO
Basic
Bistro
Bolero
C
C++
CLIPS
COBOL
Correlate
Dawn
E
EcmaScript
Eiffel
Foo
Forth
Fortran
Funnel
Haskel
Hojo
javascript
Jickle
JIF
Jinni
Lisp
LL
LLP
Logo
Luck
MINERVA
Mini
ML
Modula
NetRexx
Nice
Oberon
Pascal
PLAN
Pnuts
Prolog
PS
I
Python
Sather
Scheme
SELF
Simkin
Small Talk
Tcl
WebL
Yassl
Yoix
Yoyo
原生編譯器 如果你不在乎 Java 程序能否跨平台
你希望 Java 程序能如同 C/C++ 一般被編譯成機器碼而非 Java bytecode
那麼你可以使用 Java 原生編譯器(native compiler)
目前已經有不少這樣的產品可以使用
Java 原生編譯器有兩大類
一類可以把 Java 的原始碼編譯成機器碼
另一類則可以把 Java bytecode 編譯成機器碼
反編譯與混淆器 Java bytecode 因為檔案格式簡單
信息保留完整
且指令是最簡單的堆棧式(stack
based)架構等因素
所以很容易被反編譯(de
compilation)
反編譯指的是和編譯相反的過程
對 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 組譯器
前處理器 前處理器(pre
processor)也稱為前編譯器(pre
compiler)或前翻譯器(pre
translator)
其目的在將源碼中不符合語言規范的部分轉換成符合語言規范的形式
比方說
我們可能在 ??????????Java 源碼中除了使用 Java 語言之外
還穿插使用自訂的語法
這些自訂的語法無法被 Java 編譯器處理
所以我們必須先透過一個前處理器來將自訂語法的部分轉換成 Java 語言
然後就可以交由 Java 編譯器處理
目前有不少 Java 的前處理器
例如 iContract
SQLJ
都是用來擴充 Java 語言之用的
最佳化工具軟件 一般來說
最佳化有兩種
讓檔案體積變小
可以節省儲存空間並加快網絡傳送速度
讓執行速度變快
對於 Java 來說
還有第三種最佳化
讓程序結構變亂
不容易被反編譯
也就是前面提到過的混淆(obfuscation)
這三個目的之間常常互相排擠
結構變亂
通常會使得程序變慢
且體積變大
體積變小
通常會使得速度變慢
且結構變整齊
速度變快
通常會使得體積變大
且結構變整齊
From:http://tw.wingwit.com/Article/program/Java/hx/201311/27007.html