GCJ
頁面Module:Infobox/styles.css沒有內容。
| 腳本錯誤:沒有「InfoboxImage」這個模塊。 | |
| 腳本錯誤:沒有「InfoboxImageVariant」這個模塊。 | |
| 開發者 | The GNU Project |
|---|---|
| 首次發布 | 1998年9月6日[1] |
| 最終版本 | Template:Software version |
| 原始碼庫 | 頁面Template:Plainlist/styles.css沒有內容。 |
| 引擎 | 頁面Template:Plainlist/styles.css沒有內容。
|
| 作業系統 | Unix-like |
| 類型 | Compiler |
| 許可協議 | GNU GPL |
| 網站 | gcc |
| 腳本錯誤:沒有「Template wrapper」這個模塊。 | |
腳本錯誤:沒有「Check for unknown parameters」這個模塊。
GNU Java編譯器(Template:Langx,GCJ)是一個自由的Java編譯器。它是GCC(GNU Compiler Collection)的一部分,已有十多年的歷史。但自2017年起,GNU宣布不再對其進行維護,也不會在GNU的後繼版本中包括它。[2][3]
GCJ可將Java 原始碼編譯為Java虛擬機字節碼或適用於不同架構的機器碼。它還可以將包含字節碼的類文件和整個jar文件編譯為機器代碼。[4][5]
歷史[編輯]
GCJ的運行時庫來源於GNU Classpath項目,但libgcj庫之間有一些區別。GCJ4.3使用了Eclipse Java編譯器作為編譯前端。[6]
在2007年,GNU做了許多工作來在GNU Classpath中實現兩個重要的Java圖形庫:AWT庫和Swing庫。首先嘗試實現的為AWT庫,當AWT庫實現後,便可以開始考慮實現Swing庫。這時至少有一種自由的方式來實現Swing。[7]但是GCJ從未支持到Java1.2以及更高的版本。現在來看該項目已被完全放棄。
直至2015年,GCJ未進行任何的開發,並且該項目被標記為維護模式。在這段時間,自由的Java實現主要在OpenJDK項目中進行。[8]GCJ在2016年9月30日被從GCC工具鏈中移除。[9][10]該通知隨GCC7.1版本的發布而發布。[11]而GCC6中仍包括GCJ。
性能[編輯]
使用GCJ將Java源碼編譯為機器代碼後,其啟動時間一般比使用JVM運行等效字節碼的啟動時間更快。[12]
Compiled Native Interface[編輯]
Compiled Native Interface (CNI), 原名"Cygnus Native Interface", 是一個GCJ軟體框架。與JNI(Java Native Interface)類似,它允許Java程序訪問和使用本機共享庫(在各個平台和不同的硬體類型中有所不同)和使用C++編寫的共享庫。
兩種方式的比較[編輯]
CNI的作者對於CNI和JNI的評價如下:[13]
| “ | 我們之所以使用CNI,是因為我們認為它是一個更好的實現方案。因為該實現是基於Java可以使用標準編譯技術實現另一種程式語言的思想,並且我們認為使用GCC實現的語言應該恰當地在某些方面兼容。因此我們認為,Java的函數調用約定應該與其他語言(尤其是C ++)使用的調用約定相似。因為我們可以將Java視為一個C ++的子集。CNI實現了一組函數集並規定了有關的調用約定,且其設計時基於C ++和Java應具有相同的調用約定和對象布局的思想,因此它們是二進制兼容的[lower-alpha 1] | ” |
CNI依賴於類似於C++的Java類。例如這是一個Java類:[14]
public class Int
{
public int i;
public Int(int i) { this.i = i; }
public static Int zero = new Int(0);
}
於是就可以這樣使用:
#include <gcj/cni.h>
#include <Int>
Int *mult(Int *p, int k)
{
if (k == 0)
return Int::zero; // 静态成员访问
return new Int(p->i * k);
}
另見[編輯]
- Excelsior JET (另一個Java實現)
- IcedTea
- Kaffe
- SableVM
- JamVM
- Apache Harmony
- Jikes
- GraalVM - GraalVM的本地映像功能使用了預編譯技術,這使得它可以生成類文件可執行的二進制文件。
- 自由的Java實現
- Kotlin - Kotlin/Native是一種將Kotlin語言編譯為本地可執行二進制文件而無需JVM的技術。它包括一個基於LLVM的後端和本地Kotlin庫實現兩個部分。
備註[編輯]
- ↑ 這句話的意思是,CNI的理念是在編譯層面使Java和C++做到儘量兼容,而這需要Java和C++的編譯器的某些標準一致。GNU計劃剛好既實現了Java編譯器,又實現了C++編譯器,因此很容易在編譯器層面對其進行調整,使其更易用,性能更高。
參考資料[編輯]
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 腳本錯誤:沒有「citation/CS1」這個模塊。
- ↑ 這個例子來源於 https://gcc.gnu.org/onlinedocs/gcj/Objects-and-Classes.html#Objects-and-Classes (頁面存檔備份,存於網際網路檔案館)
外部連結[編輯]
- 腳本錯誤:沒有「citation/CS1」這個模塊。
- 腳本錯誤:沒有「citation/CS1」這個模塊。
- 腳本錯誤:沒有「citation/CS1」這個模塊。
- 腳本錯誤:沒有「citation/CS1」這個模塊。
package.lua第80行Lua錯誤:module 'Module:Navbar/configuration' not foundpackage.lua第80行Lua錯誤:module 'Module:Navbar/configuration' not found