JavaRush /Blog Jawa /Random-JV /Kompilasi lan eksekusi aplikasi Java ing sangisore tutup
Павел Голов
tingkat
Москва

Kompilasi lan eksekusi aplikasi Java ing sangisore tutup

Diterbitake ing grup

Isi:

  1. Pambuka
  2. Kompilasi menyang bytecode
  3. Tuladha kompilasi lan eksekusi program
  4. Nglakokake program ing mesin virtual
  5. Kompilasi Just-in-time (JIT).
  6. Kesimpulan
Kompilasi lan eksekusi aplikasi Java ing sangisore tutup - 1

1. Pambuka

Halo kabeh! Dina iki aku pengin nuduhake kawruh babagan apa sing kedadeyan ing JVM (Java Virtual Machine) sawise mbukak aplikasi sing ditulis Jawa. Saiki, ana lingkungan pangembangan trendi sing mbantu sampeyan ora mikir babagan internal JVM, nyusun lan nglakokake kode Java, sing bisa nyebabake pangembang anyar ora kejawab aspek penting kasebut. Ing wektu sing padha, pitakonan babagan topik iki asring ditakoni nalika wawancara, mula aku mutusake nulis artikel.

2. Kompilasi kanggo bytecode

Kompilasi lan eksekusi aplikasi Java ing sangisore tutup - 2
Ayo dadi miwiti karo teori. Nalika kita nulis aplikasi apa wae, kita nggawe file kanthi ekstensi .javalan kode panggonan ing basa pemrograman Java. Berkas kuwi sing ngemot kode sing bisa diwaca manungsa diarani file kode sumber . Sawise file kode sumber wis siyap, sampeyan kudu nglakokake! Nanging ing tataran ngandhut informasi mung bisa dingerteni kanggo manungsa. Java minangka basa pemrograman multi-platform. Iki tegese program sing ditulis ing Jawa bisa dieksekusi ing platform apa wae sing wis diinstal sistem runtime Java khusus. Sistem iki diarani Java Virtual Machine (JVM). Kanggo nerjemahake program saka kode sumber menyang kode sing JVM bisa ngerti, sampeyan kudu ngumpulake. Kode sing dingerteni JVM diarani bytecode lan ngemot sakumpulan instruksi sing bakal ditindakake mesin virtual. Kanggo ngumpulake kode sumber dadi bytecode, ana compiler javacsing kalebu ing JDK (Java Development Kit). Minangka input, compiler nampa file karo extension .java, ngemot kode sumber program, lan minangka output, iku mrodhuksi file karo extension .class, ngemot bytecode perlu kanggo program sing bakal kaleksanan dening mesin virtual. Sawise program wis dikompilasi dadi bytecode, bisa dieksekusi nggunakake mesin virtual.

3. Tuladha kompilasi lan eksekusi program

Upaminipun kita duwe program prasaja, sing ana ing file Calculator.java, sing njupuk 2 argumen baris perintah numerik lan nyithak asil saka tambahan kasebut:
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);
    }
}
Kanggo ngumpulake program iki dadi bytecode, kita bakal nggunakake kompiler javacing baris perintah:
javac Calculator.java
Sawise kompilasi, kita nampa file kanthi bytecode minangka output Calculator.class, sing bisa dieksekusi nggunakake mesin java sing diinstal ing komputer nggunakake printah java ing baris printah:
java Calculator 1 2
Elinga yen sawise jeneng berkas, 2 argumen baris perintah ditemtokake - nomer 1 lan 2. Sawise nglakokake program, nomer 3 bakal ditampilake ing baris perintah. Ing conto ing ndhuwur, kita duwe kelas prasaja sing urip dhewe. . Nanging kepiye yen kelas kasebut ana ing sawetara paket? Ayo simulasi kahanan ing ngisor iki: nggawe direktori src/ru/javarushlan nyelehake kelas ing kana. Saiki katon kaya iki (kita nambahake jeneng paket ing wiwitan file):
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);
    }
}
Ayo ngumpulake kelas kasebut kanthi prentah ing ngisor iki:
javac -d bin src/ru/javarush/Calculator.java
Ing conto iki, kita nggunakake opsi kompiler tambahan -d binsing nempatake file kompilasi menyang direktori binkanthi struktur sing padha karo direktori src, nanging direktori kasebut binkudu digawe luwih dhisik. Teknik iki digunakake kanggo ngindhari file kode sumber sing mbingungake karo file bytecode. Sadurunge nglakokake program sing dikompilasi, perlu diterangake konsep kasebut classpath. Classpathpunika path relatif kanggo kang mesin virtual bakal katon kanggo paket lan kelas nyawiji. Tegese, kanthi cara iki kita ngandhani mesin virtual sing direktori ing sistem file minangka oyod saka hirarki paket Java. Classpathbisa ditemtokake nalika miwiti program nggunakake flag -classpath. Kita miwiti program nggunakake printah:
java -classpath ./bin ru.javarush.Calculator 1 2
Ing conto iki, kita mbutuhake jeneng lengkap kelas, kalebu jeneng paket sing manggon. Wit file pungkasan katon kaya iki:
├── src
│     └── ru
│          └── javarush
│                  └── Calculator.java
└── bin
      └── ru
           └── javarush
                   └── Calculator.class

4. Eksekusi program dening mesin virtual

Dadi, kita ngluncurake program sing ditulis. Nanging apa sing kedadeyan nalika program kompilasi diluncurake dening mesin virtual? Kaping pisanan, ayo ngerteni apa tegese kompilasi lan interpretasi kode. Kompilasi minangka terjemahan saka program sing ditulis ing basa sumber tingkat dhuwur menyang program sing padha ing basa tingkat rendah sing padha karo kode mesin. Interpretasi minangka analisis operator-by-statement (command-by-line, line-by-line), pangolahan lan eksekusi langsung saka program sumber utawa panyuwunan (minangka lawan kompilasi, ing ngendi program kasebut diterjemahake tanpa dieksekusi). Basa Jawa nduweni compiler ( javac) lan interpreter, yaiku mesin virtual sing ngowahi bytecode dadi kode mesin baris demi baris lan langsung dieksekusi. Mangkono, nalika kita mbukak program kompilasi, mesin virtual wiwit kokwaca, yaiku, konversi baris-by-line saka bytecode menyang kode mesin, uga eksekusi. Sayange, interpretasi bytecode murni minangka proses sing cukup dawa lan nggawe java alon dibandhingake karo pesaing. Kanggo ngindhari iki, mekanisme dienal kanggo nyepetake interpretasi bytecode dening mesin virtual. Mekanisme iki diarani Just-in-time compilation (JITC).

5. Just-in-time (JIT) kompilasi

Ing istilah sing prasaja, mekanisme kompilasi Just-In-Time yaiku: yen ana bagean kode ing program sing dieksekusi kaping pirang-pirang, mula bisa dikompilasi sapisan dadi kode mesin kanggo nyepetake eksekusi ing mangsa ngarep. Sawise kompilasi bagean program kasebut dadi kode mesin, kanthi saben telpon sabanjure menyang bagean program kasebut, mesin virtual bakal langsung nglakokake kode mesin sing dikompilasi tinimbang menehi interpretasi, sing kanthi alami bakal nyepetake eksekusi program kasebut. Nyepetake program digayuh kanthi nambah konsumsi memori (kita kudu nyimpen kode mesin sing dikompilasi nang endi wae!) Lan nambah wektu kompilasi sajrone eksekusi program. Kompilasi JIT minangka mekanisme sing rada rumit, mula ayo pindhah menyang ndhuwur. Ana 4 tingkat kompilasi JIT saka bytecode menyang kode mesin. Sing luwih dhuwur tingkat kompilasi, luwih rumit, nanging ing wektu sing padha eksekusi bagean kasebut bakal luwih cepet tinimbang bagean kanthi tingkat sing luwih murah. JIT - Compiler nemtokake tingkat kompilasi sing kudu disetel kanggo saben fragmen program adhedhasar sepira kerepe fragmen kasebut dieksekusi. Ing hood, JVM nggunakake 2 kompiler JIT - C1 lan C2. Kompiler C1 uga diarani kompiler klien lan mung bisa nyusun kode nganti tingkat 3. Compiler C2 tanggung jawab kanggo tingkat kompilasi kaping 4, paling rumit lan paling cepet.
Kompilasi lan eksekusi aplikasi Java ing sangisore tutup - 3
Saka ndhuwur, kita bisa nyimpulake yen kanggo aplikasi klien sing prasaja, luwih nguntungake nggunakake compiler C1, amarga ing kasus iki penting kanggo kita carane cepet aplikasi diwiwiti. Server-side, aplikasi long-urip bisa njupuk maneh kanggo miwiti, nanging ing mangsa padha kudu bisa lan nindakake fungsi sing cepet - kene compiler C2 cocok kanggo kita. Nalika mbukak program Java ing versi x32 saka JVM, kita bisa kanthi manual nemtokake mode sing arep digunakake nggunakake -clientlan panji -server. Nalika flag iki ditemtokake, -clientJVM ora bakal nindakake optimizations bytecode Komplek, kang bakal nyepetake wektu wiwitan aplikasi lan nyuda jumlah memori migunakaken. Nalika nemtokake gendera, -serveraplikasi bakal njupuk maneh kanggo miwiti amarga optimizations bytecode Komplek lan bakal nggunakake memori liyane kanggo nyimpen kode mesin, nanging program bakal mbukak luwih cepet ing mangsa. Ing versi x64 saka JVM, gendera -clientdigatèkaké lan konfigurasi server aplikasi digunakake minangka standar.

6. Kesimpulan

Iki nyimpulake ringkesan ringkes babagan cara nyusun lan nglakokake aplikasi Java. Titik utama:
  1. Compiler javac ngowahi kode sumber program dadi bytecode sing bisa dieksekusi ing platform apa wae sing diinstal mesin virtual Java;
  2. Sawise kompilasi, JVM nerjemahake bytecode sing diasilake;
  3. Kanggo nyepetake aplikasi Java, JVM nggunakake mekanisme kompilasi Just-In-Time sing ngowahi bagean program sing paling kerep dieksekusi dadi kode mesin lan nyimpen ing memori.
Muga-muga artikel iki mbantu sampeyan ngerteni luwih jero babagan cara kerja basa pamrograman favorit. Matur nuwun kanggo maca, kritik ditampa!
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION