GCJ

GNU Java编译器（，GCJ）是一个自由的Java编译器。它是GCC（GNU Compiler Collection）的一部分，已有十多年的历史。但自2017年起，GNU宣布不再对其进行维护，也不会在GNU的后继版本中包括它。

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

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

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

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

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

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

两种方式的比较
CNI的作者对于CNI和JNI的评价如下：

CNI依赖于类似于C++的Java类。例如这是一个Java类：这个例子来源于 https://gcc.gnu.org/onlinedocs/gcj/Objects-and-Classes.html#Objects-and-Classes 

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库实现两个部分。

 备注 

参考资料

外部链接





Category:Free compilers and interpreters
Java
Category:Java compilers
Category:Discontinued Java virtual machines