JavaRush /Java blogi /Random-UZ /Kaput ostida Java ilovalarini kompilyatsiya qilish va baj...
Павел Голов
Daraja
Москва

Kaput ostida Java ilovalarini kompilyatsiya qilish va bajarish

Guruhda nashr etilgan

Tarkib:

  1. Kirish
  2. Bayt kodiga kompilyatsiya qilish
  3. Dasturni kompilyatsiya qilish va bajarish misoli
  4. Virtual mashinada dasturni bajarish
  5. O'z vaqtida (JIT) kompilyatsiyasi
  6. Xulosa
Kaput ostida Java dasturlarini kompilyatsiya qilish va bajarish - 1

1.Kirish

Hammaga salom! Bugun men Java yozma dasturini ishga tushirganimizdan so'ng JVM (Java Virtual Machine) qopqog'i ostida nima sodir bo'lishi haqidagi bilimlarni baham ko'rmoqchiman. Hozirgi vaqtda yangi ishlab chiquvchilarning ushbu muhim jihatlarni o'tkazib yuborishiga olib kelishi mumkin bo'lgan JVM-ning ichki qismlari, Java kodini kompilyatsiya qilish va bajarish haqida o'ylamaslikka yordam beradigan zamonaviy ishlab chiqish muhitlari mavjud. Shu bilan birga, ushbu mavzu bo'yicha savollar ko'pincha intervyu paytida so'raladi, shuning uchun men maqola yozishga qaror qildim.

2. Bayt kodiga kompilyatsiya qilish

Kaput ostida Java dasturlarini kompilyatsiya qilish va bajarish - 2
Keling, nazariyadan boshlaylik. Har qanday dasturni yozishda biz kengaytmali fayl yaratamiz .javava unga Java dasturlash tilida kod joylashtiramiz. Inson o'qiy oladigan kodni o'z ichiga olgan bunday fayl manba kod fayli deb ataladi . Manba kodi fayli tayyor bo'lgach, uni bajarishingiz kerak! Ammo bosqichda u faqat odamlar uchun tushunarli ma'lumotlarni o'z ichiga oladi. Java ko'p platformali dasturlash tilidir. Bu shuni anglatadiki, Java-da yozilgan dasturlar maxsus Java ish vaqti tizimi o'rnatilgan har qanday platformada bajarilishi mumkin. Ushbu tizim Java Virtual Machine (JVM) deb ataladi. Dasturni manba kodidan JVM tushunadigan kodga tarjima qilish uchun uni kompilyatsiya qilishingiz kerak. JVM tushunadigan kod bayt kod deb ataladi va virtual mashina keyinchalik bajaradigan ko'rsatmalar to'plamini o'z ichiga oladi. javacManba kodini bayt-kodga kompilyatsiya qilish uchun JDK (Java Development Kit) ga kiritilgan kompilyator mavjud . .javaKirish sifatida kompilyator dasturning manba kodini o'z ichiga olgan kengaytmali faylni qabul qiladi va chiqish sifatida u .classvirtual mashina tomonidan dastur bajarilishi uchun zarur bo'lgan bayt kodini o'z ichiga olgan kengaytmali faylni ishlab chiqaradi. Dastur bayt-kodga kompilyatsiya qilingandan so'ng, uni virtual mashina yordamida bajarish mumkin.

3. Dasturni kompilyatsiya qilish va bajarishga misol

Aytaylik, bizda faylda joylashgan oddiy dastur mavjud bo'lib Calculator.java, u ikkita raqamli buyruq qatori argumentlarini oladi va ularni qo'shish natijasini chop etadi:
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);
    }
}
Ushbu dasturni bayt kodiga kompilyatsiya qilish uchun biz javacbuyruq satrida kompilyatordan foydalanamiz:
javac Calculator.java
Kompilyatsiyadan so'ng biz chiqish sifatida bayt-kodli faylni olamiz Calculator.class, uni buyruq satridagi java buyrug'i yordamida kompyuterimizga o'rnatilgan java mashinasi yordamida bajarishimiz mumkin:
java Calculator 1 2
E'tibor bering, fayl nomidan keyin 2 ta buyruq qatori argumentlari ko'rsatilgan - 1 va 2 raqamlar. Dastur bajarilgandan so'ng, buyruq satrida 3 raqami ko'rsatiladi.Yuqoridagi misolda bizda o'z-o'zidan yashaydigan oddiy sinf bor edi. . Ammo sinf qandaydir paketda bo'lsa-chi? Keling, quyidagi vaziyatni simulyatsiya qilaylik: kataloglarni yarating src/ru/javarushva o'sha erda sinfimizni joylashtiring. Endi bu shunday ko'rinadi (biz paket nomini faylning boshiga qo'shdik):
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);
    }
}
Keling, bunday sinfni quyidagi buyruq bilan kompilyatsiya qilaylik:
javac -d bin src/ru/javarush/Calculator.java
Ushbu misolda biz kompilyatsiya qilingan fayllarni katalogga o'xshash strukturaga ega bo'lgan -d binkatalogga joylashtiradigan qo'shimcha kompilyator opsiyasidan foydalandik , lekin katalog oldindan yaratilishi kerak. Ushbu usul manba kodli fayllarni bayt kodli fayllar bilan chalkashtirib yubormaslik uchun ishlatiladi. Kompilyatsiya qilingan dasturni ishga tushirishdan oldin, kontseptsiyani tushuntirishga arziydi . virtual mashina paketlar va kompilyatsiya qilingan sinflarni qidiradigan yo'ldir. Ya'ni, shu tarzda biz virtual mashinaga fayl tizimidagi qaysi kataloglar Java paketi ierarxiyasining ildizi ekanligini aytamiz. bayroq yordamida dasturni ishga tushirishda belgilanishi mumkin . Biz dasturni buyruq yordamida ishga tushiramiz: binsrcbinclasspathClasspathClasspath-classpath
java -classpath ./bin ru.javarush.Calculator 1 2
Ushbu misolda biz sinfning to'liq nomini, jumladan, u joylashgan paket nomini talab qildik. Yakuniy fayl daraxti quyidagicha ko'rinadi:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. Dasturning virtual mashina tomonidan bajarilishi

Shunday qilib, biz yozma dasturni ishga tushirdik. Ammo kompilyatsiya qilingan dastur virtual mashina tomonidan ishga tushirilsa nima bo'ladi? Birinchidan, kompilyatsiya va kodni talqin qilish tushunchalari nimani anglatishini aniqlaymiz. Kompilyatsiya - bu yuqori darajadagi manba tilida yozilgan dasturni mashina kodiga o'xshash past darajadagi tildagi ekvivalent dasturga tarjima qilish. Interpretatsiya - operator bo'yicha (buyruqlar bo'yicha, satrlar bo'yicha) tahlil qilish, qayta ishlash va dastlabki dastur yoki so'rovni darhol bajarish (kompilyatsiyadan farqli o'laroq, bunda dastur bajarilmasdan tarjima qilinadi). Java tilida kompilyator ( javac) ham, tarjimon ham mavjud bo'lib, u bayt kodini satr bo'yicha mashina kodiga aylantiruvchi va uni darhol bajaradigan virtual mashinadir. Shunday qilib, kompilyatsiya qilingan dasturni ishga tushirganimizda, virtual mashina uni izohlashni boshlaydi, ya'ni bayt kodini mashina kodiga satrga o'tkazish, shuningdek, uning bajarilishi. Afsuski, sof bayt-kodni talqin qilish ancha uzoq jarayon bo'lib, java-ni raqobatchilarga nisbatan sekinlashtiradi. Bunga yo'l qo'ymaslik uchun virtual mashina tomonidan baytekodni talqin qilishni tezlashtirish mexanizmi joriy etildi. Ushbu mexanizm "Just-in-time compilation" (JITC) deb ataladi.

5. Just-in-time (JIT) kompilyatsiyasi

Oddiy qilib aytganda, Just-In-Time kompilyatsiya mexanizmi quyidagicha: agar dasturda kodning ko'p marta bajariladigan qismlari mavjud bo'lsa, kelajakda ularning bajarilishini tezlashtirish uchun ularni bir marta mashina kodiga kompilyatsiya qilish mumkin. Dasturning bunday qismini mashina kodiga kompilyatsiya qilgandan so'ng, dasturning ushbu qismiga har bir keyingi chaqiruvda virtual mashina kompilyatsiya qilingan mashina kodini sharhlashdan ko'ra darhol bajaradi, bu esa tabiiy ravishda dasturning bajarilishini tezlashtiradi. Dasturni tezlashtirishga xotira sarfini oshirish (biz kompilyatsiya qilingan mashina kodini biror joyda saqlashimiz kerak!) va dasturni bajarish jarayonida kompilyatsiya qilish uchun sarflangan vaqtni oshirish orqali erishiladi. JIT kompilyatsiyasi juda murakkab mexanizm, shuning uchun keling, yuqoriga o'tamiz. Bayt-kodni mashina kodiga JIT kompilyatsiyasining 4 darajasi mavjud. Kompilyatsiya darajasi qanchalik baland bo'lsa, u qanchalik murakkab bo'lsa, lekin ayni paytda bunday bo'limning bajarilishi past darajadagi bo'limga qaraganda tezroq bo'ladi. JIT - kompilyator ushbu fragment qanchalik tez-tez bajarilishiga qarab har bir dastur fragmenti uchun qanday kompilyatsiya darajasini belgilashni hal qiladi. Kaput ostida JVM 2 ta JIT kompilyatoridan foydalanadi - C1 va C2. C1 kompilyatori mijoz kompilyatori deb ham ataladi va faqat 3-darajagacha kodni kompilyatsiya qila oladi. C2 kompilyatori 4-chi, eng murakkab va eng tez kompilyatsiya darajasi uchun javobgardir.
Kaput ostida Java dasturlarini kompilyatsiya qilish va bajarish - 3
Yuqoridagilardan xulosa qilishimiz mumkinki, oddiy mijoz ilovalari uchun C1 kompilyatoridan foydalanish foydaliroq, chunki bu holda dastur qanchalik tez ishga tushishi biz uchun muhim. Server tomonidagi, uzoq umr ko'radigan ilovalarni ishga tushirish ko'proq vaqt talab qilishi mumkin, ammo kelajakda ular ishlashi va o'z vazifalarini tezda bajarishi kerak - bu erda C2 kompilyatori bizga mos keladi. -clientJVM ning x32 versiyasida Java dasturini ishga tushirganda, biz va bayroqlari yordamida qaysi rejimdan foydalanishni qo'lda belgilashimiz mumkin -server. Ushbu bayroq ko'rsatilganda, -clientJVM murakkab bayt kodini optimallashtirishni amalga oshirmaydi, bu dasturni ishga tushirish vaqtini tezlashtiradi va sarflangan xotira hajmini kamaytiradi. Bayroqni belgilashda, -servermurakkab bayt kodini optimallashtirish tufayli dasturni ishga tushirish ko'proq vaqt talab etadi va mashina kodini saqlash uchun ko'proq xotiradan foydalanadi, ammo kelajakda dastur tezroq ishlaydi. JVM ning x64 versiyasida bayroq -cliente'tiborga olinmaydi va dastur serveri konfiguratsiyasi sukut bo'yicha ishlatiladi.

6. Xulosa

Bu mening Java dasturini kompilyatsiya qilish va ishga tushirish haqida qisqacha sharhimni yakunlaydi. Asosiy fikrlar:
  1. Javac kompilyatori dasturning manba kodini Java virtual mashinasi o'rnatilgan har qanday platformada bajarilishi mumkin bo'lgan bayt kodiga aylantiradi;
  2. Kompilyatsiyadan so'ng, JVM olingan baytekodni sharhlaydi;
  3. Java ilovalarini tezlashtirish uchun JVM dasturning eng tez-tez bajariladigan bo'limlarini mashina kodiga aylantiruvchi va ularni xotirada saqlaydigan "Just-In-Time" kompilyatsiya mexanizmidan foydalanadi.
Umid qilamanki, ushbu maqola sizga bizning sevimli dasturlash tilimiz qanday ishlashini chuqurroq tushunishga yordam berdi. O'qiganingiz uchun tashakkur, tanqid qabul qilinadi!
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION