Advertentie
Overweegt u momenteel of u Java voor uw volgende toepassing wilt gebruiken of native toolkits en frameworks wilt gebruiken? Wilt u weten welke voordelen java biedt ten opzichte van native programmeren voor een applicatie? Lees verder om erachter te komen!
Wat is een systeemeigen applicatie?
Een native applicatie is een programma dat speciaal is geschreven voor een besturingssysteem (OS), en mogelijk voor de specifieke hardware waarop dat besturingssysteem draait. Het is meestal geschreven in een taal zoals C / C ++. De C / C ++ broncode wordt gecompileerd naar een objectformulier met behulp van een compiler, die vervolgens wordt samengesteld tot een uitvoerbaar bestand door de vereiste bibliotheken te koppelen. Een programma dat op deze manier is gebouwd, wordt uitgevoerd op de specifieke hardware en het besturingssysteem waarvoor het is gebouwd, maar werkt mogelijk niet correct op andere systemen.
Waarom zijn systeemeigen applicaties niet draagbaar?
Een compiler voor een taal zoals C / C ++ vertaalt broncode-instructies in machinetaal voor de beoogde CPU. Wanneer u probeert deze code op een andere CPU uit te voeren, werkt het programma mogelijk niet correct (of helemaal niet) omdat de instructies in de machinetaal in de gecompileerde code mogelijk niet worden ondersteund door deze CPU.
Bovendien kan het nieuwe besturingssysteem verschillen van het originele en herkent het het programmabestand mogelijk niet eens als een uitvoerbaar bestand. Dit komt door verschillende bestandsindelingen die worden gebruikt voor uitvoerbare bestanden op verschillende besturingssystemen (zoals Windows, Linux, MacOS, enz.).
Draagbaarheid is zo'n groot probleem met systeemeigen applicaties dat alleen het upgraden van de compiler naar de volgende versie baanbrekende veranderingen met zich mee kan brengen. Uw code moet mogelijk worden gerepareerd om met de nieuwere compiler te werken. Als zodanig spettert de broncode met wat bekend staat als ifdef instructies om hardware-, besturingssysteem- of compilatorspecifieke oplossingen te isoleren komen vaak voor.
Het volgende is een klein codefragment van BZLib-compressiebibliotheek wat het gebruik van illustreert ifdefs om eigenaardigheden van het platform te isoleren:
#ifdef _WIN32. # omvatten # ifdef small / * windows.h definieer klein om te char * / # undef klein. # stop als. # ifdef BZ_EXPORT. # definieer BZ_API (func) WINAPI func. # definieer BZ_EXTERN extern. # else / * importeer windows dll dynamisch * / # definieer BZ_API (func) (WINAPI * func) # definieer BZ_EXTERN. # stop als. #anders. # definieer BZ_API (func) func. # definieer BZ_EXTERN extern. #stop als.
Draagbaarheid van broncode over besturingssystemen
Deze situatie kan tot op zekere hoogte worden verlicht door de C / C ++ -broncode opnieuw te compileren naar de nieuwe CPU. Het besturingssysteem voor de nieuwe CPU kan echter anders zijn. En de broncode kan niet worden gecompileerd zonder wijzigingen, groot of klein. Zelfs kleine wijzigingen in versies van het besturingssysteem vereisen mogelijk enkele wijzigingen in de broncode.
En als je kijkt naar verschillende besturingssystemen zoals Windows en Linux / UNIX, is draagbaarheid een geheel nieuw balspel. Tenzij u een toolkit of een framework gebruikt dat u volledig isoleert van het besturingssysteem, is overdraagbaarheid van broncode onmogelijk. Dit komt omdat de interface van het besturingssysteem totaal verschillend is tussen deze systemen. Als u, in de verste uithoeken van uw code, rechtstreeks primitieven van het besturingssysteem gebruikt, dan is uw code niet overdraagbaar op deze diverse besturingssystemen.
Hoe is Java anders?
In dit scenario levert Java een nieuw paradigma op, een nieuwe manier om software te bouwen. Bij het programmeren in Java richt je je op a virtuele machine. Zo'n machine bestaat als concept en de Java-taal biedt interfaces voor het programmeren tegen deze machine. U kunt bijvoorbeeld de beschikbare hoeveelheid geheugen, het aantal CPU's, de netwerkinterfaces enz. Van de virtuele machine opvragen.
Hoe worden Java-applicaties gebouwd?
De Java-taal biedt een Java-compiler die de broncode vertaalt in objectcode. De objectcode wordt dan uitgevoerd door de java virtuele machine, wat een apart programma is van de compiler. Het besturingssysteem beschouwt op zijn beurt de virtuele Java-machine als gewoon een ander programma dat op dat besturingssysteem wordt uitgevoerd.
De draagbaarheid is nu verschoven van de applicatieprogrammeur naar de leverancier van virtuele Java-machines. De applicatieprogrammeur schrijft de software met behulp van de primitieven van de Java-taal en de Java virtuele machine is verantwoordelijk voor het vertalen van deze primitieven naar het host-besturingssysteem voorzieningen. Wanneer een nieuwe versie van het besturingssysteem uitkomt, is het de verantwoordelijkheid van de leverancier om de virtuele Java-machine bij te werken zodat deze correct werkt op het nieuwe besturingssysteem.
Wat zijn de voordelen van de Java Virtual Machine?
Zoals eerder vermeld, biedt de virtuele Java-machine een virtueel beeld van het besturingssysteem en de hardware voor de applicatieprogrammeur. Deze virtuele weergave heeft de vorm van verschillende interfaces en methoden en dient om de applicatieprogrammeur te isoleren van de verschillen in het host-besturingssysteem en de onderliggende hardware. De applicatieprogrammeur heeft dus toegang tot faciliteiten zoals een Windowing Toolkit, netwerken, 3D-graphics, meerdere CPU's, enz. zonder dat u toevlucht hoeft te nemen tot oproepen op laag niveau, waardoor het programma uiteindelijk niet draagbaar wordt.
Een java-programma is geschreven en wordt gecompileerd met behulp van de java-compiler. De resulterende objectcode (genaamd byte code) kan worden getransporteerd naar een ander hostbesturingssysteem dat op verschillende hardware draait en zou zonder problemen moeten werken.
JIT-compiler
De virtuele Java-machine gebruikt a JIT-compiler om de bytecode specifiek voor de doel-CPU te optimaliseren. JIT staat voor Net op tijd en verwijst naar de runtime-optimalisaties die de JVM toepast op de bytecode om deze beter te laten werken op de huidige CPU.
Een ander voordeel van het gebruik van de Java Virtual Machine is dat het verschillende optimalisaties kan toepassen voor verschillende use-cases, allemaal met dezelfde bytecode. De Oracle JVM biedt bijvoorbeeld twee opties voor het uitvoeren van de bytecode: een servermodus en een clientmodus. De servermodus optimaliseert voor langlopende serverprogramma's, terwijl de client-JVM-modus optimaliseert voor snelle reactietijden omdat deze waarschijnlijk in interactieve modus wordt gebruikt.
Samenvattend is er een native applicatie gebouwd voor een specifieke hardware en besturingssysteem. Een Java-toepassing volgt daarentegen a Build Once Run Anywhere filosofie, door een JVM de gecompileerde bytecode-instructies te laten uitvoeren. Hoewel native applicaties traditioneel als performanter werden beschouwd dan java-applicaties, is dit misschien niet altijd het geval vanwege het gebruik van een JIT-compiler door de JVM.
Heeft u een native applicatie ontwikkeld en moest u vanwege de draagbaarheid overstappen op Java? Of andersom vanwege prestatieproblemen? Laat het ons weten in de reacties hieronder.
Beeldcredits: Profit_Image via Shutterstock.com