JavaRush /จาวาบล็อก /Random-TH /รหัสเครื่องและรหัสไบต์: โปรแกรมของคุณพูดภาษาอะไร

รหัสเครื่องและรหัสไบต์: โปรแกรมของคุณพูดภาษาอะไร

เผยแพร่ในกลุ่ม
ผู้ที่เพิ่งเริ่มคุ้นเคยกับ Java มักจะสับสนเกี่ยวกับแนวคิดของรหัสเครื่องและรหัสไบต์ พวกเขาคืออะไร? อะไรคือความแตกต่าง? โดยสรุปสั้นๆ เราจะพยายามอธิบายคุณลักษณะต่างๆ ของตนให้เรียบง่ายและชัดเจนที่สุดเท่าที่จะเป็นไปได้ เพื่อยุติปัญหานี้ทันทีและตลอดไป
รหัสเครื่องและรหัสไบต์: โปรแกรมของคุณพูดภาษาอะไร  - 1

รหัสเครื่อง

โดยพื้นฐานแล้ว โปรเซสเซอร์นั้นเป็นเครื่องคิดเลขที่ซับซ้อนและล้ำหน้ามาก มีตำแหน่งหน่วยความจำจำนวนมาก (เรียกว่ารีจิสเตอร์) ซึ่งดำเนินการทางคณิตศาสตร์และไบต์ต่างๆ รหัสเครื่องคือคำอธิบายลำดับการทำงานและชุดข้อมูลที่เกี่ยวข้องอย่างชัดเจน อันที่จริง มันเป็นภาษาเดียวที่โปรเซสเซอร์ของคอมพิวเตอร์ของคุณเข้าใจ

ความไม่เข้ากันแต่กำเนิด

ในเวลาเดียวกัน ไม่ใช่ว่าโปรเซสเซอร์ทุกตัวจะ "พูด" ภาษาเดียวกัน มีความแตกต่างไม่เพียงระหว่าง สถาปัตยกรรม CISCและRISC เท่านั้น แต่ยังรวมถึง "ค่าย" เหล่านี้ด้วย

CISC (Complex Instruction Set Computing) เป็นแนวคิดการออกแบบโปรเซสเซอร์ที่มีลักษณะเฉพาะด้วยชุดคุณสมบัติต่อไปนี้:

  • คำสั่งมากมาย ความยาวต่างกัน
  • โหมดการกำหนดแอดเดรสมากมาย
  • การเข้ารหัสคำสั่งที่ซับซ้อน
RISC (การคำนวณชุดคำสั่งแบบลด) - โปรเซสเซอร์ที่มีชุดคำสั่งแบบลดขนาด คำสั่งมีรูปแบบเดียวกัน สั้น และมีการเข้ารหัสอย่างง่าย
โปรเซสเซอร์รุ่นใหม่แนะนำชุดคำสั่งเพิ่มเติมที่รุ่นเก่าๆ ไม่รู้จัก ด้วยเหตุนี้ โปรแกรมที่คอมไพล์สำหรับสถาปัตยกรรมหนึ่ง (หรือโปรเซสเซอร์รุ่นหนึ่ง) จึงไม่สามารถทำงานบนฮาร์ดแวร์อื่นได้ ทั้งหมดนี้บังคับให้เราคอมไพล์โปรแกรมใหม่เพื่อให้แน่ใจว่าโปรแกรมเหล่านั้นทำงานบนคอมพิวเตอร์เครื่องอื่นได้ อย่างไรก็ตาม คุณต้องคอมไพล์ใหม่ไม่เพียงเพราะโปรเซสเซอร์เท่านั้น แต่ยังรวมถึงความแตกต่างในการโต้ตอบของโปรแกรมและระบบปฏิบัติการด้วย เป็นเพราะเหตุนี้จึงเป็นไปไม่ได้ที่จะเรียกใช้โปรแกรม "Windows" บน Linux และโปรแกรม "Linux" บน Windows

ไบต์โค้ด

Bytecode มีความคล้ายคลึงกับรหัสเครื่องหลายประการ เพียงแต่ใช้ชุดคำสั่งที่ไม่ได้มาจากโปรเซสเซอร์จริง แต่มาจากชุดคำสั่งเสมือน นอกจากนี้ยังอาจรวมถึงส่วนที่เน้นไปที่การใช้คอมไพเลอร์ JITซึ่งปรับการดำเนินการคำสั่งให้เหมาะสมสำหรับโปรเซสเซอร์จริงที่โปรแกรมกำลังทำงานอยู่
การคอมไพล์ JIT (การคอมไพล์แบบ Just-in-time, การคอมไพล์แบบทันที) หรือการคอมไพล์แบบไดนามิก (การแปลแบบไดนามิก) เป็นเทคโนโลยีสำหรับการเพิ่มประสิทธิภาพของระบบซอฟต์แวร์ที่ใช้ bytecode โดยการคอมไพล์ bytecode ให้เป็นรหัสเครื่องหรือเป็นรูปแบบอื่นโดยตรงในขณะที่ โปรแกรมกำลังทำงานอยู่ “อย่างเป็นทางการ” ใน Java จนถึงเวอร์ชัน 9 มีเพียงคอมไพเลอร์ JIT ใน Java 9 มีคอมไพเลอร์อีกตัวปรากฏขึ้น และคอมไพล์ล่วงหน้า (AoT) คุณลักษณะนี้ช่วยให้สามารถคอมไพล์คลาส Java เป็นโค้ดเนทีฟก่อนที่จะรันบนเครื่องเสมือน คุณลักษณะนี้ได้รับการออกแบบมาเพื่อปรับปรุงเวลาเริ่มต้นสำหรับแอปพลิเคชันทั้งขนาดเล็กและขนาดใหญ่ โดยมีผลกระทบต่อประสิทธิภาพสูงสุดอย่างจำกัด
สำหรับ โปรเซสเซอร์ CISCคำสั่งบางอย่างสามารถรวมเข้ากับโครงสร้างที่ซับซ้อนมากขึ้นซึ่งสนับสนุนโดยโปรเซสเซอร์ และสำหรับRISCในทางกลับกัน สามารถแยกย่อยออกเป็นลำดับคำสั่งที่ง่ายกว่าได้

ยังเป็นระบบปฏิบัติการเสมือน

อย่างไรก็ตาม รหัสไบต์ไม่ได้มีเพียงคำสั่งโปรเซสเซอร์เท่านั้น นอกจากนี้ยังมีตรรกะสำหรับการโต้ตอบกับระบบปฏิบัติการเสมือน ซึ่งทำให้พฤติกรรมของแอปพลิเคชันเป็นอิสระจากระบบปฏิบัติการที่ใช้บนคอมพิวเตอร์ สิ่งนี้สามารถมองเห็นได้ชัดเจนในJVMซึ่งการทำงานกับการเรียกของระบบและGUIมักจะไม่ขึ้นอยู่กับระบบปฏิบัติการที่โปรแกรมกำลังทำงานอยู่ โดยทั่วไปแล้วJVMจำลองการเปิดตัวกระบวนการของโปรแกรม ซึ่งแตกต่างจากโซลูชันเช่นVirtual Boxซึ่งสร้างเฉพาะระบบ/ฮาร์ดแวร์เสมือน

JVM คนเดียวแบบนี้เหรอ?

ไม่อย่างแน่นอน. DotNet CLIเดียวกันนี้ยังเป็นเครื่องเสมือนซึ่งส่วนใหญ่มักใช้บนคอมพิวเตอร์ที่ใช้Windows ที่มีโปรเซสเซอร์ที่รองรับ x86 อย่างไรก็ตาม มีการใช้งานสำหรับระบบอื่น: แอปพลิเคชันจะต้องทำงานบนWindows RTที่ทำงานบน โปรเซสเซอร์ที่รองรับ ARM (RISC)หรือคุณสามารถเรียกใช้บนLinux/OSXใน สภาพแวดล้อม แบบ Monoซึ่งเป็นบุคคลที่สาม (และดังนั้น ไม่รองรับอย่างสมบูรณ์) การใช้DotNetสำหรับแพลตฟอร์มเหล่านี้ ดังนั้นแพลตฟอร์มนี้ เช่นJVMที่ทำงานบนโปรเซสเซอร์และระบบปฏิบัติการที่แตกต่างกัน มีวิธีแก้ไขปัญหาที่คล้ายกันอีกมากมาย (ทั้งเก่าและใหม่): LLVM , Flash SWFและอื่น ๆ ภาษาโปรแกรมบางภาษามีเครื่องเสมือนของตัวเอง ตัวอย่างเช่นCPython รวบรวม แหล่งPYลงใน ไฟล์ PYCซึ่งเป็นรหัสไบต์ที่คอมไพล์แล้วซึ่งเตรียมไว้ให้ทำงานในPVM หรือมีตัวอย่างที่เก่ากว่ามาก - Lispสามารถคอมไพล์เป็นไฟล์FASL (Fast Load) ได้ ในความเป็นจริงพวกเขามีแผนผัง ASTที่สร้างโดยตัวสร้างจากซอร์สโค้ด ไฟล์เหล่านี้สามารถอ่านและดำเนินการได้โดย ล่าม Lispบนแพลตฟอร์มต่างๆ หรือใช้เพื่อสร้างรหัสเครื่องสำหรับสถาปัตยกรรมฮาร์ดแวร์ที่ใช้ในปัจจุบัน
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION