GNU Compiler for Java
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. Több mint tíz évig a GNU Compiler Collection része volt, de 2017-től már nem tartják karban, és nem lesz része a jövőbeni kiadásoknak.[2][3] A GCC 7-től kezdve a GCC Java frontend és a hozzá tartozó libjava futásidejű könyvtár eltávolításra került a GCC-ből. Az aktuális utolsó állapot szerint a GCJ legfeljebb a Java 1.4-es verzióját támogatja, és nem támogatja a JDK 1.5-ben bevezetett újabb nyelvi és futásidejű funkciókat.[4]
GNU Compiler for Java | |
Fejlesztő | The GNU Projekt |
Legfrissebb stabil kiadás | 6.5 (stabil verzió, 2018. október 26.)[1] |
Operációs rendszer | Unix-szerű |
Platform | Java virtuális gép |
Állapot | karbantartási |
Kategória | fordítóprogram |
Licenc | GNU GPL |
A GNU Compiler for Java weboldala |
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.[5]
Története
szerkesztésCsaknem 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.[6]
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. 2008 táján az AWT-s támogatásához a munka folyamatban volt, az akkori állítás szerint a Swing-es támogatási projektet ez után tervezték folytatni.[7] Ez a fejlesztés a jelek szerint nem történt meg. A GNU CLASSPATH fejlesztés még a Java 1.2-vel kompatibilis állapotig sem készült el, és a 2010–2020-as években úgy tűnik, hogy teljesen felhagytak a fejlesztésével (abandoned állapotban van).
2009-es állapot szerint nem jelentettek be újabb fejlesztéseket a gcj-től.[8] A termék jelenleg csak karbantartási üzemmódban van.
Teljesítmény
szerkesztésA 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.[9]
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.[10]
CNI - lefordított natív interfész
szerkesztésA CNI (Compiled Native Interface, korábban Cygnus Native Interface), egy szoftverkeretrendszer 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:[11]
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[12] 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ésJegyzetek
szerkesztés- ↑ GCC Releases - GNU Project
- ↑ Archived copy. [2007. május 9-i dátummal az eredetiből archiválva]. (Hozzáférés: 2010. április 22.)
- ↑ Campbell, Bill. Introduction to Compiler Construction in a Java World. CRC Press Taylor & Francis Group (2013. december 8.). ISBN 978-1-4398-6088-5
- ↑ GCJ - GCC Wiki
- ↑ Compiling Java with GCJ | Linux Journal, 2003
- ↑ gcj to use Eclipse compiler as a front end, 2007. január 8. [2012. augusztus 31-i dátummal az eredetiből archiválva]. (Hozzáférés: 2007. május 20.)
- ↑ The GCJ FAQ - GNU Project - Free Software Foundation (FSF)
- ↑ GCJ: News. [2008. április 18-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. április 18.)
- ↑ GCJ: The GNU Static Java Compiler
- ↑ GCJ vs Java JIT Performance Comparison. [2017. február 25-i dátummal az eredetiből archiválva]. (Hozzáférés: 2012. március 5.)
- ↑ The GCJ FAQ - GNU Project - Free Software Foundation (FSF)
- ↑ The example comes from: http://gcc.gnu.org/onlinedocs/gcj/Objects-and-Classes.html#Objects-and-Classes Archiválva 2012. április 26-i dátummal a Wayback Machine-ben
További információk
szerkesztés- GCJ honlapja
- GCJ kézikönyv
- About CNI section of GCJ Manual
- LWN: GCJ - past, present, and future - the article discuss some history of GCJ.
Fordítás
szerkesztésEz 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. Ez a jelzés csupán a megfogalmazás eredetét és a szerzői jogokat jelzi, nem szolgál a cikkben szereplő információk forrásmegjelöléseként.