JavaRush /Java Blogu /Random-AZ /Başlıq altında Java proqramlarının yığılması və icrası
Павел Голов
Səviyyə
Москва

Başlıq altında Java proqramlarının yığılması və icrası

Qrupda dərc edilmişdir

Məzmun:

  1. Giriş
  2. Bayt koduna kompilyasiya
  3. Proqramın tərtibi və icrası nümunəsi
  4. Virtual maşında proqramın icrası
  5. Just-in-time (JIT) kompilyasiyası
  6. Nəticə
Başlıq altında Java proqramlarının tərtib edilməsi və icrası - 1

1. Giriş

Hamıya salam! Bu gün mən Java yazılı tətbiqini işə saldıqdan sonra JVM (Java Virtual Machine) başlığı altında baş verənlər haqqında bilikləri bölüşmək istərdim. Hal-hazırda, JVM-nin daxili xüsusiyyətləri haqqında düşünməyinizə, Java kodunu tərtib etməkdən və icra etməkdən çəkinməyə kömək edən müasir inkişaf mühitləri mövcuddur ki, bu da yeni tərtibatçıların bu vacib aspektləri əldən buraxmasına səbəb ola bilər. Eyni zamanda müsahibələr zamanı tez-tez bu mövzu ilə bağlı suallar verilir, ona görə də məqalə yazmaq qərarına gəldim.

2. Bayt koduna kompilyasiya

Başlıq altında Java proqramlarının tərtibi və icrası - 2
Nəzəriyyə ilə başlayaq. Biz hər hansı bir proqram yazarkən, genişləndirilməsi olan fayl yaradırıq .javavə kodu ona Java proqramlaşdırma dilində yerləşdiririk. İnsan oxuna bilən kodu olan belə fayl mənbə kodu faylı adlanır . Mənbə kodu faylı hazır olduqdan sonra onu icra etməlisiniz! Ancaq mərhələdə yalnız insanlar üçün başa düşülən məlumatları ehtiva edir. Java çox platformalı proqramlaşdırma dilidir. Bu o deməkdir ki, Java-da yazılmış proqramlar xüsusi Java işləmə sistemi quraşdırılmış istənilən platformada icra oluna bilər. Bu sistem Java Virtual Machine (JVM) adlanır. Proqramı mənbə kodundan JVM-in başa düşəcəyi koda çevirmək üçün onu tərtib etməlisiniz. JVM-nin başa düşdüyü kod bayt kodu adlanır və virtual maşının sonradan yerinə yetirəcəyi bir sıra təlimatları ehtiva edir. javacMənbə kodunu bayt koduna tərtib etmək üçün JDK (Java Development Kit)-ə daxil edilmiş bir kompilyator var . .javaGiriş kimi, kompilyator proqramın mənbə kodunu ehtiva edən uzantılı faylı qəbul edir və çıxış olaraq, .classproqramın virtual maşın tərəfindən yerinə yetirilməsi üçün lazım olan bayt kodunu ehtiva edən uzantılı bir fayl istehsal edir. Proqram bayt koduna daxil edildikdən sonra onu virtual maşından istifadə etməklə icra etmək olar.

3. Proqramın tərtibi və icrası nümunəsi

Calculator.javaTutaq ki, bir faylda olan , 2 ədədi əmr satırı arqumenti götürən və onların əlavə edilməsinin nəticəsini çap edən sadə proqramımız var :
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);
    }
}
Bu proqramı bayt koduna yığmaq üçün biz javackomanda xəttində tərtibçidən istifadə edəcəyik:
javac Calculator.java
Kompilyasiyadan sonra bayt kodu olan bir faylı çıxış olaraq alırıq Calculator.class, onu komanda xəttindəki java əmrindən istifadə edərək kompüterimizdə quraşdırılmış java maşını ilə icra edə bilərik:
java Calculator 1 2
Qeyd edək ki, fayl adından sonra 2 komanda xətti arqumenti göstərilib-rəqəm 1 və 2. Proqramı icra etdikdən sonra komanda sətrində 3 rəqəmi göstəriləcək.Yuxarıdakı misalda bizdə özbaşına yaşayan sadə bir sinif var idi. . Bəs sinif hansısa paketdə olarsa nə olacaq? Aşağıdakı vəziyyəti simulyasiya edək: kataloqlar yaradın src/ru/javarushvə sinfimizi orada yerləşdirin. İndi belə görünür (paketin adını faylın əvvəlinə əlavə etdik):
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);
    }
}
Belə bir sinfi aşağıdakı komanda ilə tərtib edək:
javac -d bin src/ru/javarush/Calculator.java
Bu misalda biz tərtib edilmiş faylları qovluğa bənzər strukturu olan -d binqovluğa yerləşdirən əlavə kompilyator seçimindən istifadə etdik , lakin qovluq əvvəlcədən yaradılmalıdır. Bu texnika mənbə kodu fayllarını bayt kodu faylları ilə qarışdırmamaq üçün istifadə olunur. Tərtib edilmiş proqramı işə salmazdan əvvəl konsepsiyanı izah etməyə dəyər . virtual maşının paketləri və tərtib edilmiş sinifləri axtaracağı nisbi yoldur. Yəni bu yolla virtual maşına fayl sistemindəki hansı kataloqların Java paket iyerarxiyasının kökü olduğunu bildiririk. bayraqdan istifadə edərək proqramı işə salarkən müəyyən edilə bilər . Komandanı istifadə edərək proqramı işə salırıq: binsrcbinclasspathClasspathClasspath-classpath
java -classpath ./bin ru.javarush.Calculator 1 2
Bu nümunədə biz sinifin tam adını, o cümlədən onun yerləşdiyi paketin adını tələb etdik. Son fayl ağacı belə görünür:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. Proqramın virtual maşınla icrası

Beləliklə, biz yazılı proqramı işə saldıq. Bəs tərtib edilmiş proqram virtual maşın tərəfindən işə salındıqda nə baş verir? Əvvəlcə kompilyasiya və kod şərhi anlayışlarının nə demək olduğunu anlayaq. Kompilyasiya yüksək səviyyəli mənbə dilində yazılmış proqramın maşın koduna bənzər aşağı səviyyəli dildə ekvivalent proqrama tərcüməsidir. Tərcümə mənbə proqramı və ya sorğunun operator üzrə (əmr-sətir, sətir-sətir) təhlili, işlənməsi və dərhal yerinə yetirilməsidir (kompilyasiyadan fərqli olaraq, proqram icra edilmədən tərcümə olunur). Java dilində həm kompilyator ( javac) həm də tərcüməçi var, o, bayt kodunu sətir-sətir maşın koduna çevirən və onu dərhal icra edən virtual maşındır. Beləliklə, biz tərtib edilmiş proqramı işə saldığımız zaman virtual maşın onu şərh etməyə, yəni bayt kodun maşın koduna sətir-sətir çevrilməsinə, həmçinin onun icrasına başlayır. Təəssüf ki, saf bayt kodunun təfsiri kifayət qədər uzun prosesdir və rəqibləri ilə müqayisədə Java-nı yavaşlatır. Bunun qarşısını almaq üçün virtual maşın tərəfindən bayt kodun təfsirini sürətləndirmək üçün mexanizm tətbiq edildi. Bu mexanizm Just-in-time Compilation (JITC) adlanır.

5. Just-in-time (JIT) kompilyasiyası

Sadə dillə desək, Just-In-Time kompilyasiyasının mexanizmi belədir: proqramda kodun dəfələrlə yerinə yetirilən hissələri varsa, gələcəkdə onların icrasını sürətləndirmək üçün onları bir dəfə maşın koduna toplamaq olar. Proqramın belə bir hissəsini maşın koduna kompilyasiya etdikdən sonra proqramın bu hissəsinə hər növbəti çağırışda virtual maşın tərtib edilmiş maşın kodunu şərh etmək əvəzinə dərhal icra edəcək ki, bu da təbii olaraq proqramın icrasını sürətləndirəcək. Proqramın sürətləndirilməsi yaddaş sərfiyyatının artırılması (biz tərtib edilmiş maşın kodunu haradasa saxlamalıyıq!) və proqramın icrası zamanı kompilyasiyaya sərf olunan vaxtı artırmaqla əldə edilir. JIT kompilyasiyası olduqca mürəkkəb mexanizmdir, ona görə də yuxarıya keçək. Bayt kodunun maşın koduna JIT tərtibinin 4 səviyyəsi var. Kompilyasiya səviyyəsi nə qədər yüksəkdirsə, bir o qədər mürəkkəbdir, lakin eyni zamanda belə bir bölmənin icrası daha aşağı səviyyəli bölmədən daha sürətli olacaqdır. JIT - Kompilyator hər bir proqram fraqmenti üçün hansı kompilyasiya səviyyəsinin təyin olunacağına həmin fraqmentin nə qədər tez-tez yerinə yetirildiyinə əsasən qərar verir. Başlıq altında JVM 2 JIT kompilyatorundan istifadə edir - C1 və C2. C1 kompilyatoru həm də müştəri kompilyatoru adlanır və kodu yalnız 3-cü səviyyəyə qədər tərtib edə bilir. C2 kompilyatoru 4-cü, ən mürəkkəb və ən sürətli tərtib səviyyəsinə cavabdehdir.
Başlıq altında Java proqramlarının tərtibi və icrası - 3
Yuxarıda göstərilənlərdən belə nəticəyə gələ bilərik ki, sadə müştəri tətbiqləri üçün C1 tərtibçisindən istifadə etmək daha sərfəlidir, çünki bu halda tətbiqin nə qədər tez başlaması bizim üçün vacibdir. Server tərəfində, uzunömürlü proqramların işə salınması daha uzun çəkə bilər, lakin gələcəkdə onlar işləməli və öz funksiyalarını tez yerinə yetirməlidirlər - burada C2 kompilyatoru bizim üçün uyğundur. JVM-in x32 versiyasında Java proqramını işlədən zaman biz -clientvə bayraqlarından istifadə edərək hansı rejimi istifadə etmək istədiyimizi əl ilə təyin edə bilərik -server. Bu bayraq təyin edildikdə, -clientJVM mürəkkəb bayt kodu optimallaşdırmalarını yerinə yetirməyəcək, bu da proqramın işə salınma vaxtını sürətləndirəcək və sərf olunan yaddaşın miqdarını azaldacaq. Bayrağı təyin edərkən, -servermürəkkəb bayt kodu optimallaşdırmaları səbəbindən tətbiqin işə salınması daha uzun çəkəcək və maşın kodunu saxlamaq üçün daha çox yaddaş istifadə edəcək, lakin proqram gələcəkdə daha sürətli işləyəcək. JVM-in x64 versiyasında bayraq -clientnəzərə alınmır və proqram serverinin konfiqurasiyası defolt olaraq istifadə olunur.

6. Nəticə

Bu, Java proqramının tərtib edilməsi və icrasının necə işlədiyinə dair qısa icmalıma yekun vurur. Əsas nöqtələr:
  1. javac kompilyatoru proqramın mənbə kodunu Java virtual maşınının quraşdırıldığı istənilən platformada icra oluna bilən baytkoda çevirir;
  2. Kompilyasiyadan sonra JVM nəticədə bayt kodunu şərh edir;
  3. Java proqramlarını sürətləndirmək üçün JVM proqramın ən tez-tez yerinə yetirilən bölmələrini maşın koduna çevirən və yaddaşda saxlayan Just-In-Time kompilyasiya mexanizmindən istifadə edir.
Ümid edirəm ki, bu məqalə sevimli proqramlaşdırma dilimizin necə işlədiyini daha dərindən başa düşməyə kömək etdi. Oxuduğunuz üçün təşəkkürlər, tənqid xoşdur!
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION