JavaRush /Java Blog /Random-TL /Machine code at byte code: anong wika ang sinasalita ng i...

Machine code at byte code: anong wika ang sinasalita ng iyong program?

Nai-publish sa grupo
Ang mga nagsisimula pa lamang na maging pamilyar sa Java ay madalas na nalilito tungkol sa mga konsepto ng machine code at byte code . Ano sila? Ano ang mga pagkakaiba? Sa isang maikling tala, susubukan naming ilarawan ang kanilang mga tampok bilang simple at malinaw hangga't maaari upang isara ang isyung ito minsan at para sa lahat.
Machine code at byte code: anong wika ang sinasalita ng iyong program?  - 1

Code ng makina

Ang processor ay, sa esensya, isang napaka-komplikado at advanced na calculator. Ito ay may maraming mga lokasyon ng memorya (tinatawag na mga rehistro) kung saan at sa pagitan ng iba't ibang mga operasyong matematika at byte ay ginaganap. Ang machine code ay isang tiyak na paglalarawan ng pagkakasunud-sunod ng mga operasyon at ang hanay ng data na kasangkot. Sa katunayan, ito ang tanging wika na naiintindihan ng processor ng iyong computer.

Congenital incompatibility

Kasabay nito, hindi lahat ng mga processor ay "nagsasalita" ng parehong wika. May mga pagkakaiba hindi lamang sa pagitan ng mga arkitektura ng CISC at RISC , kundi pati na rin sa loob ng "mga kampo" na ito.

Ang CISC (Complex Instruction Set Computing) ay isang konsepto ng disenyo ng processor na nailalarawan sa pamamagitan ng mga sumusunod na hanay ng mga katangian:

  • maraming utos, iba ang haba;
  • maraming mga mode ng pagtugon;
  • kumplikadong pagtuturo coding.
RISC (Reduced Instruction Set Computing) - isang processor na may pinababang set ng pagtuturo. Ang mga utos ay may parehong format, maikli, na may simpleng coding.
Ang mga bagong henerasyon ng mga processor ay nagpapakilala ng mga karagdagang set ng mga tagubilin na hindi alam ng mga mas lumang modelo ng henerasyon. Dahil dito, ang mga program na pinagsama-sama para sa isang arkitektura (o isang henerasyon ng mga processor) ay hindi maaaring tumakbo sa iba pang hardware. Ang lahat ng ito ay nagpipilit sa amin na muling mag-compile ng mga programa upang matiyak na gumagana ang mga ito sa iba pang mga computer. Gayunpaman, kailangan mong mag-recompile hindi lamang dahil sa mga processor, kundi dahil din sa mga pagkakaiba sa pakikipag-ugnayan ng mga programa at operating system. Ito ay dahil sa kanila na imposibleng magpatakbo ng isang "Windows" na programa sa ilalim ng Linux, at isang "Linux" na programa sa ilalim ng Windows.

Bytecode

Ang Bytecode sa maraming paraan ay katulad ng machine code, gumagamit lamang ito ng isang set ng mga tagubilin hindi mula sa isang tunay na processor, ngunit mula sa isang virtual. Bukod dito, maaari itong magsama ng mga seksyon na nakatuon sa paggamit ng JIT compiler , na nag-o-optimize sa pagpapatupad ng mga utos para sa totoong processor kung saan tumatakbo ang program.
Ang JIT compilation (Just-in-time compilation, on-the-fly compilation) o dynamic na compilation (dynamic na pagsasalin) ay isang teknolohiya para sa pagpapataas ng performance ng mga software system na gumagamit ng bytecode sa pamamagitan ng pag-compile ng bytecode sa machine code o sa ibang format nang direkta habang tumatakbo ang programa. "Opisyal" sa Java hanggang bersyon 9 mayroon lamang JIT compiler. Sa Java 9, isa pang compiler ang lumitaw, at ito ay nag-compile nang maaga (AoT). Ang tampok na ito ay nagpapahintulot sa mga klase ng Java na ma-compile sa katutubong code bago tumakbo sa isang virtual machine. Idinisenyo ang feature na ito para pahusayin ang mga oras ng pagsisimula para sa maliliit at malalaking application, na may limitadong epekto sa peak performance.
Para sa mga processor ng CISC , ang ilang mga tagubilin ay maaaring pagsamahin sa mas kumplikadong mga istruktura na sinusuportahan ng processor, at para sa RISC , sa kabaligtaran, maaari silang hatiin sa mas simpleng mga pagkakasunud-sunod ng mga tagubilin.

Isa ring virtual OS

Gayunpaman, ang byte code ay naglalaman ng hindi lamang mga tagubilin ng processor. Naglalaman din ito ng lohika para sa pakikipag-ugnayan sa isang virtual na operating system, na ginagawang independyente ang pag-uugali ng application sa operating system na ginagamit sa computer. Ito ay malinaw na nakikita sa JVM , kung saan gumagana ang mga system call at ang GUI ay kadalasang independyente sa OS kung saan tumatakbo ang program. Sa pangkalahatan, tinutulad ng JVM ang paglulunsad ng isang proseso ng programa, hindi katulad ng mga solusyon tulad ng Virtual Box , na lumilikha lamang ng isang virtual system/hardware.

Si JVM lang ba ang ganito?

Talagang hindi. Ang parehong DotNet CLI ay isa ring virtual machine, na kadalasang ginagamit sa mga computer na nagpapatakbo ng Windows na may mga x86 compatible na processor. Gayunpaman, mayroong isang pagpapatupad para sa iba pang mga system: ang mga application para dito ay dapat tumakbo sa Windows RT na tumatakbo sa ARM (RISC) compatible processor, o maaari mong patakbuhin ang mga ito sa Linux/OSX sa Mono environment , na isang third-party (at samakatuwid ay hindi ganap na tugma) pagpapatupad ng DotNet para sa mga platform na ito. Kaya ang platform na ito, tulad ng JVM , ay tumatakbo sa iba't ibang mga processor at iba't ibang OS. Marami pang katulad na solusyon (parehong luma at bago): LLVM , Flash SWF , at iba pa. Ang ilang mga programming language ay may sariling virtual machine. Halimbawa, kino-compile ng CPython ang mga source ng PY sa mga PYC file - pinagsama-samang byte code na handang tumakbo sa PVM . O may mas lumang halimbawa - Ang Lisp ay maaaring i-compile sa FASL (Fast Load) na mga file. Sa katunayan, naglalaman ang mga ito ng AST tree na binuo ng generator mula sa source code. Ang mga file na ito ay maaaring basahin at isakatuparan ng Lisp interpreter sa iba't ibang mga platform, o ginagamit upang bumuo ng machine code para sa kasalukuyang ginagamit na arkitektura ng hardware.
Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION