Siirry sisältöön

Java-virtuaalikone

Wikipediasta
Tämä on arkistoitu versio sivusta sellaisena, kuin se oli 30. maaliskuuta 2023 kello 22.00 käyttäjän Canonmeister (keskustelu | muokkaukset) muokkauksen jälkeen. Sivu saattaa erota merkittävästi tuoreimmasta versiosta.
Yleiskatsaus Java-virtuaalikoneen (JVM) arkkitehtuuriin, joka perustuu Java SE 7 Edition -spesifikaatioon.

Java-virtuaalikone (JVM) on abstrakti kone (virtuaalikone), joka suorittaa sille käännettyjä Java-ohjelmia.[1] Virtuaalikone on toteutettu ohjelmallisesti oikean laitteiston ja käyttöjärjestelmän päällä ajettavaksi.[1] Java-kielellä tehdyt ohjelmat käännetään tavukoodiksi ja suoritetaan JVM:llä oikeassa ympäristössä.[1]

Java-virtuaalikoneen avulla voidaan ajaa myös eräillä muilla ohjelmointikielillä tehtyjä ohjelmia, jotka on käännetty JVM:n tukemaksi tavukoodiksi. JVM-spesifikaatio (engl. JVM Specification) kuvaa JVM-toteutuksen formaaliset vaatimukset. Spesifikaatio varmistaa Java-ohjelmien yhteentoimivuuden eri toteutusmuodoissa, jotta Java-kehitystyökaluja (JDK) käyttävien ohjelmiston kehittäjien ei tarvitse huolehtia taustalla olevan laitteistoalustan erilaisuuksista.

JVM:n tarkka määrittely

Määritelmän mukaisesti Java virtuaalikone on abstrakti (virtuaalinen) tietokone. Se on osa Javan runtime-ympäristöä. Ympäristössä käytetään jätteiden keräysalgoritmia eikä mitään muita Javan sisäisiä optimointeja ole eritelty, joita Javan virtuaalikoneen ohjeet käyttävät. Tärkein syy jättää tämä pois on se, että virtuaalitietokoneen toteuttajia ei rajoiteta tarpeettomasti. Mikä tahansa Java-ohjelma voidaan ajaa jonkin konkreettisen toteutuksen sisällä, joka sisältää Javan virtuaalitietokoneen yksityiskohdat.


Javan Standard Edition (J2SE) 5.0 versiosta lähtien muutoksia JVM:n tarkkaan määrittelyyn on kehitetty Java Community Process:in (JSR 924) alaisuudessa. Vuodesta 2006 lähtien JSR 202:n ehdottamien luokkatiedoston muutosten tukemiseksi suoritetaan JSR 924:n ylläpitolisenssiversiona. Tarkka määritelmä JVM:lle julkaistiin "blue book" kirjana, jonka alkupuhe toteaa:

Tarkoituksenamme on, että tämä tarkkan määrittelyn tulisi riittävästi dokumentoida Javan virtuaalitietokonetta, jotta voidaan tehdä yhteensopivia clean-room - toteutuksia. Oracle tarjoaa testejä, jotka varmistavat, että Javan virtuaalitietokoneen toteutus toimii oikein.


Eräs Oraclen JVM:stä on nimetty HotSpotiksi. Toinen on periytynyt BEA Systemsiltä ja sen nimi on JRockit. Oracle omistaa Java-tavaramerkin ja voi sallia sen käytön implementaatiopaketeissa varmistaakseen, että ne ovat täysin yhteensopivia Oracle:n specifikaation kanssa.

Luokkalataaja

Yksi organisationaalinen yksikkö JVM:n koodissa on luokka. Luokkalataajan käyttöönottajan tulee olla mahdollista tunnistaa ja ladata mitä tahansa, jota mukautuu Java luokan tiedosto tyyppiin. Minkä tahansa toteutuksen tulee olla vapaa tunnistamaan muita kaksiosaisia tyylejä lukuun ottamatta luokkatiedostoja, mutta sen tulee kuitenkin tunnistaa luokkatiedostot.

Luokkalataaja suorittaa kolme perus aktiviteettia tässä tarkassa järjestyksessä:

  1. Lataaminen: löytää ja tuo tyypin binääritiedot
  2. Linkittäminen: suorittaa verifioinnin, valmistelun ja valikoiduissa tilanteissa resoluution säädön.
    • Verifiointi: Varmista tuodun tyypin oikeinkirjoituksen
    • Valmistelu: Allokoi muistia luokkan muuttujille ja alustaa muistin perus arvoihin
    • Resoluutio: Muuttaa tyyppien symboliset maininnat suorin mainintoihin.
  3. Käyttöönotto: Herättää Java koodin, joka käyttöönottaa luokan muuttujat niiden tiettyihin lähtöarvoihin.

Yleisesti käytössä on kolme luokkalataaja tyyppiä. Ne ovat bootstrap -luokkalataaja, extension -luokkalataaja sekä System / Application -luokkalataaja.

JVM:n tukemat kielet

JVM-kieliä on useita. JRuby ja Jython ovat kenties tunnetuimpia JVM-käännöksiä Ruby ja Python -kielistä. Java-tavukoodiksi kääntyviä vakiintuneita kieliä ovat muun muassa Clojure, Apache Groovy, Scala ja Kotlin. JVM-kielten merkittävä piirre on, että ne ovat yhteensopivia toistensa kanssa, joten esimerkiksi Scala-kirjastoja voidaan käyttää Java-ohjelmien kanssa ja päinvastoin. [2]

Java Runtime Environment

Java Runtime Environment (JRE) on vapaasti saatavilla oleva ohjelmisto, joka sisältää itsenäisen virtuaalikoneen (HotSpot), standardikirjaston (Java Class Library), ja konfigurointiohjelman. Se on yleisin JVM-ajoympäristö.

Avoimen lähdekoodin ympäristöjä ovat OpenJDK GPL-2.0 ohjelmistolisenssillä linkittämispoikkeuksella ja Eclipse (aikaisemmin IBM) OpenJ9.

Android-käyttöjärjestelmää käyttävät järjestelmät kääntävät ohjelmat Android Runtime (ART) -ajoympäristölle, joka kääntää ohjelmaa natiiville konekielelle: aiemmin Androidissa on käytetty Dalvik-virtuaalikonetta.[3][4][5]

JVM verkkoselaimessa

Kun Java-alusta oli vielä vasta elinkaarensa alussa, JVM:ää markkinoitiin verkkoteknologiana Rich Web Applications -sovellusten luomiseen. Vuodesta 2018 lähtien useimpien verkkoselaimien ja verkkoselaimia yhdistävien käyttöjärjestelmien mukana ei toimiteta Java-laajennusta, eivätkä ne sallineet muiden kuin Flash -laajennusten sivulatausta . Java-selainlaajennus poistettiin käytöstä JDK 9:ssä.[6]

NPAPI Java-selainlaajennus oli suunniteltu sallimaan JVM suorittaa niin sanottuja Java-sovelmia, jotka on upotettu HTML-sivuille. Selaimille, joihin laajennus on asennettu, sovelma voi piirtyä sille osoitetun sivun suorakaiteen muotoiseen alueeseen. Koska laajennus sisältää JVM:n, Java-sovelmat eivät rajoitu vain Java-ohjelmointikieleen, sillä mikä tahansa JVM:ään kohdistettu kieli voi toimia laajennuksessa. Rajoitettu joukko sovellusliittymiä sallii sovelmien pääsyn käyttäjän mikrofoniin tai 3D-kiihdytykseen, vaikka sovelmat eivät pysty muokkaamaan sivua sen suorakulmaisen alueen ulkopuolella. Adobe Flash Player, tärkein kilpaileva teknologia, toimii samalla tavalla tässä suhteessa.

Kesäkuuhun 2015 mennessä, W3Techsin mukaan Java-sovelman ja Microsoft Silverlightin käyttö oli pudonnut 0,1 prosenttiin kaikilla verkkosivuilla, samaan aikaan Flashin käyttö oli pudonnut 10,8 prosenttiin.[7]

JavaScript JVM:t ja tulkit [ muokkaa lähdettä ]

Toukokuusta 2016 lähtien JavaPoly sallii käyttäjien tuoda muokkaamattomia Java-kirjastoja ja kutsua niitä suoraan JavaScriptistä. JavaPoly sallii verkkosivustojen käyttää muokkaamattomia Java-kirjastoja, vaikka käyttäjän tietokoneeseen ei olisi asennettu Java.

Käännös JavaScriptiin [ muokkaa lähdettä ]

JavaScript-suoritusnopeuteen jatkuvat parannukset sekä mobiililaitteiden lisääntynyt käyttö, joiden verkkoselaimet eivät tue laajennuksia, on pyritty kohdistamaan nämä käyttäjät JavaScriptiin kääntämisen avulla. On mahdollista kääntää joko lähdekoodi tai JVM-tavukoodi JavaScriptiksi.

JVM-tavukoodin kääntäminen, joka on universaali kaikissa JVM-kielissä, mahdollistaa kielen olemassa olevan kääntäjän pohjalta tavukoodauksen. Tärkeimmät JVM-tavukoodit JavaScript-kääntäjiin ovat TeaVM[8],  Dragome Web SDK:n[9] sisältämä kääntäjä,  Bck2Brwsr[10],  ja j2js-kääntäjä.[11]

Johtavia kääntäjiä JVM-kielistä JavaScriptiin ovat Java-JavaScript-kääntäjä, joka sisältyy Google Web Toolkit -työkaluihin , Clojurescript (Clojure), GrooScript (Apache Groovy), Scala.js (Scala) ja muihin[12].

Lähteet

  1. a b c The lean, mean, virtual machine javaworld.com. Viitattu 29.2.2020. (englanniksi)
  2. Tim Lindholm, Frank Yellin: Clarifications and Amendments to the Java Virtual Machine Specification, Second Edition The JavaTM Virtual Machine Specification, Second Edition, https://docs.oracle.com/javase/specs/jvms/se6/html/VMSpecTOC.doc.html. Viitattu 18.11.2015.
  3. Experimental Google ART runtime in Android KitKat can bring twice faster app executions phonearena.com. 7.11.2013. Viitattu 29.2.2020. (englanniksi) 
  4. Platform Architecture developer.android.com. Viitattu 29.2.2020. (englanniksi) 
  5. Implementing ART Just-In-Time (JIT) Compiler source.android.com. Viitattu 29.2.2020. (englanniksi) 
  6. Ars Staff: Oracle deprecates the Java browser plugin, prepares for its demise Ars Technica. 28.1.2016. Viitattu 30.3.2023. (englanniksi)
  7. Historical yearly trends in the usage statistics of client-side programming languages for websites, March 2023 w3techs.com. Viitattu 30.3.2023.
  8. TeaVM teavm.org. Viitattu 30.3.2023.
  9. ** DRAGOME.COM ** www.dragome.com. Viitattu 30.3.2023.
  10. Bck2Brwsr - APIDesign wiki.apidesign.org. Viitattu 30.3.2023.
  11. wolfgang kuehn: decatur/j2js-compiler github.com. 28.1.2023. Viitattu 30.3.2023.
  12. List of languages that compile to JS GitHub. Viitattu 30.3.2023. (englanniksi)