맨위로가기

GCJ

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

GCJ는 자바 코드를 네이티브 코드로 컴파일하는 GNU 컴파일러 모음(GCC)의 구성 요소였다. GNU Classpath 프로젝트에서 소스를 가져왔지만, libgcj 라이브러리 간에는 코드 차이가 존재한다. GCJ 4.3은 이클립스 Java 컴파일러를 프론트엔드로 사용했다. 2007년에는 AWT 및 Swing에 대한 지원을 구현하기 위해 GNU Classpath에서 많은 작업이 이루어졌지만, 2015년 이후 유지 보수 모드로 전환되었고, 2016년 GCC 트렁크에서 제거되었다. GCJ는 자바 코드를 머신 코드로 컴파일하여 JVM에서 실행되는 바이트코드보다 더 빠른 시작 시간을 제공할 수 있었다. GCJ는 자바 코드가 C++로 작성된 네이티브 애플리케이션 및 라이브러리와 상호 호출될 수 있도록 하는 CNI(Compiled Native Interface)라는 프레임워크를 제공한다. CNI는 JNI(Java Native Interface)와 유사하며, C++와 Java의 바이너리 호환성을 목표로 한다.

더 읽어볼만한 페이지

  • 자바 컴파일러 - GraalVM
    GraalVM은 JVM 기반의 고성능 런타임으로, 다양한 프로그래밍 언어 지원, JIT 컴파일, 네이티브 이미지 생성 등을 통해 애플리케이션 성능 향상과 메모리 사용량 감소를 목표로 하며 오픈 소스 커뮤니티 에디션, Oracle GraalVM, Oracle GraalVM Enterprise Edition 세 가지 에디션으로 제공된다.
  • 자바 컴파일러 - Javac
    Javac은 자바 소스 코드를 바이트 코드로 컴파일하는 명령줄 컴파일러이며, GNU Classpath는 자유 자바 구현체로서 Javac 컴파일 및 실행을 지원하고, 썬 마이크로시스템즈는 자바를 OpenJDK로 전환하는 데 기여했다.
  • 자바 가상 머신 - 핫스팟 (가상 머신)
    핫스팟은 오라클의 자바 런타임 환경에 포함된 가상 머신으로, 반복되는 코드 영역을 최적화하는 JIT 컴파일러이며, 1999년 출시 후 GNU GPL 라이선스로 사용 가능하다.
  • 자바 가상 머신 - 안드로이드 런타임
    안드로이드 런타임(ART)은 안드로이드 운영 체제에서 애플리케이션 실행을 위한 런타임 환경이며, AOT 컴파일을 통해 실행 효율성을 높이고 전력 소비를 줄이는 장점을 가진다.
  • 자바 개발 도구 - GNU 컴파일러 모음
    GNU 컴파일러 모음(GCC)은 리처드 스톨먼이 1987년 처음 출시한 자유 소프트웨어 컴파일러 시스템으로, C, C++, Fortran, Ada, Go 등 다양한 프로그래밍 언어를 지원하며 여러 명령어 집합 아키텍처와 플랫폼에서 널리 사용된다.
  • 자바 개발 도구 - J 샤프
    J#은 마이크로소프트에서 개발한 .NET Framework 기반의 프로그래밍 언어로, 자바와 유사한 문법을 가지며 기존 자바 코드의 .NET 플랫폼 이전 및 .NET 언어와의 상호 운용성을 지원했으나 현재는 개발이 중단되었다.
GCJ - [IT 관련 정보]에 관한 문서
기본 정보
GNU 컴파일러 자바 로고
GNU 컴파일러 자바 로고
개발자GNU 프로젝트
최초 릴리스1998년 9월 6일
개발 중단
최신 버전6.5
최신 버전 출시일2018년 10월 26일
최신 평가 버전해당 없음
최신 평가 버전 출시일해당 없음
운영체제유닉스 계열
프로그래밍 언어해당 없음
장르컴파일러
라이선스GNU GPL
웹사이트GNU Compiler for Java - GNU Project - Free Software Foundation (FSF)
추가 정보
상태2016년 9월 30일 이후 더 이상 유지 관리되지 않음
삭제일2016년 10월 2일

2. 역사

GCJ는 초기에 GNU Classpath 프로젝트의 소스를 기반으로 개발되었으나, 이후 코드 차이가 발생했다. GCJ 4.3 버전에서는 이클립스 Java 컴파일러를 프론트엔드로 사용했다.[6] 2007년에는 AWT와 Swing 같은 그래픽 API 지원을 위해 GNU Classpath에서 많은 작업이 이루어졌지만, 개발은 완전히 중단된 상태였다.[7]

2015년 이후, GCJ는 새로운 개발 발표 없이 유지 보수 모드에 들어갔으며, 오픈 소스 Java 툴체인 개발은 주로 OpenJDK에서 진행되었다.[8] 2016년 9월 30일, GCJ는 GCC 트렁크에서 제거되었다.[9][10] 이는 GCC 7.1 릴리스 발표와 함께 이루어졌으며, 해당 릴리스에는 GCJ가 포함되지 않았다.[11]

2. 1. 개발 과정

GCJ 런타임 라이브러리의 초기 소스는 GNU Classpath 프로젝트에서 가져왔지만, `libgcj` 라이브러리 간에는 코드 차이가 있다. GCJ 4.3은 이클립스 Java 컴파일러를 프론트엔드로 사용한다.[6]

2007년에는 Java의 두 가지 그래픽 API인 AWT 및 Swing에 대한 지원을 구현하기 위해 GNU Classpath에서 많은 작업이 이루어졌다. AWT에 대한 소프트웨어 지원은 여전히 개발 중이었다. "AWT 지원이 작동하면 Swing 지원을 고려할 수 있다. Swing의 최소한 하나의 자유 소프트웨어 부분 구현이 사용 가능할 수 있다."[7] GNU CLASSPATH는 Java 1.2 상태조차 완료되지 않았으며, 현재는 완전히 중단된 것으로 보인다.

2. 2. 현재 상황

2015년부터 GCJ는 새로운 개발 발표 없이 유지 보수 모드에 들어갔으며, 오픈 소스 Java 툴체인 개발은 주로 OpenJDK에서 진행되었다.[8] 2016년 9월 30일, GCJ는 GCC 트렁크에서 제거되었다.[9][10] 이는 GCC 7.1 릴리스 발표와 함께 이루어졌으며, 해당 릴리스에는 GCJ가 포함되지 않았다.[11] GCJ는 GCC 6의 일부로 남아있다.

3. 성능

GCJ는 자바 코드를 머신 코드로 컴파일하여 JVM에서 실행되는 바이트코드보다 빠른 시작 시간을 가질 수 있다.[12]

4. Compiled Native Interface (CNI)

CNI (컴파일된 네이티브 인터페이스, 이전 명칭 "시그너스 네이티브 인터페이스")는 GCJ를 위한 소프트웨어 프레임워크이다. 자바 코드가 C++(C++)로 작성된 네이티브 애플리케이션(하드웨어 및 운영 체제 플랫폼에 특정한 프로그램) 및 라이브러리를 호출하고, 반대로 호출될 수 있도록 해준다.[19]

CNI는 다양한 자바 가상 머신에서 표준으로 제공되는 JNI (Java Native Interface) 프레임워크와 매우 유사하다.

4. 1. CNI의 특징

CNI는 JNI와 매우 유사하지만, 몇 가지 장점을 가진다. CNI 개발자는 JNI에 비해 다음과 같은 장점을 주장한다.[13]

We use CNI, because we think it is a better solution. In particular, it is a better solution in a Java implementation that is based on the idea that Java is just another programming language that can be implemented using standard compilation techniques. Given that, and given that language implementations using Gcc should be compatible where this is reasonable, it follows that the Java calling convention should be as similar as is practical to that used by other languages, in particular C++. This is because you can think of Java as a subset of C++. CNI is simply a set of helper functions and conventions that are built on the idea that C++ and Java have *the same* calling convention and object layout, and are thus binary compatible. (This is a simplification, but it is close enough to being true.)영어[19]

위 인용구를 번역하면 다음과 같다.

"우리는 CNI를 더 나은 수단이라고 생각하여 채택하고 있다. 특히 Java는 표준 컴파일 기술을 사용하여 구현되는 또 다른 프로그래밍 언어에 불과하다는 발상에 기반한 Java 구현에서 더욱 좋다고 생각한다. 따라서 GCC를 사용한 언어 구현은 가능한 한 호환되어야 하므로 Java의 호출 규약은 다른 언어, 특히 C++에서 사용되는 규약과 실용성을 해치지 않는 범위 내에서 최대한 유사해야 한다. 왜냐하면 우리는 Java를 C++의 하위 집합으로 간주할 수도 있기 때문이다. CNI는 단순히 C++와 Java가 동일한 호출 규약과 객체 배치를 가지며 바이너리 호환이 가능하다는 발상에 의한 헬퍼 함수와 규약의 세트이다. (이 설명은 단순화되었지만 충분히 정확하다)"

CNI는 자바 클래스가 C++ 클래스로 나타나는 것에 의존한다.[14]

4. 2. JNI와의 비교

CNI (Compiled Native Interface)는 C++로 작성된 네이티브 애플리케이션 및 라이브러리와 자바 코드가 서로 호출할 수 있도록 해주는 GCJ용 소프트웨어 프레임워크이다.

CNI는 많은 자바 가상 머신에서 표준으로 사용되는 JNI (Java Native Interface) 프레임워크와 유사하지만, CNI 제작자는 JNI에 비해 CNI가 더 나은 해결책이라고 주장한다.[13]

4. 2. 1. CNI 코드 예시

CNI는 C++과 자바가 동일한 호출 규약과 객체 레이아웃을 가지도록 하여 바이너리 호환을 가능하게 한다. 이러한 특징 덕분에 자바 클래스를 C++ 클래스처럼 사용할 수 있다.[14]

예를 들어, 다음과 같은 자바 클래스가 있다고 가정해 보자.

```java

public class Int

{

public int i;

public Int(int i) { this.i = i; }

public static Int zero = new Int(0);

}

```

이 클래스는 CNI를 통해 다음과 같이 C++ 코드에서 사용할 수 있다.

```cpp

#include

#include

Int *mult(Int *p, int k)

{

if (k == 0)

return Int::zero; // 정적 멤버 접근

return new Int(p->i * k);

}

참조

[1] 웹사이트 GCJ announcement https://gcc.gnu.org/[...]
[2] 웹사이트 GCJ: The GNU Compiler for Java - GNU Project - Free Software Foundation (FSF) https://gcc.gnu.org/[...] 2010-04-22
[3] 서적 Introduction to Compiler Construction in a Java World https://books.google[...] CRC Press Taylor & Francis Group 2014-02-06
[4] 웹사이트 Compiling Java with GCJ | Linux Journal https://www.linuxjou[...]
[5] 웹사이트 GNU Compiler for Java http://freecode.com/[...]
[6] 웹사이트 gcj to use Eclipse compiler as a front end https://gcc.gnu.org/[...] 2007-01-08
[7] 문서 The GCJ FAQ https://gcc.gnu.org/[...]
[8] 문서 GCC Looks To Turn Off Java, Replace With Go Or ADA https://www.phoronix[...]
[9] 웹사이트 '[gcc] Revision 240661' https://gcc.gnu.org/[...] 2016-09-30
[10] 웹사이트 The Deletion of gcj https://tromey.com/b[...] 2016-10-03
[11] 웹사이트 GCC 7 Release Series: Changes, New Features, and Fixes https://gcc.gnu.org/[...] 2017-05-09
[12] 웹사이트 GCJ: The GNU Static Java Compiler http://www.hpl.hp.co[...] 2009-08-02
[13] 문서 The GCJ FAQ – GNU Project – Free Software Foundation (FSF) https://gcc.gnu.org/[...]
[14] 문서 Objects and Classes https://gcc.gnu.org/[...] 2016-10-20
[15] 문서 GCC Looks To Turn Off Java, Replace With Go Or ADA https://www.phoronix[...]
[16] 웹사이트 '[gcc] Revision 240661' https://gcc.gnu.org/[...] 2016-09-30
[17] 웹사이트 The Deletion of gcj http://tromey.com/bl[...] 2016-10-03
[18] 웹사이트 GCC 7 Release Series: Changes, New Features, and Fixes https://gcc.gnu.org/[...] 2017-05-09
[19] 문서 The GCJ FAQ 2.3 Why does GCJ use CNI? http://gcc.gnu.org/j[...]
[20] 웹인용 GCJ announcement https://gcc.gnu.org/[...]



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com