Tuesday, 18 December 2012

LANGUAGE OF THE COMPUTERS : TRANSLATION AND STARTUP



Dalam pengkomputeran, kompilasi just-in-time (JIT), juga dikenali sebagai terjemahan dinamik, adalah satu kaedah untuk meningkatkan prestasi runtime program komputer berdasarkan kod bait (kod mesin maya). Sejak kod bait ditafsirkan ia melaksanakan lebih perlahan daripada kod mesin disusun, melainkan jika ia sebenarnya disusun kepada kod mesin, yang boleh dilakukan sebelum pelaksanaan - membuat program memuatkan perlahan atau semasa pelaksanaan. Dalam kes ini kedua - yang merupakan asas untuk penyusunan JIT - program disimpan dalam ingatan sebagai kod bait, tetapi segmen kod sedang berjalan preparatively dikumpulkan untuk kod mesin fizikal untuk berjalan lebih cepat.
JIT penyusun mewakili pendekatan hibrid, dengan terjemahan yang berlaku secara berterusan, dengan jurubahasa, tetapi dengan caching kod diterjemahkan untuk mengurangkan kemerosotan prestasi. Ia juga menawarkan kelebihan lain lebih kod disusun statik pada masa pembangunan, seperti pengendalian jenis data lewat terikat dan keupayaan untuk menguatkuasakan jaminan keselamatan.
JIT membina atas dua idea awal dalam persekitaran masa jalanan: bytecode pengumpulan dan penyusunan dinamik. Ia menukarkan kod di runtime sebelum melaksanakan ia natively, contohnya bytecode ke dalam kod mesin asli.
Beberapa persekitaran runtime moden, seperti Rangka Kerja Microsoft. BERSIH dan kebanyakan pelaksanaan Jawa, bergantung pada kompilasi JIT untuk kelajuan tinggi pelaksanaan kod.
JIT adalah serasi dengan mprotect ciri Pax dimasukkan dengan Linux kernel patch Grsecurity serta mencegah permohonan memori benar randomisation pada OpenBSD.

Dalam sistem bytecode-disusun, kod sumber diterjemahkan kepada perwakilan perantaraan yang dikenali sebagai bytecode. Bytecode bukan adalah kod mesin bagi mana-mana komputer tertentu, dan mungkin mudah alih di kalangan seni bina komputer. Bytecode kemudian boleh ditafsirkan oleh, atau menjalankan di, mesin maya. Orang yang mengkompilasi JIT membaca bytecodes dalam seksyen banyak (atau sepenuhnya, jarang) dan mengumpulkan mereka dinamik ke dalam bahasa mesin supaya program ini boleh berjalan lebih cepat. Jawa melakukan cek runtime pada pelbagai bahagian kod dan ini adalah sebab keseluruhan kod tidak disusun di sekali.Ini boleh dilakukan per-fail, setiap fungsi atau walaupun pada serpihan mana-mana kod sewenang-wenangnya;. Kod boleh disusun apabila ia adalah kira-kira untuk dilaksanakan (maka nama "just-in-time"), dan kemudian cache dan diguna semula kemudian tanpa perlu recompiled.

Sebaliknya, tradisional ditafsirkan mesin maya hanya akan mentafsir bytecode, secara amnya dengan prestasi yang lebih rendah. Beberapa penterjemah mentafsirkan kod sumber, tanpa langkah pertama menyusun bytecode, dengan prestasi yang lebih buruk lagi. Kod statik disusun atau kod asli disusun sebelum penempatan. Persekitaran kompilasi dinamik adalah salah satu di mana pengkompil boleh digunakan semasa pelaksanaan. Sebagai contoh, yang paling biasa Lisp sistem mempunyai fungsi menyusun yang boleh menyusun fungsi-fungsi baru yang diwujudkan semasa menjalankan. Ini menyediakan banyak kelebihan JIT, tetapi pengaturcara, bukannya runtime, adalah dalam kawalan apa bahagian kod disusun. Ini juga boleh menyusun kod yang dijana secara dinamik, yang boleh, dalam senario banyak, memberikan kelebihan besar prestasi lebih kod disusun statik [petikan diperlukan], serta lebih kebanyakan JIT sistem.
Satu matlamat yang sama menggunakan teknik JIT adalah untuk mencapai atau mengatasi prestasi kompilasi statik, manakala mengekalkan kelebihan tafsiran bytecode: Banyak "mengangkat berat" menghuraikan kod sumber asal dan melaksanakan pengoptimuman asas sering dikendalikan pada masa kompil, sebelum untuk penempatan: kompilasi dari bytecode kepada kod mesin adalah lebih cepat daripada menyusun dari sumber. Bytecode dikerahkan adalah mudah alih, tidak seperti kod asli. Sejak runtime mempunyai kawalan ke atas penyusunan, seperti bytecode ditafsirkan, ia boleh menjalankan dalam kotak pasir yang selamat. Penyusun dari bytecode kepada kod mesin adalah lebih mudah untuk menulis, kerana pengumpul bytecode mudah alih telah melakukan banyak kerja.
JIT kod umumnya menawarkan prestasi yang jauh lebih baik daripada jurubahasa. Di samping itu, ia boleh dalam beberapa kes menawarkan prestasi yang lebih baik daripada himpunan statik, sebagai pengoptimuman banyak hanya boleh dilaksanakan pada jangka masa:
1).Kompilasi boleh dioptimumkan kepada CPU disasarkan dan model sistem operasi di mana permohonan itu berjalan. Sebagai contoh JIT boleh memilih arahan CPU SSE2 apabila ia mengesan bahawa CPU menyokong mereka. Untuk mendapatkan tahap ini spesifisiti pengoptimuman dengan pengkompil statik, satu sama ada perlu menyusun binari untuk setiap platform dicadangkan / seni bina, atau lain termasuk versi pelbagai bahagian kod dalam binari tunggal.
2).Sistem ini adalah dapat mengumpul statistik tentang bagaimana program ini sebenarnya berjalan dalam persekitaran ia adalah dalam, dan ia boleh menyusun semula dan susun semula untuk prestasi yang optimum. Walau bagaimanapun, sesetengah penyusun statik juga boleh mengambil maklumat profil sebagai input.
Sistem boleh melakukan pengoptimuman kod global (misalnya 'inlining' fungsi perpustakaan) tanpa kehilangan kelebihan menghubungkan dinamik dan tanpa overhed wujud kepada penyusun linkers dan statik. 3).Khususnya, apabila melakukan penggantian sebaris global, proses penyusunan statik mungkin perlu cek masa jalanan dan memastikan bahawa panggilan maya akan berlaku jika kelas sebenar objek mengatasi kaedah inlined, dan cek keadaan sempadan pada capaian pelbagai mungkin perlu untuk diproses dalam gelung. Dengan penyusunan just-in-time dalam banyak kes pemprosesan ini boleh berpindah keluar gelung, sering memberi kenaikan besar kelajuan.
4).Walaupun ini adalah mungkin dengan statik disusun bahasa sampah dikutip, sistem bytecode lebih mudah boleh menyusun semula kod yang dilaksanakan bagi penggunaan cache yang lebih baik.

Kelewatan Permulaan dan Pengoptimalan
JIT biasanya menyebabkan sedikit kelewatan dalam pelaksanaan awal permohonan, kerana masa yang diambil untuk memuatkan dan menyusun bytecode. Kadang-kadang kelewatan ini dipanggil "masa kelewatan permulaan". Secara umum, lebih pengoptimuman JIT melaksanakan, lebih baik kod ia akan menjana, tetapi kelewatan awal juga akan meningkatkan. A pengkompil JIT itu mempunyai untuk membuat trade-off antara masa penyusunan dan kualiti kod ia berharap untuk menjana. Walau bagaimanapun, ia kelihatan bahawa banyak masa permulaan adalah kadang-kadang disebabkan oleh IO terikat operasi bukannya kompilasi JIT (sebagai contoh, kelas rt.jar data fail untuk Mesin Maya Java adalah 40 MB dan JVM mesti mendapatkan banyak data dalam fail ini Kontekstual besar).
Salah satu mungkin pengoptimuman, yang digunakan oleh Mesin Maya Java HotSpot Matahari, adalah untuk menggabungkan tafsiran dan kompilasi JIT. Kod permohonan mulanya ditafsirkan, tetapi monitor JVM yang urutan bytecode kerap dilaksanakan dan menterjemahkan mereka kepada kod mesin untuk pelaksanaan langsung kepada perkakasan. Untuk bytecode yang dilaksanakan hanya beberapa kali, ini menjimatkan masa kompilasi dan mengurangkan kependaman awal; untuk bytecode kerap dilaksanakan, kompilasi JIT digunakan untuk berjalan pada kelajuan tinggi, selepas fasa awal tafsiran perlahan. Selain itu, sejak program menghabiskan kebanyakan masa melaksanakan minoriti kod, masa kompilasi dikurangkan adalah penting. Akhirnya, semasa tafsiran kod awal, statistik pelaksanaan boleh dikumpul sebelum kompilasi, yang membantu untuk melaksanakan pengoptimuman yang lebih baik.
Tradeoff betul boleh berbeza disebabkan oleh keadaan. Sebagai contoh, Mesin Jawa Matahari Maya mempunyai dua mod utama-pelanggan dan pelayan. Dalam mod pelanggan, penyusunan minimum dan pengoptimuman dilakukan, untuk mengurangkan masa permulaan. Dalam mod pelayan, penyusunan yang luas dan pengoptimuman dilakukan, untuk memaksimumkan prestasi sekali permohonan itu berjalan dengan mengorbankan masa permulaan. Java lain just-in-time penyusun telah digunakan ukuran runtime beberapa kali kaedah telah dilaksanakan digabungkan dengan saiz bytecode kaedah sebagai satu heuristik untuk memutuskan bila untuk menyusun. Masih lagi menggunakan bilangan kali yang dilaksanakan digabungkan dengan pengesanan gelung. Secara umum, ia adalah lebih sukar meramalkan dengan tepat yang kaedah untuk mengoptimumkan dalam aplikasi berjalan pendek berbanding dengan orang-orang lama berjalan.
Imej Generator asli (Ngen) oleh Microsoft merupakan satu lagi pendekatan untuk mengurangkan kelewatan awal. Ngen pra-menyusun (atau "pra-jits") bytecode dalam imej Bahasa Common Intermediate ke dalam kod mesin asli. Hasilnya, tiada kompilasi runtime diperlukan. . BERSIH rangka kerja 2.0 dihantar dengan Visual Studio 2005 berjalan Ngen pada semua Microsoft perpustakaan DLL tepat selepas pemasangan. Pra-jitting menyediakan satu cara untuk meningkatkan masa permulaan. Walau bagaimanapun, yang berkualiti kod ia menjana tidak mungkin menjadi sebagai baik sebagai yang sedang jitted, untuk itu sebab yang sama mengapa kod disusun statik, tanpa profil-berpandu pengoptimuman, tidak boleh sebagai baik sebagai JIT disusun kod dalam kes yang melampau: kekurangan profil data untuk memandu, misalnya, selari caching.
Terdapat juga wujud Jawa pelaksanaan yang menggabungkan AOT (hadapan-of-masa) pengkompil dengan sama ada JIT pengkompil (Excelsior JET) atau jurubahasa (Pengkompil GNU untuk Java.)


No comments:

Post a Comment