JavaRush /Java blogi /Random-UZ /Mashina kodi va bayt kodi: dasturingiz qaysi tilda gapira...

Mashina kodi va bayt kodi: dasturingiz qaysi tilda gapiradi?

Guruhda nashr etilgan
Java bilan endigina tanishishni boshlaganlar ko'pincha mashina kodi va bayt kodi tushunchalarini chalkashtirib yuborishadi . Ular nima? Qanday farqlar bor? Qisqa eslatmada biz ushbu masalani bir marta va butunlay yopish uchun ularning xususiyatlarini iloji boricha sodda va aniq tasvirlashga harakat qilamiz.
Mashina kodi va bayt kodi: dasturingiz qaysi tilda gapiradi?  - 1

Mashina kodi

Protsessor , mohiyatiga ko'ra, juda murakkab va ilg'or kalkulyatordir. U ko'plab xotira joylariga (registrlar deb ataladi) ega va ular orasida turli matematik va bayt operatsiyalari bajariladi. Mashina kodi - bu operatsiyalar ketma-ketligi va tegishli ma'lumotlar to'plamining aniq tavsifi. Aslida, bu sizning kompyuteringiz protsessori tushunadigan yagona tildir.

Tug'ma mos kelmaslik

Shu bilan birga, barcha protsessorlar bir xil tilda "so'zlashmaydi". Faqat CISC va RISC arxitekturalari o'rtasida emas , balki ushbu "lagerlar" ichida ham farqlar mavjud .

CISC (Complex Instruction Set Computing) - bu quyidagi xususiyatlar to'plami bilan tavsiflangan protsessor dizayni konsepsiyasi:

  • uzunligi har xil bo'lgan ko'plab buyruqlar;
  • ko'plab manzil usullari;
  • murakkab ko'rsatmalar kodlash.
RISC (Reduced Instruction Set Computing) - qisqartirilgan buyruqlar to'plamiga ega protsessor. Buyruqlar bir xil formatda, qisqa, oddiy kodlash bilan.
Yangi avlod protsessorlari eski avlod modellariga noma'lum bo'lgan qo'shimcha ko'rsatmalar to'plamini taqdim etadi. Shu sababli, bitta arxitektura (yoki protsessorlarning bir avlodi) uchun tuzilgan dasturlar boshqa uskunada ishlay olmaydi. Bularning barchasi bizni dasturlarni boshqa kompyuterlarda ishlashini ta'minlash uchun ularni qayta kompilyatsiya qilishga majbur qiladi. Biroq, siz faqat protsessorlar tufayli emas, balki dasturlar va operatsion tizimning o'zaro ta'siridagi farqlar tufayli ham qayta kompilyatsiya qilishingiz kerak. Aynan ular tufayli Linux ostida "Windows" dasturini va Windows ostida "Linux" dasturini ishga tushirish mumkin emas.

Baytkod

Baytkod ko'p jihatdan mashina kodiga o'xshaydi, faqat u haqiqiy protsessordan emas, balki virtualdan ko'rsatmalar to'plamidan foydalanadi. Bundan tashqari, u JIT kompilyatoridan foydalanishga qaratilgan bo'limlarni o'z ichiga olishi mumkin , bu dastur ishlayotgan haqiqiy protsessor uchun buyruqlar bajarilishini optimallashtiradi.
JIT kompilyatsiyasi (Just-in-time kompilyatsiya, on-the-fly compilation) yoki dinamik kompilyatsiya (dinamik tarjima) - bu bayt kodini mashina kodiga yoki bevosita boshqa formatga kompilyatsiya qilish orqali bayt kodidan foydalanadigan dasturiy ta'minot tizimlarining ish faoliyatini oshirish texnologiyasi. dastur ishlayapti. "Rasman" Java-da 9-versiyagacha faqat JIT kompilyatori mavjud edi. Java 9 da boshqa kompilyator paydo bo'ldi va u muddatidan oldin kompilyatsiya qiladi (AoT). Bu xususiyat Java sinflarini virtual mashinada ishga tushirishdan oldin mahalliy kodga kompilyatsiya qilish imkonini beradi. Bu xususiyat kichik va katta ilovalar uchun ishga tushirish vaqtlarini yaxshilash uchun moʻljallangan, bu esa eng yuqori unumdorlikka cheklangan taʼsir qiladi.
CISC protsessorlari uchun ba'zi ko'rsatmalar protsessor tomonidan qo'llab-quvvatlanadigan murakkabroq tuzilmalarga birlashtirilishi mumkin va RISC uchun , aksincha, ularni oddiyroq ketma-ketliklarga bo'lish mumkin.

Bundan tashqari, virtual OT

Biroq, bayt kodi nafaqat protsessor ko'rsatmalarini o'z ichiga oladi. Bundan tashqari, u virtual operatsion tizim bilan o'zaro ishlash mantiqini o'z ichiga oladi, bu esa dasturning xatti-harakatlarini kompyuterda ishlatiladigan operatsion tizimdan mustaqil qiladi. Bu tizim qo'ng'iroqlari bilan ishlash va GUI ko'pincha dastur ishlayotgan OTdan mustaqil bo'lgan JVM da aniq ko'rinadi . Umuman olganda, JVM faqat virtual tizim/apparat yaratadigan Virtual Box kabi yechimlardan farqli o'laroq, dastur jarayonini ishga tushirishga taqlid qiladi .

JVM shunday yagonami?

Albatta yo'q. Xuddi shu DotNet CLI ham virtual mashina bo'lib, u ko'pincha x86 mos protsessorlari bo'lgan Windows bilan ishlaydigan kompyuterlarda qo'llaniladi. Biroq, uning boshqa tizimlar uchun ham amalga oshirilishi mavjud: u uchun ilovalar ARM (RISC) bilan mos keladigan protsessorlarda ishlaydigan Windows RT da ishlashi kerak yoki siz ularni Linux/OSX da Mono muhitida ishga tushirishingiz mumkin , bu uchinchi tomon (va shuning uchun) to'liq mos kelmaydi) ushbu platformalar uchun DotNet dasturini amalga oshirish. Shunday qilib, bu platforma, JVM kabi , turli protsessorlarda va turli xil operatsion tizimlarda ishlaydi. Shunga o'xshash ko'plab echimlar mavjud (ham eski, ham yangi): LLVM , Flash SWF va boshqalar. Ba'zi dasturlash tillarida o'zlarining virtual mashinalari mavjud. Masalan, CPython PY manbalarini PYC fayllariga kompilyatsiya qiladi - PVM da ishlashga tayyorlangan tuzilgan bayt kodlari . Yoki ancha eski misol bor - Lisp FASL (Tez yuklash) fayllariga kompilyatsiya qilinishi mumkin . Aslida, ular manba kodidan generator tomonidan qurilgan AST daraxtini o'z ichiga oladi. Ushbu fayllar Lisp tarjimoni tomonidan turli platformalarda o'qilishi va bajarilishi yoki hozirda foydalanilayotgan apparat arxitekturasi uchun mashina kodini yaratish uchun ishlatilishi mumkin .
Izohlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION