JavaRush /Блоги Java /Random-TG /Тартиб додан ва иҷро кардани барномаҳои Java дар зери сар...
Павел Голов
Сатҳи
Москва

Тартиб додан ва иҷро кардани барномаҳои Java дар зери сарпӯш

Дар гурӯҳ нашр шудааст

Мундариҷа:

  1. Муқаддима
  2. Тартиб додан ба bytecode
  3. Намунаи тартиб додан ва иҷрои барнома
  4. Иҷрои барнома дар мошини виртуалӣ
  5. Маҷмӯаи танҳо дар вақт (JIT).
  6. Хулоса
Тартиб додан ва иҷрои барномаҳои Java дар зери сарпӯш - 1

1. Муқаддима

Салом ба ҳама! Имрӯз ман мехоҳам донишро дар бораи он чизе ки дар зери сарпӯши JVM (Java Machine Virtual Machine) пас аз иҷро кардани як барномаи хаттии Java рӯй медиҳад, мубодила кунам. Дар айни замон, муҳитҳои муосири рушд мавҷуданд, ки ба шумо кӯмак мекунанд, ки дар бораи дохorи JVM фикр накунед, тартиб додан ва иҷро кардани codeи Java, ки метавонад таҳиягарони навро аз ин ҷанбаҳои муҳим аз даст диҳанд. Дар баробари ин, саволҳо дар бораи ин мавзӯъ аксар вақт ҳангоми мусоҳибаҳо дода мешаванд, бинобар ин ман тасмим гирифтам, ки мақола нависам.

2. Компиляция ба bytecode

Тартиб додан ва иҷрои барномаҳои Java дар зери сарпӯш - 2
Биёед бо назария оғоз кунем. Вақте ки мо ягон барнома менависем, мо файлеро бо васеъшавӣ эҷод мекунем .javaва дар он codeро бо забони барномасозии Java ҷойгир мекунем. Чунин файле, ки дорои рамзи хондашавандаи инсон аст, файли codeи ибтидоӣ номида мешавад . Пас аз он ки файли codeи ибтидоӣ омода аст, шумо бояд онро иҷро кунед! Аммо дар марҳилаи он дорои маълумотест, ки танҳо ба одамон фаҳмо аст. Java забони барномасозии бисёрплатформа аст. Ин маънои онро дорад, ки барномаҳое, ки дар Java навишта шудаанд, метавонанд дар ҳама гуна платформае иҷро шаванд, ки дорои системаи махсуси иҷрои Java насб карда шудаанд. Ин система Java Virtual Machine (JVM) номида мешавад. Барои тарҷума кардани барнома аз codeи ибтидоӣ ба codeе, ки JVM фаҳмад, шумо бояд онро тартиб диҳед. Рамзе, ки JVM мефаҳмад, bytecode номида мешавад ва маҷмӯи дастурҳоро дар бар мегирад, ки мошини виртуалӣ баъдан иҷро хоҳад кард. Барои тартиб додани codeи ибтидоӣ ба byte code, компиляте мавҷуд аст, ки javacба JDK (Java Development Kit) дохил карда шудааст. Ҳамчун вуруд, компилятор файли васеъшавиро .java, ки рамзи ибтидоии барномаро дар бар мегирад, қабул мекунад ва ҳамчун баромад, он файлеро бо тамдиди byte истеҳсол мекунад .class, ки дорои bytecodeи барои иҷрои барнома аз ҷониби мошини виртуалӣ зарур аст. Пас аз он ки барнома ба byte code тартиб дода шуд, онро бо ёрии мошини виртуалӣ иҷро кардан мумкин аст.

3. Намунаи тартиб додан ва иҷрои барнома

Фарз мекунем, ки мо як барномаи оддӣ дорем, ки дар файл мавҷуд аст Calculator.java, ки 2 аргументи сатри фармонро мегирад ва натиҷаи иловаи онҳоро чоп мекунад:
class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
Барои тартиб додани ин барнома ба byte code, мо компиляторро javacдар сатри фармон истифода мебарем:
javac Calculator.java
Пас аз ҷамъоварӣ, мо файлеро бо bytecodeи баромад мегирем Calculator.class, ки мо метавонем онро бо истифода аз мошини java дар компютери мо бо истифода аз фармони java дар сатри фармон иҷро кунем:
java Calculator 1 2
Аҳамият диҳед, ки пас аз номи файл 2 аргументи сатри фармон нишон дода шудаанд - рақамҳои 1 ва 2. Пас аз иҷрои барнома рақами 3 дар сатри фармон намоиш дода мешавад.Дар мисоли боло мо як синфи оддие доштем, ки мустақилона зиндагӣ мекунад. . Аммо чӣ мешавад, агар синф дар ягон баста бошад? Биёед вазъияти зеринро тақлид кунем: директорияҳо эҷод кунед src/ru/javarushва синфи худро дар он ҷо ҷойгир кунед. Ҳоло чунин менамояд (мо номи бастаро дар аввали файл илова кардем):
package ru.javarush;

class Calculator {
    public static void main(String[] args){
        int a = Integer.valueOf(args[0]);
        int b = Integer.valueOf(args[1]);

        System.out.println(a + b);
    }
}
Биёед чунин синфро бо фармони зерин тартиб диҳем:
javac -d bin src/ru/javarush/Calculator.java
Дар ин мисол, мо як варианти иловагии компиляторро истифода бурдем -d bin, ки файлҳои тартибдодашударо ба директория binбо сохтори монанд ба директория ҷойгир мекунад src, аммо директория binбояд пешакӣ сохта шавад. Ин усул барои пешгирӣ кардани иштибоҳ кардани файлҳои codeи ибтидоӣ бо файлҳои bytecode истифода мешавад. Пеш аз он ки барномаи тартибдодашуда иҷро карда шавад, мафҳуми онро шарҳ додан лозим аст classpath. Classpathроҳест, ки ба он мошини виртуалӣ бастаҳо ва синфҳои тартибдодашударо ҷустуҷӯ мекунад. Яъне, бо ин роҳ мо ба мошини виртуалӣ мегӯем, ки кадом директорияҳо дар системаи файлӣ решаи иерархияи бастаи Java мебошанд. Classpathҳангоми оғози барнома бо истифода аз парчам муайян кардан мумкин аст -classpath. Мо барномаро бо истифода аз фармон оғоз мекунем:
java -classpath ./bin ru.javarush.Calculator 1 2
Дар ин мисол, мо номи пурраи синф, аз ҷумла номи бастае, ки дар он ҷойгир аст, талаб кардем. Дарахти ниҳоии файл чунин менамояд:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. Иҷрои барнома тавассути мошини виртуалӣ

Ҳамин тавр, мо барномаи хаттиро оғоз кардем. Аммо вақте ки барномаи тартибдодашуда аз ҷониби мошини виртуалӣ оғоз мешавад, чӣ мешавад? Аввалан, биёед бифаҳмем, ки мафҳумҳои компиляция ва тафсири code чӣ маъно доранд. Тарҷума тарҷумаи барномаест, ки бо забони ибтидоии сатҳи баланд ба барномаи муодил бо забони сатҳи пасти монанд ба codeи мошинӣ навишта шудааст. Тарҷума – ин таҳлил, коркард ва иҷрои фаврии барнома ё дархости ибтидоӣ (бар хилофи компиляция, ки дар он барнома бидуни иҷрои он тарҷума мешавад) ба оператор ба изҳорот (фармон ба сатр, сатр ба сатр) мебошад. Забони Java ҳам компилятор ( javac) ва ҳам тарҷумон дорад, ки як мошини маҷозӣ мебошад, ки bytecodeро ба сатри codeи мошин табдил медиҳад ва фавран онро иҷро мекунад. Ҳамин тариқ, вақте ки мо барномаи тартибдодашударо иҷро мекунем, мошини виртуалӣ ба тафсири он шурӯъ мекунад, яъне сатр ба сатр табдил додани bytecode ба codeи мошин, инчунин иҷрои он. Мутаассифона, тафсири bytecodeи холис як раванди хеле тӯлонӣ аст ва Java-ро дар муқоиса бо рақибони худ суст мекунад. Барои пешгирӣ кардани ин, механизме ҷорӣ карда шуд, ки тафсири byte-codeро тавассути мошини виртуалӣ суръат мебахшад. Ин механизм ҷамъбасти Just-in-time (JITC) номида мешавад.

5. Маҷмӯаи Just-in-time (JIT).

Бо ибораи содда, механизми компиляцияи Just-In-Time чунин аст: агар дар барнома қисмҳои code вуҷуд дошта бошанд, ки борҳо иҷро мешаванд, пас онҳоро метавон як маротиба ба codeи мошинӣ тартиб дод, то иҷрои онҳоро дар оянда суръат бахшад. Пас аз тартиб додани чунин қисми барнома ба codeи мошинӣ, бо ҳар як занги минбаъда ба ин қисми барнома, мошини виртуалӣ на тафсир, балки рамзи мошини тартибдодашударо фавран иҷро мекунад, ки ин табиист, ки иҷрои барномаро суръат мебахшад. Суръати кори барнома тавассути зиёд кардани сарфи хотира (мо бояд codeи мошини тартибдодашударо дар ҷое нигоҳ дорем!) ва бо зиёд кардани вақти барои компиляция ҳангоми иҷрои барнома сарфшуда ба даст оварда мешавад. Тартиби JIT як механизми хеле мураккаб аст, аз ин рӯ биёед ба боло равем. 4 сатҳи JIT тартиб додани bytecode ба рамзи мошин вуҷуд дорад. Дараҷаи тартибдиҳӣ баландтар бошад, ҳамон қадар мураккабтар аст, аммо дар айни замон иҷрои чунин қисмат назар ба бахше, ки сатҳи пасттар дорад, тезтар хоҳад буд. JIT - Компилятор муайян мекунад, ки кадом сатҳи компиляцияро барои ҳар як порчаи барнома дар асоси он, ки чанд вақт иҷро мешавад, муқаррар мекунад. Дар зери сарпӯш, JVM 2 компилятори JIT - C1 ва C2 -ро истифода мебарад. Компилятори C1 инчунин компилятори муштарӣ номида мешавад ва қодир аст, ки codeро танҳо то сатҳи 3 тартиб диҳад. Компилятори C2 барои сатҳи 4-ум, мураккабтарин ва зудтарин тартиб масъул аст.
Тартиб додан ва иҷрои барномаҳои Java дар зери сарпӯш - 3
Аз гуфтаҳои боло, мо метавонем хулоса барорем, ки барои барномаҳои оддии муштарӣ истифодаи компилятори C1 фоидаовартар аст, зеро дар ин ҳолат барои мо муҳим аст, ки барнома то чӣ андоза зуд оғоз меёбад. Барои оғоз кардани замимаҳои server, ки дарозумр доранд, метавонанд дертар вақт гиранд, аммо дар оянда онҳо бояд кор кунанд ва вазифаи худро зуд иҷро кунанд - дар ин ҷо компилятори C2 барои мо мувофиқ аст. -clientҲангоми иҷро кардани барномаи Java дар versionи x32-и JVM, мо метавонем дастӣ муайян кунем, ки кадом режимро бо истифода аз ва флагҳо истифода барем -server. Вақте ки ин парчам муайян карда мешавад, -clientJVM оптимизатсияи мураккаби bytecodeро иҷро намекунад, ки ин вақти оғози барномаро суръат мебахшад ва миқдори хотираи истеъмолшударо кам мекунад. Ҳангоми муайян кардани парчам, -serverбарнома аз сабаби оптимизатсияи мураккаби byte-code оғоз кардани барнома вақти зиёдтар мегирад ва барои нигоҳ доштани рамзи мошин хотираи бештарро истифода мебарад, аммо барнома дар оянда тезтар кор хоҳад кард. Дар versionи x64-и JVM, парчам -clientнодида гирифта мешавад ва конфигуратсияи serverи барнома ба таври нобаёнӣ истифода мешавад.

6. Хулоса

Ин шарҳи мухтасари маро дар бораи чӣ гуна тартиб додан ва иҷро кардани барномаи Java ба анҷом мерасонад. Нуқтаҳои асосӣ:
  1. Тартибдиҳандаи javac рамзи сарчашмаи барномаро ба bytecodeи табдил медиҳад, ки онро дар ҳама платформае, ки мошини виртуалии Java насб шудааст, иҷро кардан мумкин аст;
  2. Баъди тартиб додан, JVM bytecodeи натиҷаро тафсир мекунад;
  3. Барои суръат бахшидан ба барномаҳои Java, JVM механизми компиляцияи Just-In-Time-ро истифода мебарад, ки қисматҳои бештар иҷрошавандаи барномаро ба рамзи мошин табдил медиҳад ва онҳоро дар хотира нигоҳ медорад.
Умедворам, ки ин мақола ба шумо дар фаҳмидани амиқтар дар бораи чӣ гуна кор кардани забони барномасозии дӯстдоштаи мо кӯмак кардааст. Ташаккур барои хондан, танқид хуш омадед!
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION