GNU Java编译器(英語:GNU Compiler for JavaGCJ)是一个自由的Java编译器。它是GCC(GNU Compiler Collection)的一部分,已有十多年的历史。但自2017年起,GNU宣布不再对其进行维护,也不会在GNU的后继版本中包括它。[3][4]

GNU Compiler for Java
開發者The GNU Project
首次发布1998年9月6日,​27年前​(1998-09-06[1]
最终版本
  • 6.5(2018年10月26日;穩定版本)[2]
編輯維基數據鏈接
操作系统Unix-like
类型Compiler
许可协议GNU GPL
网站gcc.gnu.org

GCJ可将Java 源代码编译为Java虚拟机字节码或适用于不同架构的机器码。它还可以将包含字节码的类文件和整个jar文件编译为机器代码。[5][6]

历史

编辑

GCJ的运行时库来源于GNU Classpath项目,但libgcj库之间有一些区别。GCJ4.3使用了Eclipse Java编译器作为编译前端。[7]

在2007年,GNU做了许多工作来在GNU Classpath中实现两个重要的Java图形库:AWT库和Swing库。首先尝试实现的为AWT库,当AWT库实现后,便可以开始考虑实现Swing库。这时至少有一种自由的方式来实现Swing。[8]但是GCJ从未支持到Java1.2以及更高的版本。现在来看该项目已被完全放弃。

直至2015年,GCJ未进行任何的开发,并且该项目被标记为维护模式。在这段时间,自由的Java实现主要在OpenJDK项目中进行。[9]GCJ在2016年9月30日被从GCC工具链中移除。[10][11]该通知随GCC7.1版本的发布而发布。[12]而GCC6中仍包括GCJ。

性能

编辑

使用GCJ将Java源码编译为机器代码后,其启动时间一般比使用JVM运行等效字节码的启动时间更快。[13]

Compiled Native Interface

编辑

Compiled Native Interface (CNI), 原名"Cygnus Native Interface", 是一个GCJ软件框架。与JNI(Java Native Interface)类似,它允许Java程序访问和使用本机共享库(在各个平台和不同的硬件类型中有所不同)和使用C++编写的共享库。

两种方式的比较

编辑

CNI的作者对于CNI和JNI的评价如下:[14]

CNI依赖于类似于C++的Java类。例如这是一个Java类:[15]

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. ^ "GCC 6.5 Released"; 作者姓名字符串: Jakub Jelinek; 出版日期: 2018年10月26日.
  3. ^ Archived copy. [2010-04-22]. (原始内容存档于2007-05-09). 
  4. ^ 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). 
  5. ^ 存档副本. [2020-08-07]. (原始内容存档于2020-09-04). 
  6. ^ 存档副本. [2020-08-07]. (原始内容存档于2016-08-20). 
  7. ^ gcj to use Eclipse compiler as a front end. 2007-01-08 [2007-05-20]. (原始内容存档于2007-05-09). 
  8. ^ GCC Frequently Asked Questions - GNU Project - Free Software Foundation (FSF). gcc.gnu.org. [2020-08-01]. (原始内容存档于2020-06-12). 
  9. ^ GCC Looks To Turn Off Java, Replace With Go Or ADA. [2020-08-07]. (原始内容存档于2020-07-25). 
  10. ^ Andrew Haley. [gcc] Revision 240661. 2016-09-30 [2020-08-07]. (原始内容存档于2019-06-16). 
  11. ^ Tromey, Tom. The Deletion of gcj. The Cliffs of Inanity. 2016-10-02 [2016-10-03]. (原始内容存档于2020-07-25). 
  12. ^ GCC 7 Release Series: Changes, New Features, and Fixes. [2017-05-09]. (原始内容存档于2020-09-02). 
  13. ^ GCJ: The GNU Static Java Compiler (PDF). [2009-08-02]. (原始内容 (PDF)存档于2011-06-07). 
  14. ^ The GCJ FAQ - GNU Project - Free Software Foundation (FSF). [2020-08-07]. (原始内容存档于2016-10-20). 
  15. ^ 这个例子来源于 https://gcc.gnu.org/onlinedocs/gcj/Objects-and-Classes.html#Objects-and-Classes页面存档备份,存于互联网档案馆

外部链接

编辑

📚 Artikel Terkait di Wikipedia

Java字节码

Espresso,编译Java源代码到Java字节码(仅支持Java 1.0) GCJ,GNU Compiler for Java,编译Java代码到Java字节码;亦可以编译到机器代码。作为GNU Compiler Collection (GCC)的一部分提供。 有一些项目提供Java汇编器以便于直接用Java字节码进行开发。主要的Java汇编器如下:

GCC

GNU编译器套裝(英語:GNU Compiler Collection,縮寫為GCC)是GNU計劃制作的一种优化编译器,支持各种编程語言、操作系统、计算机系统结构。该编译器是以GPL及LGPL許可證所發行的自由軟體,也是GNU計劃的关键部分,还是GNU工具链的主要組成部份之一。GCC(特别是其中的C

LLVM

Glasgow Haskell Compiler(GHC)擁有一個可以運作的LLVM後端,程式執行效能對比起原先的編譯器可以達到30%的加速,它僅比一個由GHC所實現,並擁有多項最佳化技術的編譯器還慢 還有其他的元件在不同的開發階段,包含(但不限於)Java

編譯器

、Java等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。 一个现代编译器的主要工作流程如下: 源代码(source code)→ 预处理器(preprocessor)→ 编译器(compiler)→ 汇编程序(assembler)→

即時編譯

optimization))在极端情况下不如JIT编译的代码的原因相同:缺乏分析数据来驱动,例如,内联缓存。 还有一些Java实现将AOT编译器与JIT编译器(Excelsior JET)或解释器(GNU Compiler for Java)结合起来。 最早发布的JIT编译器通常归功于约翰·麦卡锡在1960年对LISP的研究。

Java

Java編譯器和Java類庫以GNU通用公共許可證公開。 1995年5月23日,Java语言诞生 1996年1月,第一个JDK-JDK1.0诞生 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术 1996年9月,约8.3万个网页应用了JAVA技术来制作 1997年2月18日,JDK1

Java版本歷史

自JDK 1.0版本以来,Java語言历经了多次迭代更新,并在基础程式庫中持续增添大量類別与包。自J2SE 1.4版本起,Java语言的演变过程交由 Java Community Process(JCP)统一管理,其采用Java规范请求(Java Specification

Free Pascal

org/index.php/topic,54712.0.html. Free Pascal - Advanced open source Pascal compiler for Pascal and Object Pascal - Home Page. www.freepascal.org. [2016-12-14]