Waarom de Java Virtual Machine helpt uw ​​code beter te laten werken

Waarom de Java Virtual Machine helpt uw ​​code beter te laten werken / Programming

Bent u momenteel aan het discussiëren of u Java voor uw volgende toepassing wilt gebruiken of gebruikt u native toolkits en frameworks? Wilt u weten welke voordelen java biedt ten opzichte van native programmering voor een toepassing? Lees verder om erachter te komen!

Wat is een native applicatie?

Een native applicatie is een programma dat specifiek 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 objectvorm met behulp van een compiler, die vervolgens wordt samengevoegd tot een uitvoerbaar bestand door de vereiste bibliotheken te koppelen. Een op deze manier gebouwd programma zal draaien op de specifieke hardware en het besturingssysteem waarvoor het is gebouwd, maar werkt mogelijk niet correct op andere systemen.

Waarom zijn native-applicaties niet draagbaar?

Een compiler voor een taal zoals C / C ++ vertaalt broncodeverklaringen 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 werkt het helemaal niet), omdat de machinetaalinstructies in de gecompileerde code mogelijk niet door deze CPU worden ondersteund.

Bovendien kan het nieuwe besturingssysteem verschillen van het originele besturingssysteem en herkent het het programmabestand mogelijk niet als een uitvoerbaar bestand. Dit komt door verschillende bestandsindelingen die worden gebruikt voor uitvoerbare bestanden van verschillende besturingssystemen (zoals Windows, Linux, MacOS, enz.).

Draagbaarheid is zo'n groot probleem met native applicaties dat alleen het upgraden van de compiler naar de volgende versie kan leiden tot het doorbreken van wijzigingen. Uw code moet mogelijk worden gecorrigeerd om te werken met de nieuwere compiler. Als zodanig spettert de broncode met wat bekend staat als ifdef statements om hardware-, OS- of compiler-specifieke workarounds te isoleren komen vaak voor.

Het volgende is een klein codefragment uit de BZLib-compressiebibliotheek dat het gebruik van illustreert ifdefs om platform-eigenaardigheden te isoleren:

# ifdef _WIN32 # include  # ifdef klein / * windows.h definieer klein naar char * / # undef klein # endif # ifdef BZ_EXPORT # define BZ_API (func) WINAPI func # define BZ_EXTERN extern # else / * importeer vensters dll dynamisch * / # define BZ_API (func) (WINAPI * func) # define BZ_EXTERN # endif #else # define BZ_API (func) func # define BZ_EXTERN extern #endif 

Broncode draagbaarheid 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 de versies van het besturingssysteem vereisen mogelijk enkele wijzigingen in de broncode.

En wanneer u verschillende besturingssystemen zoals Windows en Linux / UNIX in overweging neemt, is draagbaarheid een geheel nieuw balspel. Tenzij u een toolkit of een framework gebruikt dat u volledig isoleert van het besturingssysteem, is het overdragen van de broncode onmogelijk. Dit komt omdat de interface van het besturingssysteem totaal verschillend is tussen deze systemen. Als u in de uiterste hoeken van uw code primitieven van besturingssystemen rechtstreeks gebruikt, is uw code niet overdraagbaar op deze verschillende besturingssystemen..

Hoe is Java anders?

In dit scenario levert Java een nieuw paradigma, een nieuwe manier om software te bouwen. Bij het programmeren in java target je a virtuele machine. Zo'n machine bestaat als een concept en de Java-taal biedt interfaces voor het programmeren van deze machine. U kunt bijvoorbeeld de beschikbare hoeveelheid geheugen, het aantal CPU's, de netwerkinterfaces, enz. Van de virtuele machine opvragen.

Hoe zijn Java-applicaties gebouwd??

De Java-taal biedt een Java-compiler die de broncode omzet in objectcode. De objectcode wordt vervolgens uitgevoerd door de Java virtuele machine, wat een apart programma is van de compiler. Het besturingssysteem ziet op zijn beurt de virtuele Java-machine als slechts een ander programma dat op dat besturingssysteem draait.

De last van portabiliteit is nu verschoven van de applicatieprogrammeur naar de leverancier van Java Virtual Machine. De toepassingsprogrammeur schrijft de software met behulp van de primitieven van de Java-taal en de virtuele Java-machine is verantwoordelijk voor het vertalen van deze primitieven naar de faciliteiten van het hostbesturingssysteem. Wanneer een nieuwe versie van het besturingssysteem wordt uitgebracht, is het de verantwoordelijkheid van de leverancier om de Java-virtuele machine bij te werken zodat deze correct werkt in 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 naar de programmeur van de applicatie. Deze virtuele weergave heeft de vorm van verschillende interfaces en methoden en dient om de toepassingsprogrammeur te isoleren van de verschillen in het host-besturingssysteem en de onderliggende hardware. De toepassingsprogrammeur kan dus toegang krijgen tot faciliteiten zoals een Windowing Toolkit, Netwerken, 3D-afbeeldingen, meerdere CPU's, enz. Zonder toevlucht te nemen tot oproepen op laag niveau, waardoor het programma niet-draagbaar wordt.

Een Java-programma wordt geschreven en gecompileerd met behulp van de Java-compiler. De resulterende objectcode (genaamd bytecode) kan worden getransporteerd naar een ander hostbesturingssysteem dat op verschillende hardware draait en zonder problemen zou moeten werken.

JIT-compiler

De virtuele Java-machine gebruikt een 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 responstijden omdat deze waarschijnlijk in de interactieve modus wordt gebruikt.

Om samen te vatten, een native applicatie is gebouwd voor een specifieke hardware en besturingssysteem. Een Java-applicatie, aan de andere kant, volgt a Bouw een keer Run Anywhere filosofie, door een JVM de gecompileerde byte-code-instructies te laten uitvoeren. Terwijl native applicaties van oudsher werden gezien als meer performant dan Java-toepassingen, is het misschien niet altijd waar vanwege het gebruik van een JIT-compiler door de JVM.

Heb je een native applicatie ontwikkeld en moest je vanwege overstapbaarheid overstappen naar java? Of andersom vanwege prestatieproblemen? Laat het ons weten in de comments hieronder.

Image Credit: Profit_Image via Shutterstock.com

Ontdek meer over: Java.