Ugrás a tartalomhoz

GNU Compiler for Java

A Wikipédiából, a szabad enciklopédiából
A lap korábbi változatát látod, amilyen Zafir (vitalap | szerkesztései) 2012. március 6., 15:32-kor történt szerkesztése után volt. Ez a változat jelentősen eltérhet az aktuális változattól. (CNI - lefordított natív interfész)
GNU Compiler for Java

FejlesztőThe GNU Projekt
Legfrissebb stabil kiadás6.5 (stabil verzió, 2018. október 26.)[1]
Operációs rendszerUnix-szerű
PlatformJava virtuális gép
Kategóriafordítóprogram
LicencGNU GPL
A GNU Compiler for Java weboldala

A GNU Compiler for Java (GCJ vagy gcj) egy szabad szoftver fordítóprogram a Java programozási nyelvhez és része a GNU fordító gyűjteménynek.

A GCJ képes a Java kódot lefordítani JVM bájtkódra, vagy direkt módon a számos CPU architektúra bármelyikének gépi kódjára. Képes továbbá lefordítani bájt kódot tartalmazó class fájlokat vagy teljes JAR fájlokat gépi kódra.

Története

Csaknem minden futtatókörnyezet könyvtár (angolul runtime library), amit a gcj használ a GNU Classpath projektből jön, (de különböznek a libgcj könyvtáraitól). A gcj a 4.3 verziótól, össze lett integrálva az ecj-vel, ami az Eclipse java fordítója.[2]

A 2007-es állapot szerint rengeteg munkát öltek bele abba, hogy a GNU Classpath támogassa a Java két grafikus API-jét: AWT-t és Swing-et. Jelenleg az AWT-s támogatásához a munka folyamatban van, majd miután ezzel megvannak fog folytatódni a Swing-es támogatási projekt.[3]

2009-es állapot szerint nem jelentettek be újabb fejlesztéseket a gcj-től.[4] A termék jelenleg csak karbantartási üzemmódban van.

Teljesítmény

A GCJ-vel gépi kódra lefordított Java kódnak elvileg gyorsabban kéne elindulnia, mint a vele ekvivalens a JVM által elindított bájtkódnak.[5]

Habár az indulás után a GCJ-vel fordított Java kód nem szükségszerűen hajtódik végre gyorsabban, mint a modern JIT-engedélyezett JVM által végrehajtott bájt kód.

Ez még akkor is igaz, ha a GCJ-t haladó szintű optimalizációs opciókkal hívják meg, mint pl. a -fno-bounds-check -O3 -mfpmath=sse -msse2 -ffast-math -march=native;. Ebben az esetben a lefordított program felülmúlhatja esetlegesen a JVM teljesítményét, attól függően, hogy milyen műveleteket hajt végre a kód az adott esetben. [6]

CNI - lefordított natív interfész

A CNI (Compiled Native Interface, korábban Cygnus Native Interface), egy szoftver keretrendszer a gcj-hez, mely lehetővé teszi a Java kódnak, hogy hívjon natív alkalmazásokat (azaz olyan programokat, melyek hardver és operációs rendszer platform specifikusak), C++-ban írt könyvtárakat ill. ezekből is hívható legyen.

A CNI meglehetősen hasonlít a Java Native Interface (JNI) keretrendszerre, amely sztenderdként jön számos Java virtuális géppel, habár a CNI szerzők azt állítják, hogy számos előnye van a JNI-vel szemben:[7]

We use CNI because we think it is a better solution, especially for 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 the idea that languages implemented using Gcc should be compatible where it makes sense, it follows that the Java calling convention should be as similar as practical to that used for other languages, especially C++, since we can think of Java as a subset of C++. CNI is just a set of helper functions and conventions built on the idea that C++ and Java have the *same* calling convention and object layout; they are binary compatible. (This is a simplification, but close enough.)

CNI attól függ, hogy a Java osztályok hogyan jelennek meg C++ osztályokként. Például[8] adott egy Java osztály,

public class Int
{
   public int i;
   public Int(int i) { this.i = i; }
   public static Int zero = new Int(0);
}

melyet így lehet használni:

#include <gcj/cni.h>
#include <Int>

Int *mult(Int *p, int k)
{
  if (k == 0)
    return Int::zero;  // Static member access.
  return new Int(p->i * k);
}

Lásd még

Jegyzetek

Külső hivatkozások