Java (forritunarmál)

:*Athuga skal að [[JavaScript]] er annað og óskylt forritunarmál, sem keyrir yfirleitt á annars konar sýndarvél.*
**Java** er hlutbundið forritunarmál, og er með vinsælli forritunarmálum í heiminum í dag. Það er hannað til að vera óháð vélbúnaði og stýrikerfum.

Java er líka sýndarvél (svokölluð JVM, e. Java Virtual Machine). Og þó að óskyld forritunarmál, s.s. Kotlin (sem er stutt af Google, nú framyfir Java) og Clojure, óskyld hvort öðru og óskyld Java (í forritunarmálsskilningi), þá eru þetta dæmi um JVM-forritunarmál, þ.e. mál sem eru gerð til að keyra líka á Java vél. Hið fyrrnefnda er þó mun skyldara Java, þ.e. mikill skyldleiki eða sameiginleg hugsun, án þess að öll Java forrit sé sjálfkrafa gild Kotlin forrit, en Clojure er allt annað að sjá og notast við annan þankagang. En bæði geta keyrt á sömu Java-vélunum, eða með Java forritum (þ.e. endurnýtt Java kóða frá öðrum, ekki bara staðalkóða Java, e. Java's standard library).

## Saga
Java var þróað í upphafi 10. áratugs 20. aldar af James Gosling hjá Sun Microsystems (sem Oracle keypti). Java var kynnt almenningi árið 1995, og síðan þá hefur það náð töluverðum vinsældum. Málið færði margar gamlar hugmyndir í almenna notkun, svosem hreina hlutbundna forritun, ruslasöfnun og að fylgst er með að ekki sé skrifað út fyrir mörk fylkis, ásamt ýmsum öðrum öryggisráðstöfunum.

## Virkni
Þegar Java forrit er þýtt, verður til millibils kóði (bitakóði, "bytecode") sem er hægt að túlka af Java vél þegar hann er keyrður (venjulega eru Java forrit þó þýdd á keyslutíma, sem er jafngilt, en hraðara; líka er hægt að þýða Java forrit fyrirfram). Öll stýrikerfi sem styðja Java, það er að segja hafa Java-vél, geta keyrt þessi forrit. Java-vélin sér um að breyta bitakóðanum í skipanir sem stýrikerfið og vélbúnaðurinn skilur. Þetta mikilvæga atriði gerir Java mögulegt að keyra á mörgum stýrikerfum og er ein ástæðan fyrir vinsældum Java á Internetinu. Í dag eru m.a. til Java vélar fyrir Microsoft Windows (meir að segja stutt af Microsoft sem í upphafi vildi alls ekki styðja), Linux, macOS og Solaris stýrikerfi. Auk þess sem margir nýir eldri farsímar höfðu innbyggða Java vél, en Android stýrikerfið, sem nú er ráðandi á farsímum, ræður líka viða Java á sinn hátt. Hins vega keyrir Android þó ekki hefðbundið Java bytecode, heldur þarf forritari fyrst að þýða hann fyrir Android. Þetta er tæknilegt atriði sem er ekki tímafrekt né skiptir flesta forritara miklu máli, en þýðir t.d. að niðurstaðan er .apk skrá sem virkar þá ekki á hefðbundinni Java-vél. Það var eitt af upphaflega markmiðunum með Java, að endanlegar skrár gætu keyrt á hvaða Java vél sem er, og er ástæða fyrir að Oracle fór í mál við Google. Í upphafi átti Java líka að keyra á vefsíðum, og gat það um tíma, en síðan þá hafa allir framleiðendur vafra tekið Java-vélar út úr þeim svo Java keyrir hefðbundið ekki lengur þar (en gerir enn oft á vefþjóni). JavaScript (og WebAssembly) keyrir nú þar sem gerði það að gríðarlega vinsælu máli (önnur mál geta þýðst yfir í það mál, svo í raun er samt ekki nauðsynlegt að nota það).

Java er ekki skylt forritunarmálinu JavaScript, nema að hafa svipað nafn og rithátt.

Java er vinsælt til að skrifa hugbúnað sem keyrir á vefþjóni, þá oft með tækni sem nefnist Java Servlets og Java Server Pages.

## Hlutbundin forritun
Fyrsta hönnunarforsenda Java er hlutbundin forritun. Í henni er gegnumgangandi hugmynd að hanna hugbúnað á þann veg að tengja vel saman fyrir hverja tegund gagna, hvaða aðgerðir er hægt að framkvæma á þesskonar gögn. Slík eining er kölluð hlutur. Klasi er skilgreining á gagnategund, ásamt aðgerðum sem hægt er að beita á þesskonar gögn. Klasi er skilgreining, og síðan getur forrit búið til marga hluti af því tagi sem klasinn skilgreinir. Hægt er að hugsa um hlut sem afmarkaða einingu sem hefur hegðun (aðferðir) og ástand (gögn). Meginreglan er að skipta forritinu niður í einingar sem eru hannaðar á þann veg að breyting í einum klasa hafi sem minnst áhrif á aðra hluta forritsins. Þannig er auðveldara að smíða stór kerfi.

Annað markmið hlutbundinnar forritunar er að þróa almenna klasa sem er hægt að endurnýta í mörgum hugbúnaðarverkefnum. Þannig er hægt að byggja kerfi fljótar án þess að þurfa að skrifa allt frá grunni. Það telst mikill kostur að klasi sem hefur verið notaður í mörgum verkefnum er búinn að ganga í gegnum miklar prófanir og lagfæringar. Þó hefur endurnýting klasa ekki náð þeim árangri sem ætlast var til í upphafi. Vandamálið er að erfiðara er að smíða almennan klasa heldur en sérhæfðan, og oft veit forritarinn ekki af þeim klösum sem eru til, þannig að hann getur ekki endurnýtt þá.

Ásamt klösum leyfir Java manni að skilgreina skil (e. interface) sem virkar eins og samkomulag milli forritarans sem skrifar klasa og forritarans sem notar klasann, þó að þeir séu stundum einn og sami forritarinn. Einn kosturinn við þetta er að margir klasar geta uppfyllt sömu skil, og þá getur forritari skipt á milli þeirra og notað þá sitt á hvað, án þess að þurfa að gera miklar breytingar á kóðanum sem notar klasann.

## Sjálfvirk ruslasöfnun
Einn af göllunum við forritunarmál á borð við C++ er fyrirhöfnin sem fylgir því að forritarinn þarf sjálfur að sjá um minnismeðhöndlun. Hann þarf að taka frá minni til að búa til nýja hluti og skila minninu þegar ekki er þörf á hlutnum lengur. Ef forritarinn gleymir að skila minninu, þá getur það leitt til minnisleka, þ.e.a.s forritið þarf alltaf að taka frá meira og meira minni, og hrynur hugsanlega að lokum. Forritið hrynur einnig ef forritarinn reynir að skila minni sem hann er þegar búinn að skila.

Þessi vandamál eru ekki fyrir hendi í Java, vegna þess að Java notar sjálfvirka ruslasöfnun. Minni í kös er tekið frá þegar forritarinn býr til nýja hluti og forritið getur geymt tilvísun sem bendir á nýja hlutinn. Þegar engar tilvísanir eru eftir í hlutinn, þá er ekki lengur hægt að nota hann, og því er óhætt að skila minninu sem hluturinn tekur. Minnislekar geta þó komið upp ef forritið geymir áfram tilvísun á hlut sem ekki er þörf á lengur, en það er mun auðveldara vandamál en vandræðin í C++. Þetta sparar forritaranum mikla vinnu og kemur í veg fyrir margar hugbúnaðarvillur.

## Halló heimur í Java
 public class  {
     public static void main(String[] args) {
         System.out.println("Halló, heimur!");
     }
 }

Þetta forrit prentar út eftirfarandi texta þegar það hefur verið þýtt og keyrt: 

 Halló, heimur!

Önnur mál, t.d. Kotlin, virka líka á Java-vélum, og með Java kóða. Í Kotlin er margt einfaldara og öruggara en í Java (t.d. þarf ofangreint dæmi ekki klasa, e. "class"), hluti af ástæðunum fyrir að Kotlin er nú fyrsta val Google fyrir forrit í Android síma, en áður Google ráðlagði áður Java og notaði eingöngu fyrir Android forrit í fyrstu (sem er þó enn stutt, en er ekki lengur eina forritunarmálið sem er stutt, heldur eitt af mörgum).

## Tenglar
* Hvað er þetta Java?, RHÍ Fréttir - nr. 33 mars 1998