Кіріспе

Java бағдарламаларын іске қосатын виртуалды машина. Java виртуалды машинасы (JVM) – компьютерге Java бағдарламаларын, сондай-ақ Java байт-кодына компиляцияланған басқа тілдерде жазылған бағдарламаларды іске қосуға мүмкіндік беретін виртуалды машина. JVM-нің құрылымын ресми түрде сипаттайтын спецификация бар, ол JVM-ді іске асыру үшін қажетті талаптарды анықтайды. Спецификацияның болуы Java бағдарламаларының әртүрлі нұсқаларында өзара үйлесімділікті қамтамасыз етеді, сондықтан Java Development Kit (JDK) пайдаланатын бағдарламашылар негізгі аппараттық платформаның ерекшеліктері туралы алаңдамайды. JVM-нің анықтамалық нұсқасы OpenJDK жобасымен ашық код ретінде әзірленеді және HotSpot деп аталатын JIT компиляторын қамтиды. Oracle ұсынатын коммерциялық қолдауға ие Java нұсқалары OpenJDK орындалу ортасына негізделген. Eclipse OpenJ9 – OpenJDK үшін тағы бір ашық кодты JVM.

JVM-нің спецификациясы

Java виртуалды машинасы – спецификациямен анықталған абстрактілік (виртуалды) компьютер. Ол Java орындалу ортасының бір бөлігі болып табылады. Қолданылатын қоқыс жинау алгоритмі және Java виртуалды машинасы нұсқауларының ішкі оңтайландырылуы (олардың машиналық кодқа аударылуы) көрсетілмейді. Бұл шешімнің басты себебі – іске асырушыларды қажетсіз шектеулерден сақтау. Кез келген Java қолданбасы Java виртуалды машинасының абстрактілік спецификациясының нақты іске асырылуында ғана жұмыс істей алады. Java Platform, Standard Edition (J2SE) 5.0 нұсқасынан бастап JVM спецификациясына енгізілген өзгерістер Java Community Process аясында JSR 924 ретінде әзірленді. 2006 жылдан бастап, сынып файл форматына (JSR 202) ұсынылған өзгерістерді қолдау мақсатында JSR 924-тің техникалық қолдау релизі ретінде спецификацияға өзгерістер енгізілуде. JVM-нің спецификациясы «көк кітап» ретінде жарияланды, оның кіріспесінде мынадай мәлімдеме бар: Бұл спецификация Java виртуалды машинасының толыққанды үйлесімді, таза бөлмелік іске асыруларын жасауға жеткілікті мәліметтермен қамтамасыз етуі керек. Oracle Java виртуалды машинасының іске асырылуының дұрыс жұмыс істеуін тексертін сынақтар ұсынады. Oracle-дың JVM-дерінің бірі HotSpot, ал BEA Systems компаниясынан мұрагерлік еткен екіншісі JRockit деп аталады. Oracle Java тауарлық белгісіне ие және оны Oracle спецификациясына толық сәйкес келетін іске асыру жиынтықтарын сертификаттау үшін пайдалануға рұқсат бере алады.

Виртуалды машиналар архитектурасы

JVM Java виртуалды машинасының ерекшеліктеріне сәйкес белгілі бір деректер түрлерімен жұмыс істейді. Деректер түрлерін бастапқы түрлерге (толық сандар, қозғалмалы нүкте сандар, ұзын және т.б.) және анықтамалық түрлерге бөлуге болады. Алғашқы JVM машиналары тек 32 биттік болған. 64 биттік ұзын және қос типтері түпкілікті түрде қолдалады, бірақ әрбір бірлік 32 биттік болғандықтан, фреймнің жергілікті айнымалыларында немесе операндар стегінде екі бірлік орын алады. Бульдік, байт, қысқа және char типтері барлық жағдайда кеңейтіледі (char нөлмен кеңейтіледі, ал қалғандары таңбамен), және 32 биттік бүтін сандар ретінде өңделеді, int типтерімен бірдей. Кішірек типтерді жүктеу, сақтау және түрлендіру үшін арнайы бірнеше командалар бар. Бульдік мәндер 8 биттік байт ретінде өңделеді, мұнда 0 – жалған, ал 1 – шын мәнін білдіреді. (Java Virtual Machine Specification, Second Edition нұсқасынан бастап бульдік тип ретінде қарастырылса да, компиляцияланған және орындалған кодта бульдік пен байт арасында айырмашылық шамалы, әдіс қолтаңбаларындағы және бульдік массивтерінің түріндегі атау өңдеуден басқа. Бульдік массивтерінің түрі boolean[] болып табылады, бірақ әрбір элементке 8 бит жұмсалады, ал JVM бульдіктерді биттік массивке жинау мүмкіндігіне ие емес, сондықтан олар byte массивтерімен бірдей жұмыс істейді және мінез-құлқы бірдей болады. Басқа жағдайларда бульдік түрі JVM үшін белгісіз, өйткені бульдіктермен жұмыс істеуге арналған барлық командалар байттармен жұмыс істеу үшін де қолданылады.) Дегенмен, жаңа JVM нұсқалары (OpenJDK HotSpot JVM) 64 биттік жүйені қолдайды, сондықтан 64 биттік операциялық жүйеде 32 биттік/64 биттік JVM-ді пайдалануға болады. Java-ны 64 биттік ортада іске қосудың басты артықшылығы – үлкен адрестік кеңістік. Бұл Java үйіндісінің көлемін арттыруға және Java жіптерінің максималды санын көбейтуге мүмкіндік береді, бұл кейбір ірі масштабты қолданбалар үшін қажет; алайда, 64 биттік JVM-ді 32 биттік JVM-мен салыстырғанда пайдалану өнімділігі төмендеуі мүмкін. JVM объектілер мен массивтерді сақтау үшін қоқыс жинағышпен жабдықталған үйіндіге ие. Код, тұрақтылар және басқа сыныптық деректер "әдіс аймағында" сақталады. Әдіс аймағы логикалық тұрғыдан үйіндінің бөлігі болып табылады, бірақ іске асырулар әдіс аймағын үйіндіден бөлек қарастыруы мүмкін, мысалы, оны қоқыс жинаудан шығаруы мүмкін. Әрбір JVM жібінің өз шақыру стегі (айқындылық үшін "Java Virtual Machine стегі" деп аталады) бар, ол фреймдерді сақтайды. Әрбір әдіс шақырылғанда жаңа фрейм құрылады, ал әдіс аяқталғанда фрейм жойылады. Әрбір фрейм "операндар стегін" және "жергілікті айнымалылар" массивін қамтамасыз етеді. Операндар стегі есептеулерді орындау үшін және шақырылған әдістің қайтару мәнін алу үшін қолданылады, ал жергілікті айнымалылар регистрлер сияқты мақсатқа қызмет етеді және әдіс аргументтерін беру үшін де қолданылады. Осылайша, JVM стек машинасы да, регистр машинасы да болып табылады. Іс жүзінде HotSpot интерпретацияланған режимде жұмыс істеген кезде де, жергілікті жіп/шақыру стегінен басқа барлық стектерді жояды, өйткені оның Templating Interpreter техникалық тұрғыдан компилятор ретінде жұмыс істейді.

JVM тілдері

JVM тілі – Java виртуалды машинасына орналастырылатын жарамды сынып файлы түрінде өрнектеле алатын мүмкіндіктерге ие кез келген тіл. Сынып файлында Java виртуалды машинасының нұсқаулары (Java байт-коды) және символдар тізімі, сондай-ақ басқа да қосымша ақпараттар болады. Сынып файл форматы – компиляцияланған кластар мен интерфейстерді ұсыну үшін қолданылатын аппараттық және операциялық жүйеге тәуелсіз екілік формат. JVM-де JVM-ге портталған ескі тілдер мен толығымен жаңа тілдердің көптеген түрлері бар. JRuby және Jython – қазіргі кездегі ең танымал тілдердің порттары, яғни сәйкесінше Ruby және Python. Java байт-кодына компиляцияланатын жаңа тілдердің ішінде Clojure, Groovy, Scala және Kotlin ең танымалдары болуы мүмкін. JVM тілдерінің ерекшелігі – олар бір-бірімен үйлесімді, сондықтан, мысалы, Scala кітапханаларын Java бағдарламаларында және керісінше пайдалануға болады. Java 7 JVM JSR 292 стандартын іске асырады: Java платформасында динамикалық типтегі тілдерді қолдау, бұл JVM-де динамикалық типтегі тілдерді қолдайтын жаңа мүмкіндік. Бұл мүмкіндік Da Vinci Machine жобасы аясында жасалды, оның миссиясы – Java-дан басқа тілдерді де қолдайтын JVM-ді кеңейту.

Байт-код интерпретаторы және жай уақытында компилятор

Әрбір аппараттық архитектура үшін әртүрлі Java байт-кодын түсіндіретін интерпретатор қажет. Компьютерде Java байт-кодын түсіндіретін интерпретатор болса, ол кез келген Java байт-код бағдарламасын іске қоса алады, ал сол бағдарлама мұндай интерпретаторы бар кез келген компьютерде іске қосылуы мүмкін. Java байт-коды интерпретатормен орындалғанда, орындалу уақыты сол бағдарламаның түпкілікті машина тіліне компиляцияланған нұсқасынан әлдеқайда баяу болады. Бұл мәселені Java байт-кодын орындау үшін уақытында компиляциялайтын (JIT) компиляторлар шешеді. JIT компиляторы бағдарлама іске қосылғанда Java байт-кодын түпкілікті машина тіліне аударуы мүмкін. Бағдарламаның аударылған бөліктері түсіндірілгеннен гөрі әлдеқайда жылдам орындалады. Бұл техника бағдарламаның жиі орындалатын бөліктеріне қолданылады. Осылайша JIT компиляторы жалпы орындалу уақытын едәуір жылдамдата алады. Java бағдарламалау тілі мен Java байт-коды арасында тікелей байланыс жоқ. Java тілінде жазылған бағдарлама тікелей компьютердің машина тіліне компиляциялануы мүмкін, ал Java емес, басқа тілдерде жазылған бағдарламалар Java байт-кодына компиляциялануы мүмкін. Java байт-коды платформадан тәуелсіз және қауіпсіз болуға тиіс. Кейбір JVM жүзеге асыруларында интерпретатор болмайды, олар тек уақытында компиляциялайтын компилятордан ғана тұрады.

Веб- шолғыштағы JVM

Java платформасының пайда болуының бастапқы кезеңінде JVM бай веб-қосымшаларын жасауға арналған веб-технология ретінде таныстырылды. 2018 жылдан бастап, көптеген веб-браузерлер мен веб-браузерлерді жинақтап ұсынатын операциялық жүйелер Java плагинімен бірге келмейді, сондай-ақ Flash плагині емес, кез келген плагинді орнатуға рұқсат бермейді. Java браузерлік плагині JDK 9 нұсқасында қолданыстан шығарылды. NPAPI Java браузерлік плагині HTML беттеріне енгізілген Java апплеттерін JVM арқылы іске қосуға мүмкіндік беру үшін әзірленген. Плагин орнатылған браузерлерде апплетке оған бөлінген беттің тіктөртбұрышты аймағына сурет салуға рұқсат беріледі. Плагин JVM-ді қамтитындықтан, Java апплеттері Java бағдарламалау тілімен ғана шектелмейді; JVM-ге бағытталған кез келген тіл плагин арқылы жұмыс істей алады. API-дың шектеулі жиынтығы апплеттерге пайдаланушының микрофонына немесе 3D үдеткішіне қол жеткізуге мүмкіндік береді, бірақ апплеттер беттің тіктөртбұрышты аймағынан тыс өзгерте алмайды. Adobe Flash Player, басты бәсекелес технология, осы жағынан ұқсас жұмыс істейді. W3Techs мәліметтеріне сәйкес, 2015 жылдың маусым айына қарай Java апплеттері мен Silverlight-тың қолданылу деңгейі барлық веб-сайттар бойынша 0,1%-ға дейін төмендеді, ал Flash 10,8%-ға дейін төмендеді.

JavaScript JVM және интерпретаторлары

2016 жылдың мамыр айынан бастап JavaPoly пайдаланушыларға өзгертілмеген Java кітапханаларын импорттап, оларды тікелей JavaScript-тен шақыруға мүмкіндік береді. JavaPoly веб-сайттарға пайдаланушының компьютерінде Java орнатылмаған жағдайда да, өзгертілмеген Java кітапханаларын пайдалануға мүмкіндік береді.

JavaScript- ке көшіру

JavaScript орындалу жылдамдығының үнемі жақсаруымен және плагиндерді қолдамайтын мобильді құрылғылардың веб-браузерлерін пайдаланудың артуымен байланысты, осы қолданушыларға JavaScript-ке түрлендіру арқылы қол жеткізуге тырысып жатыр. Мұнда бастапқы кодты немесе JVM байт-кодын JavaScript-ке түрлендіруге болады. JVM байт-кодын құрастыру, ол JVM тілдерінің барлығы үшін ортақ, тілдің байт-кодқа қатысты бар компиляторын пайдалануға мүмкіндік береді. Басты JVM байт-кодын JavaScript-ке түрлендіргіштер – TeaVM, Dragome Web SDK құрамындағы компилятор, Bck2Brwsr және j2js компиляторы. JVM тілдерінен JavaScript-ке түрлендіргіштердің ішінде Google Web Toolkit құрамындағы Java-дан JavaScript-ке түрлендіргіш, Clojurescript (Clojure), GrooScript (Apache Groovy), Scala.js (Scala) және тағы да басқалары бар.