Loading AI tools
来自维基百科,自由的百科全书
GNU Java编译器(英语:GNU Compiler for Java,GCJ)是一个自由的Java编译器。它是GCC(GNU Compiler Collection)的一部分,已有十多年的历史。但自2017年起,GNU宣布不再对其进行维护,也不会在GNU的后继版本中包括它。[3][4]
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 (CNI), 原名"Cygnus Native Interface", 是一个GCJ软件框架。与JNI(Java Native Interface)类似,它允许Java程序访问和使用本机共享库(在各个平台和不同的硬件类型中有所不同)和使用C++编写的共享库。
CNI的作者对于CNI和JNI的评价如下:[14]
“ | 我们之所以使用CNI,是因为我们认为它是一个更好的实现方案。因为该实现是基于Java可以使用标准编译技术实现另一种编程语言的思想,并且我们认为使用GCC实现的语言应该恰当地在某些方面兼容。因此我们认为,Java的函数调用约定应该与其他语言(尤其是C ++)使用的调用约定相似。因为我们可以将Java视为一个C ++的子集。CNI实现了一组函数集并规定了有关的调用约定,且其设计时基于C ++和Java应具有相同的调用约定和对象布局的思想,因此它们是二进制兼容的[a] | ” |
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);
}
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.