GCJ

維基百科,自由的百科全書
跳至導覽 跳至搜尋
GNU Compiler for Java
File:Gcj2.png
開發者The GNU Project
首次發佈1998年9月6日,​27年前​(1998-09-06[1]
最終版本
    Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
    原始碼庫
    • {{URL|example.com|可选的显示文本}}
    Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
    引擎
      Module:EditAtWikidata第29行Lua錯誤:attempt to index field 'wikibase' (a nil value)
      作業系統Unix-like
      類型Compiler
      許可協議GNU GPL
      網站gcc.gnu.org

      GNU Java編譯器(英語:GNU Compiler for JavaGCJ)是一個自由的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依賴於類似於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);
      }
      

      另見[編輯]

      備註[編輯]

      1. ^ 這句話的意思是,CNI的理念是在編譯層面使Java和C++做到儘量兼容,而這需要Java和C++的編譯器的某些標準一致。GNU計劃剛好既實現了Java編譯器,又實現了C++編譯器,因此很容易在編譯器層面對其進行調整,使其更易用,性能更高。

      參考資料[編輯]

      1. ^ Anthony Green, Cygnus Solutions. GCJ announcement. [2020-08-07]. (原始內容存檔於2017-07-11). 
      2. ^ Archived copy. [2010-04-22]. (原始內容存檔於2007-05-09). 
      3. ^ Campbell, Bill. Introduction to Compiler Construction in a Java World. CRC Press Taylor & Francis Group. 2013 [2014-02-06]. ISBN 978-1-4398-6088-5. (原始內容存檔於2020-08-12). 
      4. ^ 存档副本. [2020-08-07]. (原始內容存檔於2020-09-04). 
      5. ^ 存档副本. [2020-08-07]. (原始內容存檔於2016-08-20). 
      6. ^ gcj to use Eclipse compiler as a front end. 2007-01-08 [2007-05-20]. (原始內容存檔於2007-05-09). 
      7. ^ GCC Frequently Asked Questions - GNU Project - Free Software Foundation (FSF). gcc.gnu.org. [2020-08-01]. (原始內容存檔於2020-06-12). 
      8. ^ GCC Looks To Turn Off Java, Replace With Go Or ADA. [2020-08-07]. (原始內容存檔於2020-07-25). 
      9. ^ Andrew Haley. [gcc] Revision 240661. 2016-09-30 [2020-08-07]. (原始內容存檔於2019-06-16). 
      10. ^ Tromey, Tom. The Deletion of gcj. The Cliffs of Inanity. 2016-10-02 [2016-10-03]. (原始內容存檔於2020-07-25). 
      11. ^ GCC 7 Release Series: Changes, New Features, and Fixes. [2017-05-09]. (原始內容存檔於2020-09-02). 
      12. ^ GCJ: The GNU Static Java Compiler (PDF). [2009-08-02]. (原始內容 (PDF)存檔於2011-06-07). 
      13. ^ The GCJ FAQ - GNU Project - Free Software Foundation (FSF). [2020-08-07]. (原始內容存檔於2016-10-20). 
      14. ^ 這個例子來源於 https://gcc.gnu.org/onlinedocs/gcj/Objects-and-Classes.html#Objects-and-Classes頁面存檔備份,存於互聯網檔案館

      外部連結[編輯]