JavaRush /Java Blogu /Random-AZ /Maşın kodu və bayt kodu: proqramınız hansı dildə danışır?...

Maşın kodu və bayt kodu: proqramınız hansı dildə danışır?

Qrupda dərc edilmişdir
Java ilə yeni tanış olmağa başlayanlar tez-tez maşın kodu və bayt kodu anlayışları ilə bağlı çaşqınlıq yaşayırlar . Onlar nədirlər? Fərqlər nələrdir? Qısa bir qeyddə, bu məsələni birdəfəlik bağlamaq üçün onların xüsusiyyətlərini mümkün qədər sadə və aydın şəkildə təsvir etməyə çalışacağıq.
Maşın kodu və bayt kodu: proqramınız hansı dildə danışır?  - 1

Maşın kodu

Prosessor mahiyyət etibarilə çox mürəkkəb və təkmil kalkulyatordur. Onun üzərində və arasında müxtəlif riyazi və bayt əməliyyatlarının yerinə yetirildiyi bir çox yaddaş yerləri (registrlər adlanır) var. Maşın kodu əməliyyatların ardıcıllığının və cəlb olunan verilənlər toplusunun dəqiq təsviridir. Əslində, bu, kompüterinizin prosessorunun başa düşdüyü yeganə dildir.

Anadangəlmə uyğunsuzluq

Üstəlik, bütün prosessorlar eyni dildə “danışmır”. Təkcə CISCRISC arxitekturaları arasında deyil , həm də bu “düşərgələr” daxilində də fərqlər var .

CISC (Complex Instruction Set Computing) aşağıdakı xüsusiyyətlər dəsti ilə xarakterizə olunan prosessor dizayn konsepsiyasıdır:

  • uzunluğu fərqli olan çoxlu əmrlər;
  • bir çox ünvanlama rejimi;
  • kompleks təlimat kodlaşdırması.
RISC (Reduced Instruction Set Computing) - azaldılmış təlimat dəstinə malik prosessor. Əmrlər eyni formatda, qısa, sadə kodlaşdırma ilə.
Yeni nəsil prosessorlar köhnə nəsil modellərə sadəcə olaraq məlum olmayan əlavə təlimat dəstləri təqdim edir. Bu səbəbdən bir arxitektura (yaxud bir nəsil prosessor) üçün tərtib edilmiş proqramlar digər avadanlıqlarda işləyə bilməz. Bütün bunlar bizi proqramların başqa kompüterlərdə işləməsini təmin etmək üçün onları yenidən tərtib etməyə məcbur edir. Bununla belə, yalnız prosessorlara görə deyil, həm də proqramların və əməliyyat sisteminin qarşılıqlı təsirindəki fərqlərə görə yenidən tərtib etməlisiniz. Məhz bunlara görə Linux altında “Windows” proqramını, Windows altında isə “Linux” proqramını işlətmək mümkün deyil.

Bayt kodu

Baytkod bir çox cəhətdən maşın koduna bənzəyir, yalnız o, real prosessordan deyil, virtualdan olan bir sıra təlimatlardan istifadə edir. Bundan əlavə, o , proqramın işlədiyi real prosessor üçün əmrlərin icrasını optimallaşdıran JIT kompilyatorunun istifadəsinə yönəlmiş bölmələri əhatə edə bilər .
JIT kompilyasiyası (Just-in-time compilation, on-the-fly compilation) və ya dinamik kompilyasiya (dinamik tərcümə) bayt kodunu maşın koduna və ya bilavasitə başqa formata tərtib edərkən bayt kodunu istifadə edən proqram sistemlərinin performansını artırmaq üçün texnologiyadır. proqram işləyir. “Rəsmi olaraq” Java-da 9-cu versiyaya qədər yalnız JIT kompilyatoru var idi. Java 9-da başqa bir kompilyator meydana çıxdı və o, vaxtından əvvəl tərtib edir (AoT). Bu xüsusiyyət virtual maşında işləməzdən əvvəl Java siniflərinin yerli koda yığılmasına imkan verir. Bu funksiya həm kiçik, həm də böyük tətbiqlər üçün işə başlama vaxtlarını yaxşılaşdırmaq üçün nəzərdə tutulub və bu, pik performansa məhdud təsir göstərir.
CISC prosessorları üçün bəzi təlimatlar prosessor tərəfindən dəstəklənən daha mürəkkəb strukturlarda birləşdirilə bilər və RISC üçün , əksinə, daha sadə təlimat ardıcıllığına bölünə bilər.

Həmçinin virtual OS

Bununla belə, bayt kodu yalnız prosessor təlimatlarını ehtiva etmir. O, həmçinin virtual əməliyyat sistemi ilə qarşılıqlı əlaqə üçün məntiqi ehtiva edir ki, bu da proqramın davranışını kompüterdə istifadə olunan əməliyyat sistemindən müstəqil edir. Bu JVM- də aydın görünür , burada sistem zəngləri ilə iş və GUI çox vaxt proqramın işlədiyi ƏS-dən müstəqildir. Ümumiyyətlə, JVM yalnız virtual sistem/avadanlıq yaradan Virtual Box kimi həllərdən fərqli olaraq proqram prosesinin işə salınmasını təqlid edir .

JVM belə yeganədir?

Qətiyyən yox. Eyni DotNet CLI də virtual maşındır və ən çox x86 uyğun prosessorları olan Windows ilə işləyən kompüterlərdə istifadə olunur . Bununla belə, onun digər sistemlər üçün tətbiqi mövcuddur: onun üçün proqramlar ARM (RISC) uyğun prosessorlarında işləyən Windows RT- də işləməlidir və ya siz onları üçüncü tərəf olan (və buna görə də) Mono mühitində Linux/OSX- də işlədə bilərsiniz. tam uyğun deyil) bu platformalar üçün DotNet tətbiqi . Beləliklə, bu platforma, JVM kimi , müxtəlif prosessorlarda və müxtəlif əməliyyat sistemlərində işləyir. Daha çox oxşar həllər var (həm köhnə, həm də yeni): LLVM , Flash SWF və s. Bəzi proqramlaşdırma dillərinin öz virtual maşınları var. Məsələn, CPython PY mənbələrini PYC fayllarına - PVM- də işləmək üçün hazırlanmış tərtib edilmiş bayt koduna tərtib edir . Və ya daha qədim bir nümunə var - Lisp FASL (Fast Load) fayllarına yığıla bilər . Əslində, onlar mənbə kodundan generator tərəfindən qurulmuş bir AST ağacını ehtiva edirlər. Bu fayllar müxtəlif platformalarda Lisp tərcüməçisi tərəfindən oxuna və icra edilə bilər və ya hazırda istifadə olunan aparat arxitekturası üçün maşın kodu yaratmaq üçün istifadə edilə bilər.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION