GNU Compiler for Java

A Wikipédiából, a szabad enciklopédiából
GNU Compiler for Java
Gcj2.png

Fejlesztő The GNU Projekt
Legfrissebb stabil kiadás 4.x (2009. szeptember 22.) +/-
Legfrissebb fejlesztői kiadás ismeretlen +/-
Operációs rendszer Unix-szerű
Állapot karbantartási
Kategória fordítóprogram
Licenc GNU 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[szerkesztés | forrásszöveg szerkesztése]

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.[1]

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.[2]

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

Teljesítmény[szerkesztés | forrásszöveg szerkesztése]

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.[4]

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 akár felül is múlhatja a JVM teljesítményét, persze attól függően, hogy milyen műveleteket hajt végre a kód az adott esetben. [5]

CNI - lefordított natív interfész[szerkesztés | forrásszöveg szerkesztése]

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:[6]


Azért használjuk a CNI-t, mert jobb megoldásnak gondoljuk, különösen egy olyan Java implementációhoz, amely azon az ötleten alapul, hogy Java nem más, mint csak egy másik programozási nyelv, amely implementálható a sztenderd fordítási technikák használatával. Ezt alapul véve, valamint az ötletet, hogy a nyelveket a Gcc használatával implementálva kompatibiliseknek kellene lenniük - ahol ez értelmes -, az következik, hogy a Java hívási konvenciója gyakorlatilag annyira hasonlónak kell legyen ahhoz, hogy más nyelvekre is használhatjuk különösen C++-ra. Habár a Java-ra úgy tekinthetünk, mint a C++ egy részhalmazára. A CNI csak segítő funkciók és konvenciók egy halmaza, amely abból az ötletből indult ki, hogy a C++-nak és Java-nak *ugyanaz* a hívási konvenciója és objektum elhelyezése van; így binárisan kompatibilisek. (Ez kissé nagyvonalú, de még pontos leegyszerűsítése a dolgoknak.)

CNI attól függ, hogy a Java osztályok hogyan jelennek meg C++ osztályokként. Például[7] 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);
}

Kapcsolódó szócikkek[szerkesztés | forrásszöveg szerkesztése]

Jegyzetek[szerkesztés | forrásszöveg szerkesztése]

További információk[szerkesztés | forrásszöveg szerkesztése]

Fordítás[szerkesztés | forrásszöveg szerkesztése]

Ez a szócikk részben vagy egészben a GNU Compiler for Java című angol Wikipédia-szócikk ezen változatának fordításán alapul. Az eredeti cikk szerkesztőit annak laptörténete sorolja fel.