Java Virtual Machine เรียกใช้โค้ดที่เขียนในภาษาอื่น ๆ ได้อย่างไร?


12

เนื่องจาก Java 1.6 JVM สามารถเรียกใช้ภาษาการเขียนโปรแกรมจำนวนมากแทนที่จะเป็นจาวา ฉันเข้าใจแนวคิดว่า Java ทำงานบน Java VM ได้อย่างไร แต่ไม่ใช่ว่าภาษาอื่น ๆ จะสามารถทำงานกับมันได้เช่นกัน สำหรับฉันมันดูเหมือนเวทมนตร์สีดำ คุณมีบทความใดบ้างที่ชี้ให้ฉันทราบเพื่อที่ฉันจะได้เข้าใจว่าสิ่งเหล่านี้เข้ากันได้อย่างไร


2
เช่นเดียวกับโปรเซสเซอร์ Intel / AMD / Solaris (??) ของคุณสามารถเรียกใช้ "ภาษาใด ๆ " (แม้ว่าคุณจะไม่ได้รันภาษา แต่เพียงไปตามโฟลว์ที่นี่) ซึ่งสามารถรวบรวมเป็นรหัสแอสเซมบลีดั้งเดิม
Apoorv Khurasia

13
สิ่งคือ JVM ไม่ได้เรียกใช้ Java มันทำงานแตกต่างกัน (แม้ว่าจะเกี่ยวข้องและง่ายสำหรับผู้สร้างคอมไพเลอร์ Java) และภาษาระดับต่ำ

นั่นเป็นความจริง. แต่ JVM เริ่มใช้ภาษาอื่นจากรุ่น 6 คุณไม่สามารถเรียกใช้ python หรือ Groovy ได้ (หรือไม่มีใครทำ) ในเวอร์ชัน 1.4.2 เหตุผลที่เป็นเช่นนั้น? มีการเปลี่ยนแปลงอย่างไร
Pomario

@delnan หรือมากกว่า "เป็นแบบจำลองระดับต่ำกว่าที่โปรแกรม javac รู้วิธีสร้างโค้ด Java"
Apoorv Khurasia

9
@Pomario Jythonมีมานานแล้ว และหน้านี้ดูเหมือนจะแนะนำว่าสคริปต์ Jython สามารถทำงานบน 1.4.2
Apoorv Khurasia

คำตอบ:


23

กุญแจสำคัญคือภาษาพื้นเมืองของ JVM: the Java bytecode ภาษาใด ๆ ที่สามารถรวบรวมเป็น bytecode ที่ JVM เข้าใจ - สิ่งที่คุณต้องการสำหรับสิ่งนี้คือคอมไพเลอร์ที่เปล่งออกมา bytecode จากนั้นเป็นต้นมาไม่มีความแตกต่างจากมุมมองของ JVM มากจนคุณสามารถรวบรวมไฟล์สกาล่า, Clojure, Jython และไฟล์คลาสอื่น ๆ และถอดรหัสมัน (โดยใช้JADเช่น) ลงในซอร์สโค้ด Java ที่ดูเป็นปกติ

คุณสามารถหารายละเอียดเพิ่มเติมเกี่ยวกับสิ่งนี้ได้ในบทความ / หัวข้อต่อไปนี้:

ฉันไม่ได้ตระหนักถึงการเปลี่ยนแปลงพื้นฐานใด ๆ ในJava 5หรือ6 JVMซึ่งจะทำให้เป็นไปได้หรือง่ายขึ้นสำหรับ (ภาษาที่รวบรวมรหัสจาก) ภาษาอื่น ๆ ที่จะทำงานกับมัน ในความเข้าใจของฉัน JVM 1.4 นั้นมีความสามารถมากขึ้นหรือน้อยลงในฐานะที่เป็น JVM 6 (อาจมีความแตกต่างแม้ว่าฉันไม่ใช่ผู้เชี่ยวชาญ JVM) มันเป็นเพียงว่าผู้คนเริ่มพัฒนาภาษาอื่น ๆ และ / หรือคอมไพเลอร์ bytecode ในช่วงครึ่งแรกของทศวรรษและผลลัพธ์ก็เริ่มปรากฏขึ้น

อย่างไรก็ตาม JVM เวอร์ชันเหล่านี้ทั้งหมดมีข้อ จำกัด บางประการ: JVM ถูกพิมพ์แบบคงที่ตามธรรมชาติและสูงถึง 7 รุ่นไม่รองรับภาษาแบบไดนามิก สิ่งนี้ได้เปลี่ยนไปด้วยการแนะนำของinvokedynamicคำสั่ง bytecode ใหม่ซึ่งช่วยให้วิธีการภาวนาอาศัยการตรวจสอบประเภทแบบไดนามิก


8
ไม่เป็นความจริงเลยที่ JVM ไม่ได้ "สนับสนุน" ภาษาแบบไดนามิก พวกเขาแค่ต้องใช้วิธีแก้ปัญหาที่มีข้อบกพร่องอย่างรุนแรง
Michael Borgwardt

3
@MichaelBorgwardt เราสามารถเห็นด้วยกับภาษาไดนามิกที่ทนต่อ JVM ก่อน v7 (บางส่วน) หรือไม่? :-)
PéterTörök

1
นั่นเป็นวิธีที่ดีในการวาง :)
Michael Borgwardt

3

เครื่องเสมือนเช่น JVM เป็นโปรแกรมที่รับเป็นอินพุตโดยปกติไฟล์ชุดคำสั่งง่าย ๆ (ซึ่งมักจะง่ายต่อการแปลงเป็นคำสั่ง CPU จริง) และรวบรวมและเรียกใช้เป็นคำสั่ง CPU แบบดั้งเดิม (โดยปกติจะใช้ คอมไพเลอร์ตามความต้องการเช่น HotSpot หรือ JIT)

มันเป็นชั้นของสิ่งที่เป็นนามธรรม โดยปกติแล้วการใช้งานชุดคำสั่งพอร์ตของ VM จะง่ายกว่าการใช้สถาปัตยกรรมตัวประมวลผลที่แตกต่างกันเนื่องจากมีความคล้ายคลึงกันหลายประการ นอกจากนี้ยังง่ายกว่ามากในการพอร์ตภาษาการเขียนโปรแกรมที่แตกต่างกันไปยังคำสั่ง VM เนื่องจากจะเน้นไปที่ภาษาการเขียนโปรแกรมที่ทันสมัยกว่าคำสั่ง CPU ดั้งเดิม เครื่องเสมือนจำนวนมากเช่น JVM และ CLR (.NET) มีคำแนะนำสำหรับการโทรวิธีการเสมือนและการสร้างอินสแตนซ์ของวัตถุ

ลองยกตัวอย่างภาษา เรียกมันว่า MyLanguage เนื่องจากเป็นภาษาโปรแกรมในที่สุดจึงรวบรวมชุดคำสั่งสถาปัตยกรรมซีพียูบางชุดในท้ายที่สุด นั่นหมายความว่าเนื่องจากชุดคำสั่ง Virtual Machine ที่ยืดหยุ่นและเข้ากันได้นั้นยังสามารถรวบรวม MyLanguage ลงในชุดคำสั่งของ VM นั้นได้

มีคำถามเกี่ยวกับประสิทธิภาพอยู่เสมอเนื่องจากคุณอาจต้องแฮ็กวิธีแก้ไขปัญหาบางอย่างในชุดคำสั่ง VM ที่คุณไม่ต้องทำตามปกติ แต่ก็ยังเป็นไปได้


3

JVM เป็นเครื่องคำนวณทัวริงที่สมบูรณ์ (ยกเว้นหน่วยความจำที่ จำกัด ) และเครื่องทัวริงที่สมบูรณ์ (ฟิสิคัลหรือเสมือน) สามารถเรียกใช้ภาษาโปรแกรมใด ๆ (ยกเว้นสำหรับหน่วยความจำประสิทธิภาพและข้อ จำกัด IO ทางกายภาพ)


เอ่อ .... ทำไมเราถึงต้องการคอมไพเลอร์ล่ะ? ;-)
PéterTörök

คอมไพเลอร์และล่ามสามารถทำงานบนเครื่องทัวริง (อาจช้า) บางทีขั้นตอนก่อนการรวบรวม / แปลอาจช่วยปรับปรุงประสิทธิภาพของการรันโปรแกรมบางโปรแกรมในบางภาษา
hotpaw2

1
จุดของฉันคือคำสั่งของคุณ"ใด ๆ ทัวริงเครื่องสมบูรณ์ (ทางกายภาพหรือเสมือนจริง) สามารถรันภาษาการเขียนโปรแกรมใด ๆ " อย่างแท้จริงหมายถึงว่า x86 CPU ของแล็ปท็อปของฉันสามารถรันไฟล์ต้นฉบับ Java ที่ดีนี้ได้โดยตรง หรือรหัสเครื่องสำหรับโปรเซสเซอร์ PowerPC หากไม่มีคอมไพเลอร์ - CPU จะไม่มีคอมไพเลอร์ใช่ไหม :-)
PéterTörök

"เครื่องจักร" ของคุณเป็นมากกว่าซีพียู
hotpaw2

1
@ PéterTörökฉันเห็นประเด็นของคุณแล้ว เขาไม่ได้อธิบายรายละเอียดเกี่ยวกับ VM เหมือนที่เราทำ แต่ฉันคิดว่าคำตอบของเขายังตอบคำถามของ OP สั้น ๆ JVM สามารถ "รัน" ภาษาการเขียนโปรแกรมอื่นได้เนื่องจากสามารถ "รัน" ภาษาการเขียนโปรแกรมใด ๆ ได้เนื่องจากเป็นทัวริงที่สมบูรณ์ อาจไม่ซับซ้อน แต่ก็ยังเป็นจุดที่กระชับและถูกต้อง :)
Yam Marcovic

2

แค่คิดว่า JVM เป็นโปรเซสเซอร์ที่มีชุดคำสั่งของตัวเองเช่น x86 โปรเซสเซอร์สามารถประมวลผลรหัสพูด C ที่ถูกคอมไพล์เป็นภาษาเครื่อง การใช้การเปรียบเทียบแบบเดียวกันกับ JVM ภาษาอื่นสามารถดำเนินการได้บน JVM เช่นเดียวกับตัวประมวลผลอื่นหากภาษาเหล่านั้นถูกคอมไพล์ลงในคำแนะนำเครื่องของ JVM JVM สามารถเรียกใช้คำแนะนำเหล่านี้สำหรับภาษา X


การเปรียบเทียบของคุณเป็นคนดี
cobi
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.