Java (programmēšanas valoda)

**Java** ir augsta līmeņa (*high level*), uz klasēm balstīta, objektorientēta kompilējama programmēšanas valoda, kas izstrādāta tā, lai tai būtu pēc iespējas mazāk atkarību no datora arhitektūras. Šī valodai ir vispārēja lietojuma programmēšanas valoda, kas paredzēta, lai ļautu programmētājiem rakstīt vienreiz programmu un palaist to jebkur (write once, run anywhere WORA), tas nozīmē, ka kompilētais Java kods var darboties visās platformās, kuras atbalsta Java Virtual Machine(JVM)(#Arhitektūras neitrāla), bez nepieciešamības veikt atkārtotu pirmkoda kompilāciju

Java ieguva popularitāti neilgi pēc tas iznākšanas, un kopš tā laika tā ir ļoti populāra programmēšanas valoda. Java bija trešā populārākā programmēšanas valoda 2022. gadā saskaņā ar GitHub datiem, un 2024. gada janvārī tā ir ceturtajā vietā TIOBE indeksā. Lai gan Java joprojām ir plaši populāra, pēdējos gados ir vērojama pakāpeniska Java izmantošanas samazināšanās, un arvien populārākas populārākas kļūst citas valodas, kurās izmanto JVM, piemēram, Kotlin programmēšanas valoda.

Pirmais valodas izlaidums notika 1995. gada, kā galvenā sastāvdaļa no Sun kompānijas Java platformas. Sākotnēji Java kompilatorus, virtuālas mašīnas un klašu bibliotēkas Sun kompānijā izlaida ar patentētām licencēm (*under proprietary licenses*), bet no 2007. gada maija Sun atkārtoti licencējusi lielāko daļu savu Java tehnoloģiju jau zem GPL-2.0 licences.

Oracle kompānijā 2010. gada 27.javarī nopirka (*acquired*) Sun Microsystems kompāniju tādējādi kopā ar Sun Microsystems aktīviem, Oracle pārņēma arī tiesības uz Java programmēšanas valodu un ar to saistītas tehnoloģijas.

Oracle piedāvā savu HotSpot Java virtuālo mašīnu, tomēr oficiālā atsauces ieviešana ir OpenJDK JVM, kas ir bezmaksas atvērtā pirmkoda programmatūra, ko izmanto lielākā daļa izstrādātāju un ir noklusējuma JVM gandrīz visiem Linux distributīviem.

2023. gada 19. septembrī tika izlaista visjaunākā Java programmēšanas valodas versija (vairāk skat "Versijas un izlaidumi" sadaļu) - Java 21, kas ir arī ilgtermiņa atbalsta (LTS) versija. Java 8, 11 un 17 ir iepriekšējās LTS versijas, vēl joprojām tiek oficiāli atbalstītas.

## Vēsture
Valodu 1991. gadā izstrādāja Džeimss Goslings (*James Gosling*), Patriks Noutons (*Patrick Naughton*), Kriss Varts (*Chris Warth*), Eds Franks (*Ed Frank*) un Maiks Šeridans (*Mike Sheridan*) no kompānijas Sun Microsystems. Šī valoda vispirms tika saukta par “Oak”, bet tika pārdēvētā par Java 1995. gadā(vairāk par nosaukumu skāt sadaļu nosaukuma izcelšana). Galvenais iemesls šīs programmēšanas valodas izvadei bija vajadzība pēc platformas neatkarīgas programmēšanas valodas, kas tiktu pielietota programmatūras izvadei plaša patēriņa elektroierīcēm: tosteriem, mikroviļņu krāsnīm, tālvadības pultīm u.c.

Daudzi procesoru veidi tika un tiek izmantoti kā mikrokontrolleri. Mikrokontrolleris (saīsināts arī MCU vai µC) ir kompakta integrēta shēma, kas paredzēta, lai pārvaldītu noteiktu darbību iegultā sistēmā. Tas ir mazs mazjaudas dators vienā mikroshēmā, kurā ir procesors, atmiņa un programmējamas ievades/izvades perifērijas ierīces. Mikrokontrollerus parasti izmanto automātiski vadāmos produktos un ierīcēs, piemēram, automašīnu dzinēju vadības sistēmās, tālvadības pultī, biroja iekārtās, ierīcēs, elektroinstrumentos un rotaļlietās.

Problēma ar tik daudzu mikrokontrolieru veidiem un to arhitektūra bija tāda, ka praktiski visas programmēšanas valodas uz to laika bridi bija kompilējamas programmēšanas valodas, lai kompilētu specifiskajā kompilatora priekš specifiska mikrokontroliera arhitektūras, lai to veiktu ir nepieciešams specifisks kompilators tieši šīm procesoram un/vai operētājsistēmai. Piemēram, programmai, kas ir uzrakstīta izmantojot C++ valodu ir iespējams to palaist un darboties ar to jebkura procesora arhitektūra, bet, tikai gadījuma, ja kompilators atbalsta šo arhitektūru/OS un programma tika pārkompilēta priekš šīs arhitektūras.

Otra problēma izritēja no tā, ka kompilatori ir dārgi un ļoti laikietilpīgi izstrāde. Mēģinot atrast labāku risinājumu Goslings un citi strādāja pie - pārnēsājamas, starp platformu valodas (a*rchitecture neutral*), kas varētu “radīt” kodu, kas varētu darboties dažādos mikro kontrolieros un operētājsistēmas.

Šie centieni galu gala noveda pie programmēšanas valodas JAVA izveides. Javas izstrādāšanas laika otrais un vissvarīgākais faktors tas eksistencei paradījās, kam bija izšķiroša nozīme JAVAs nākotnē, bija globālais tīmeklis.

Uz 1993. gadu kļuva acīmredzams priekš Javas valodas izstrādātājiem, ka programmatūras pārnesamības problēma, kas bija dažādiem mikro kontrolieru arhitektūra un  operētājsistēmām, paradījās arī globāla tīmekļa lietotnēm, kas reiz bija zemas prioritātes problēma kļuvusi par nepieciešamību.

Saprotot to JAVAs izstrādātāji nolēma pielikt visas pūles uz programmatūru priekš globāla tīmekļa, nevis uz programmatūru, kas ir orientēta uz patēriņā elektroniskam ierīcēm. Ja tieksme uz arhitektūras neitrālas programmēšanas valodas izvedi bija dzirkstele tad globālais tīmeklis bija tas, kas noveda pie JAVAs liela mēroga popularitāti un panākumu pasaulē.

1995. gadā kļuva plašāk pazīstama pēc tam, kad Netscape paziņoja par nodomiem iekļaut tās atbalstu savā Navigator pārlūkprogrammā, kas 1990. gados bija vispopulārākā pārlūkprogrammā pasaule. Iemesls Java atbalstam bija tas tehnoloģija ar nosaukumu – “Java applet”.

Java applet - bija nelielas lietojumprogrammas, kas rakstītas Java programmēšanas valodā vai citā programmēšanas valodā, kas kompilējas Java baitkodā, un tika piegādātas lietotājiem Java baitkoda veidā kopa ar lapas saturu.

Lietotājs palaida Java sīklietotni no tīmekļa lapas, sīklietotne tiek palaista JVM, kas pati  ir nošķirts no pašas tīmekļa pārlūkprogrammas process. Tas ļava lapai būt dinamiskai. Līdz ar reaktīvo(*reactive*) tīmekļa lapu iespēju attīstību un JavaScript programmēšanas valodas paradīšanos 2000. gados Java applet tehnoloģija tika reti izmantota. Sakot ar Java 11 versiju “Java-applet” sīklietotņu atbalsts ir netiek atbalstīts (*deprecated*).

Java programmēšanas valodu joprojām var izmantot Web aplikāciju izstrāde priekš tam tiek izmantots “Spring Framework”https://docs.spring.io/spring-framework/docs/3.2.x/spring-framework-reference/html/overview.htmlhttps://www.jetbrains.com/lp/devecosystem-2021/java/;

## Nosaukuma izcelsme
Džeims Goslings, Patriks Noutons (*Patrick Naughton*), strādāja pie projekta "*Green*" (zaļš). Projekta mērķis bija izstrādāt programmēšanas valodu plaša patēriņa elektronisko ierīču programmēšanai. Plaša patēriņa elektriskas ierīces patērē maz enerģijas (No šī fakta projekts ieguva koda nosaukumu – “*Green*”). Šo mazu inženieru komandu, kas darbojas Sun kompānijā sauca par “Green Team”(Zaļa komanda).

Jaunu valodu Džeims Goslings sauca par “Greentalk” jo tas koda failiem bija “.gt” paplašinājums, bet oficiālais nosaukums kļuva par “Oak”(ozols), ka daļa no “Green” projekta. Viena no versijām kāpēc šīs nosaukums ir tas, ka blakus Džeimsa Goslinga ofisam auga liels ozols, kura vārda un nosauca programmēšanas valodu, otra versija, ka ozols ASV, Francijā, Vācijā nozīme spēku.

Izstrādes laikā Sun paziņoja Zaļai komandai, ka “Oak” nosaukumu nevar izmantot priekš valodas nosaukuma, jo “*Oak*” jau bija Oak Technologies kompānijas preču zīmols un ka аrī jau eksistēja programmēšanas valoda ar nosaukumu “Oak”.

Zaļa komandai bija vairākas sapulcēs, lai izvēlētos jaunu nosaukumu priekš programmēšanas valodas. Pēc Džeimsa Goslinga teiktā, "Java nosaukums bija viena no galvenajām izvēlēm kopā ar nosaukumu Silk(zīds)". Tā kā Java valoda bija tik unikāla, lielākā daļa komandas locekļu deva priekšroku Java nosaukumam nekā citiem nosaukumiem. 1995. gadā Sun kompānija izmainīja valodas nosaukumu no “Oak” uz "Java".

"Java" - nosaukumu izvēlējās Džeimss Goslings, dzerot tasi kafijas netālu no sava biroja, jo Java ir sala Indonēzija, kur tika izaudzēta pirmā kafija kurai nosaukums ir Java kafija. Java tika nosaukta pēc Indonēzijas salas Java nosaukuma, lai gan tiek teikts, ka valodas nosaukums izvēle tika iedvesmota no amerikāņu slenga vārda "java", kas nozīme kafiju, kas pats ir atvasināts(*derived*) no salas nosaukuma.

## Filozofijā

Valodas Java izstrādes galvenie mērķi, ko gribēja sasniegt valodas izstrādātāji, kas vēlāk kļuva par Javas de facto filozofiju, bija šādi:

* vienkāršai, objektorientētai, pazīstamai valodai
* vairāk vai mazāk neatkarīgai no datora platformas
* uzticamai un drošai
* Interpretējamai, vairākpavedienošai, un dinamiskai
* jāizpildās ar augstu veiktspēju(*high performance*).

#### Objektu orientēta, vienkāršā, atpazīstamā
JAVAs sintakse ir lielā mēra aizgūta no C/C++ programmēšanas valodas. Tas padarīja programmēšanas valodu atpazīstamu plašam programmētāju lokam. Taču tai ir mazāk zema līmeņa iespēju nekā jebkurai no tām. Piem, nav radītāju(*pointers*), objekti kas nav pamat tipi, piem, ka *char*, *int*, *bool,* tiek nodoti tikai caur referenci. Nevajag manuāli izstrādātajam atbrīvot atmiņu. Par atmiņas atbrīvošanu Java valoda atbild *Garbage collector*.

Tomēr atšķirībā no C++ programmēšanas valodas, kas apvieno strukturētu, vispārīgu un uz objektu orientētu programmēšanu. JAVA no pašiem tas pirmsākumiem tika veidota, lai būtu pilnīgi objektu orientēta programmēšanas valoda. JAVA viss ir objekts, izņemot pamat datu tipus(bool, int, char un float), viss, kas rakstīts JAVA, ir rakstīts klases ietvaros. Ja tiek radīts jauna klase, piem, “A”, tad ta netieši pārmato no super klases `java.lang.Object`. Tā ir superklase visam, ko var radīt Java izpildlaika.

#### Arhitektūras neitrāla
“Write once, run anywhere” slogans, ko pielietoja “Sun Microsystems”, kad tika izstrādāta JAVA. Tas nozīmē, kā JAVA ir platformas neatkarīga programmēšanas valoda, tas nozīme  ka programmas rakstītas uz JAVA var tikt palaista jebkurā datora neatkarīgi no ta arhitektūras vai OS, ja šo arhitektūru atbalsta Java virtuālas mašīna(JVM).

Kods kas uzrakstīts izmantojot Java valodu tiek kompilēts izmantojot JDK kompilatoru. JDK jeb Java Developer Kit ir starp platformu programmatūras izstrādes vide, kas piedāvā rīku un bibliotēku kolekciju, kas nepieciešama uz Java balstītu programmatūras lietojumprogrammu un sīklietotņu izstrādei. Tajā iekša ir, piem, Java kompilators, linteris (*linter*), pamat bibliotēkas, JAVA debugger u.c. Populārākie JDK ir

* **OpenJDK**, kas ir atvērtā pirmkoda projekts, kuru attīsta JAVA entuziasti un ir bezmaksas
* **OracleJDK** ir Oracle izstrādāts un  licencēts  JAVA valodas JDK, kas priekš nepersonīgiem projektiem ir par maksu.

JDK kompilators kompilē kodu par baitkodu, kas ir speciāls kods, kas domāts izpildei JVM vide. Jau pati JVM pārveido šos baitkodus par mašīnas valodu, kas var būt izpildīti šajā specifiskajā mašina.

Kompilators garantē, ka baitkodi nepārkāpj drošības prasības, ja baitkodi tiek iegūti no citiem avotiem, piem, no globālā tīkla, rodas šāda problēma, ka kodus var izveidot ar citiem līdzekļiem, nevis ar Java kompilatoru. Tāpēc izpildlaika sistēma rūpīgi pārbauda saņemtos kodus izmantojot baitkoda verifikātoru(*bytecode verifier*), ka tie atbilsts drošības prasībām pārbaužu, piem, ka baitkodu failam nevar būt steka pārpildīšana, bait koda instrukcijām ir pareizi tipi u.c.

Tomēr vel joprojām ir iespējams uzrakstīt programmu izmantojot JAVA, kas var darboties uz vienas platformas bez problēmām, bet programmas kļūdas paradīties cita platforma. Jo ir vairākas JVM implementācijas un virsu tam dažādas OS, var būt nelielas atšķirības tajā, ka uzrakstītā programma var darboties JVM/OS kombinācijas deļ. Tādēļ iespējams būs nepieciešams pārbaudīt uzrakstītu programmu katra platforma, kur šī programma tiks palaista. Tas bija iemesls starp Java izstrādātājiem joka paradīšanos “Write Once, Debug Everywhere” uzraksti vienu reizi , atkļūdo visur.

#### Uzticama un droša
Java atvieglo programmatūras izvedi, kur pārbaude notiek ne tikai kompilācijas posma, bet arī pati sistēma JVM analīze izpildes posma laikā kodu. JAVA izveidota tā, lai pašu lietotāju pieradinātu pie “pareiza” programmēšanas koda, bibliotēku, iebūvētu klašu un funkciju dēļ.

Lai JAVA būtu droša daudzas C/C++ priekšrocības(*features*) tika atmestas. Piemēram, nevar pielietot radītājus(*pointer*), kas ļāva izvairīties no veselas kaudzes kļūdu, saistība ar atmiņas noplūdi(*memory leak*), operatoru pārslodze(overloading) izņemot “+” priekš *string* tipa kontantinācijas, tiek garantēts iebūvētu tipu bitu daudzums, jeb *int* vienmēr būs 4 baitu liels visas platformās, C/C++ valoda tas ir arhitektūras atkarīgs lielums.

#### Interpretējama, vairākpavedienošana, un dinamiska
Interpretējama valodas daba ļāva linkošanu fāzi padarīt daudz vienkāršāku, inkrementālāku un līdz ar to ātrāku. Tas krasi ļāva samazināt programmatūras izstrādes procesu un programmas testēšanu laiku.

Vairākpavedienošana (*Multi-thread*), ļauj vienas programmas ietvaros veikts vairākus uzdevumus (*task*) vienlaicīgi, tādējādi var sadalīt uz vairākiem pavedieniem (*threads*) laik ietilpīgus vai / un sarežģītus uzdevumus nebloķējot pašu aplikācijas izpildi. Tādējādi efektīvāk izmantot mašīnas resursus un procesora laiku. Vairākpaveidienošāna Java tiek atbalstīta uz programmēšanas valodas līmeņa, dēļ jau iebūvētam iekšējam bibliotēkām, kas ir pavedien drošas (*thread-safe*), un var tikt lietotas vairākpavedienošu programmu izvēde, gan arī iebūvētu pavedienu sinhronizācijas līdzekļu dēļ – muteksi, semafori, monitori u.c. C++ valoda, kas tika izdota (*reliesed*) 1985. gada vairāk pavedināšanā paradījās līdz ar C++11 standarta publicēšanu 2011. gada.

Sistēma atbalsta dinamisku programmas montāžu tas nozīme, ka programmas klases lejup lādējas programmas darbošanās laika pēc programmas vai programmētāja pieprasījuma. Tas ļauj veikt izmaiņas aplikācija, nevajag pārinstalēt(*re-install*) aplikāciju, lai dabūtu jaunākas izmaiņas aplikācija vai to pārkompilēt. Lietotājs var būt drošs, ka vienmēr izmanto jaunāko aplikācijas versiju.

#### Augsta veiktspēja
Kaut gan bija diezgan lēnākā veiktspēja JAVA programmām salīdzinot ar programmām, kas tika rakstītas uz C vai C++ valodām, tāpēc JAVA valodai bija sliktas veiktspējas reputācija ilgu laiku. Jaunākas JVM versijas radīja iebūvētus darbarīkus, kas paātrina programmas īstenošanu nekā iepriekš. Viens no tādiem īstenošanas veidiem bija tieša koda kompilācija, atmetot pašu JVM, bet tādējādi tiek zaudēta programmas pārnesamība.

## Programmatūrā izstrādāta izmantojot Java
Izmantojot JAVA programmēšanas valodu tika izstrādātas pasaule populāras programmas, sākot no programmatūras, kura tika izmantota priekš **Maestro Mars Rover controller**, kuru izmantoja, lai pētītu Marsa grunti un  **NASA WorldWind** programmatūrā, kas ļauj izveidot interaktīvas ģeogrāfiskās informācijas vizualizācijas 3D planētas kontekstā, līdz datorspēlei Minecraft, kuru vienlaikus ikmēnesi spēle vairāk par 170 miljoniem spēlētāju. Tālāk ir dažu populāru programatūru saraksts, kas ir vai nu pilnība uzrakstīts izmantojot JAVA valodu vai lauvas tiesu satur sevī JAVA kodu.

**Jenkins** - ir atvērtā koda nepārtrauktas integrācijas serveris, kas ātri un automātiski izveido, pārbauda(piem, palaižot programmatūras unit testus) un izvieto(*deploy*) lietojumprogrammu. Tas bieži tiek atzīts par vienu no pirmajiem DevOps rīkiem, kas padarīja "infrastruktūru kā kodu" iespējamu.

**Apache OpenOffice un LibreOffice-** ir atvērtā koda biroja produktivitātes programmatūras komplekti, kura komponentes vai nu pilnīgi uzrakstītas izmantojot JAVA vai daļēji, lai šīs programmatūras pilns funkcionāls strādātu Java ir nepieciešama. Šīs programmatūras kompolekts ir alternatīva maksas Microsoft 365 produktu komplektiem, kas sastāv sevī tādas programmās, ka - Excel, Word, PowerPoint, u.c.

**Android OS** - ir mobilā operētājsistēma, kuras pamatā ir modificēta Linux kodola versija un cita atvērtā pirmkoda programmatūra, kas galvenokārt paredzēta mobilajām ierīcēm, piemēram, viedtālruņiem un planšetdatoriem. Java tiek izmantota galvenokārt priekš UI, bet C valoda priekš OS kodola.

**[[Google Docs|Google docs]]** - ir bezmaksas internetā bāzēts teksta procesors, izklājlapu un prezentāciju programma, kas ir alternatīva  Microsoft 365 produktu komplektiem. Google dokumenti ļauj lietotājiem izveidot un rediģēt dokumentus tiešsaistē, vienlaikus sadarbojoties ar citiem lietotājiem reāllaikā. Java tiek izmantota, priekš Back-end daļas.

### Izstrādes vides
**Eclipse** - izstrādāja IBM kompānijā 2001. gada, kompanijas izstrādāšanas mērķis bija izveidot programmētāju vidi, kas spētu konkurēt ar Microsoft Visual Studio popularitāte. Šī IDE ir bezmaksas un ir atvērtā avota (*open source*) programmatūrā, kas pati ir rakstīta izmantojot Java un priekš JAVA, tomēr spraudņu(*plugin*) arhitektūras dēļ ir iespēja Eclipses vidē izstrādāt programmāturu izmantojot arī citas programmēšanas valodas, piemēram, C++, Ruby, Python u.c.

**NetBeans** - dzima, ka Prāgas studentu projekts 1996. gada, vēlāk par komerciālu produktu pārtapa 1997. gada, bet 1999. gada tika pārdota kompānijai Sun Microsystems un 2000. gada kļuva par atvērtā avota programmatūru.

**IntelliJ IDEA** - ir IDE, kura ir uzrakstīta izmantojot Java programmēšanas valodu, un kuru var izmantot Java, Kotlin, Groovy un citās JVM valodās priekš programmāturas izstrādāšanas. To izstrādāja JetBrains (agrāk pazīstama kā IntelliJ) kompānijā, un šī IDE ir pieejama divos veidos kā Apache 2 licencēts kopienas izdevums un patentēts komerciāls izdevums.  Abus izlaidumus var izmantot komerciālas programmatūras izstrādei. Pēc 2023 Java Developer Productivity Report datiem uz 2023. gadu. Tā ir vispopulārākā IDE jeb 42% no respondentiem noradīja, ka izmanto šo IDE priekš izstrādes.

## Kompānijas, kas izmanto/izmantoja Java programmēšanas valodu

### Vairāki uzņēmumi ir paziņojuši, ka izmanto JAVA

* eBay
* Amazon
* LinkedIn
* X(Twitter)
* Instagram
* Airbnb
* Uber
* Google
* Netflix
* Spotify

### Uzņēmumi, kas atteicas izmantot JAVA

*  PayPal
* SalesForce

## Versijas un izlaidumi
No 2023. gada septembra Java 8, 11, 17 un 21 tiek atbalstītas kā ilgtermiņa atbalsta versijas (LTS). Oracle kompānijā 2019. gada janvārī izlaida pēdējo bez maksas publisko atjauninājumu mantotajai (legacy) versijai Java 8 LTS komerciālai lietošanai, lai gan Oracle joprojām atbalstīs Java 8  versiju ar publiskiem atjauninājumiem priekš personiskai lietošanai.

Galvenās Java izlaišanas versijas, kā arī to izlaišanas datumi:

## [[Sveika, pasaule!]]
 public class HelloWorld 
 {
     public static void main(String[] args) 
     {
         System.out.println("Sveika, pasaule!");
     }
 }

## Atsauces

## Ārējās saites

* Java lapa Oracle vietnē