Systeemonafhankelijk |
Java is systeemonafhankelijk. Dit wordt gerealiseerd door elke Java programma via een software tussenlaag - de Virtuele Machine - te draaien
Een Java programma zoals die is geschreven door een programmeurs is tekst. Gewone tekst geschreven in een tekstverwerker. De tekst wordt vertaald door een compiler. De uitvoer van een compiler is zogenaamde bytecode. Dit is de programmacode die de virtuele machine kan verwerken. De virtuele machine zal de bytecode vertalen naar de machinetaal van de echte processor.

Bij het ontwerpen van de bytecode is er voor gekozen om de bytecode veel te laten lijken op machinetaal. (Het schijnt veel op de machinetaal van de SPARC processor van SUN te lijken) Deze sterke gelijkenis maakt het mogelijk om de meeste bytecode instructies in snel te vertalen in de echte machinetaal.
In de JDK wordt deze vertaalstap uitgevoerd door de compiler javac. Stel je hebt een Java programma geschreven en bewaart onder de naam Test.java. Dan luidt de vertaalstap
javac Test.java
Het vertaalde bestand die de bytecode bevat heeft de naam Test.class
De vertaalstap van bytecode kan op twee manieren. De bytecode
wordt geinterpreteert. Dit wil zeggen dat iedere regel in de
bytecode eerst wordt gelezen, dan wordt vertaald en vervolgens
wordt uitgevoerd. Dit zijn dus drie stappen waar een programma
zonder virtuele machine er slecht twee nodig had (lezen en
uitvoeren). Interpreteren is dus heel erg traag. Vooral is een
lus die duizend keer wordt uitgevoerd wordt ook duizend keer de
vertaalstap uitgevoerd. Een Java programma dat wordt
geinterpreteerd is ongeveer 8 keer trager dan hetzelfde C++
programma.
In de JDK(1.0 en 1.1) van SUN zit een interpreter onder de naam java.
De interpreter wordt aangeroepen met
java Test.class
De extensie .class kan weggelaten worden
Een andere strategie is een Just In Time compiler. De klasse die als bytecode bestand wordt aangeboden wordt in zijn geheel vertaal van bytecode naar machinetaal. Daarna wordt het programma alleen vanuit de machinetaal uitgevoerd. Het voordeel is evident. Vooral is een herhalingslus van duizend keer is er nu slechts één vertalingstap en duizend uitvoeringsstappen. De snelheid van JIT programma's komen dicht in de buurt van C++.
In de verschillende browsers Internet Explorer, Netscape, maar ook in ontwikkelomgevingen JBuilder, Symantec Visual Cafe zitten Just In Time compileren. Er is een ware wedren gaande om de snelle JIT te bouwen. Dit is alleen maar gunstig voor de gebruiker.
Vanaf JDK1.1.6 wordt de JIT van Symantec meegeleverd.
| Java (alleen JIT) | C++ | Java versus C++ | |
| programmagrootte | klein | zeer groot | veel sneller laadtijd(zeker over internet) |
| vertalen | JIT | geen | eenmalige vertaalstap aan het begin kost tijd |
| programmacode | snel | snel | beide hebben dezelfde onderliggende architectuur |
Gemiddeld is een Java programma iets langzamer dan een C++ programma. Dit wordt veroorzaakt door de vertaalstap na het laden. Vooral bij kleine programma's die lang draaien kan deze stap relatief kort zijn en er wordt winst geboekt met de snellere laadtijd.
Er wordt gewerkt aan een nieuw compiler concept: een zgn hotspot compiler. Deze zoekt de bytecode af op programmafragmenten die danwel gecompileerd dan wel geinterpreteerd moeten worden. The best of both worlds