อะไรทำให้ JVM มีความหลากหลายในการรองรับภาษา JVM มากมาย


18

JVM รองรับภาษาอื่น ๆ อีกมากมายนอกเหนือจาก Java เช่นGroovy,Clojure,Scalaetc ซึ่งเป็นภาษาที่ใช้งานได้แตกต่างจาก Java (ฉันหมายถึงJava ก่อนเวอร์ชัน 8ที่Lambda'sไม่รองรับ) ที่ไม่รองรับความสามารถในการทำงานในระดับสูงสิ่งที่ทำให้ JVM อเนกประสงค์นั้น สามารถรองรับทั้ง Object Oriented และ Function Functional ได้หรือไม่


"Groovy, Clojure, Scala ฯลฯ ซึ่งใช้งานได้" บางส่วนทำงานได้ดีกว่าอุปกรณ์อื่น ฉันจะใช้ขนาดกับ Groovy อย่างน้อย funcional และ Clojure มากที่สุดโดยมี Scala อยู่ตรงกลาง
Vorg van Geir

คำตอบ:


37

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

ตัวอย่างเช่นจนกระทั่ง Java 7 เปิดตัวinvokedynamicbytecode มันยากมากที่จะใช้ภาษา OO ที่พิมพ์แบบไดนามิกบน JVM - คุณต้องใช้วิธีแก้ปัญหาที่ซับซ้อนซึ่งไม่ดีต่อประสิทธิภาพและทำให้เกิดร่องรอยกองซ้อนที่น่ากลัว

และยังมีภาษาไดนามิกส์มากมาย (Groovy, Jython, JRuby และอื่น ๆ ) ถูกนำมาใช้กับ JVM ก่อนหน้านั้น

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

และอาจมีความสำคัญมากกว่าเนื่องจากมีโค้ด Java จำนวนมากที่ทำสิ่งใดและถ้าภาษาของคุณทำงานบน JVM คุณสามารถนำเสนอสิ่งอำนวยความสะดวกเพื่อรวมเข้ากับโค้ดนั้นได้อย่างง่ายดาย โดยพื้นฐานแล้วการที่ภาษาของคุณทำงานบน JVM นั้นเป็นรุ่นที่ให้การทำงานร่วมกันกับ C.


คำตอบที่ดี (+1) จุดสุดท้ายที่คุณพูดถึงคือ IMHO ยังรับผิดชอบต่อความนิยมของ Java ในภาษา: ในที่สุดการมีรหัสจำนวนมากที่คุณสามารถนำมาใช้ใหม่ได้ฟรีสามารถช่วยคุณประหยัดเวลาได้มากกว่าการใช้ภาษาล่าสุดและทันสมัยที่สุด คุณสมบัติ
Giorgio

4

JVM ถูกเขียนขึ้นเพื่อทำหน้าที่เหมือนซีพียูโดยทั่วไปมีชุดคำสั่งชนิดของแอสเซมบลีที่ VM ทำงานเรียกว่า bytecodes หากคุณสามารถเขียนคอมไพเลอร์ที่สร้างชุดของไบต์ที่ถูกต้องแล้ว JVM สามารถเรียกใช้พวกเขา

Wikipedia มีรายชื่อ bytecodes:

http://en.wikipedia.org/wiki/Java_bytecode_instruction_listings

เช่นเดียวกับคำอธิบายวิธีที่ JVM โหลดรหัสไบต์:

http://en.wikipedia.org/wiki/Java_virtual_machine

ด้วยการใช้รูปแบบไบต์เรียกใช้ภาษาการทำงานสามารถรันรหัสโดยไม่คำนึงถึงแหล่งที่มา นอกจากนี้ด้วยการเพิ่ม invokevirtual การใช้ภาษาเช่น jruby นั้นให้ความยืดหยุ่นกับวิธีการใช้งาน


1
สิ่งเดียวกันนี้เป็นจริงสำหรับ VM อื่น ๆ ทุกตัวที่นั่น: YARV Ruby VM, Rubinius Ruby VM, CPython VM (ซึ่งหลังจากนั้นถือกำเนิด JVM), Parrot, Smalltalk และ Lisp VM ต่าง ๆ และแน่นอน Pascal P- ระบบโค้ดหลังจากนั้น JVM ถูกสร้างแบบจำลอง
Jörg W Mittag

ตกลง JVM ไม่ใช่ VM แรกที่ออกมาแน่นอน ฉันคิดว่า JVM เป็นที่นิยมสำหรับภาษาอื่นเพราะ Java เป็นที่นิยม VM ได้รับการพัฒนาอย่างแข็งขันและมีเอกสารที่ดี
sasbury

2

ฉันจะเพิ่มว่า JVM สนับสนุน Memory Model ( JMM ) ที่กำหนดไว้อย่างดีและค่อนข้างดีซึ่งหมายถึงการสนับสนุนที่ดีสำหรับพฤติกรรมการเธรดที่สอดคล้องกัน (แม้ว่าจะอยู่ในระดับต่ำ) นอกจากนี้ยังมีคอมไพเลอร์Just In Time ที่ทรงพลัง(ไม่มีประโยชน์สำหรับภาษาแบบไดนามิกเนื่องจาก MethodHandles และ invokedynamic)

สุดท้าย แต่ไม่ท้ายสุดคือระบบย่อย Garbage Collectionของ JVM ซึ่ง (มีการปรับจูนอย่างถูกต้อง) จะจัดการหน่วยความจำให้คุณโดยไม่คำนึงถึงภาษาที่อยู่ด้านบน


JMM เป็นหนึ่งในสิ่งที่ฉันชอบที่สุดเกี่ยวกับ Java ฉันเป็นแฟนตัวยงของข้อมูลที่ไม่เปลี่ยนรูปแบบได้อย่างมีประสิทธิภาพ (เช่นอาร์เรย์ที่เนื้อหาจะไม่เปลี่ยนแปลงหลังจากที่พวกเขาสามารถมองเห็นเธรดอื่นได้) แต่ให้ข้อความเหมือนกับsomeField = new int[]{42};วิธีเดียวในการรับรองว่าเธรดใด ๆ ที่เห็นอาร์เรย์ใหม่จะเห็นค่า 42 มีทั้งทำให้สนามหรือfinal volatileหากเขตข้อมูลถูกสร้างขึ้นอย่างเกียจคร้าน แต่เข้าถึงได้บ่อยครั้งทำให้finalไม่สามารถใช้งานได้และทำให้volatileอาจมีการปรับค่าปรับให้ตรงกันโดยไม่จำเป็นทุกครั้งที่มีการเข้าถึง แม้ใน loosest รุ่น .NET ...
SuperCat

... รหัสอาจขอให้ประชากรของอาร์เรย์เกิดขึ้นก่อนที่จะจัดเก็บการอ้างอิง เธรดอื่น ๆ ที่อ่านฟิลด์อาจหรือไม่เห็นการอ้างอิงไปยังอาร์เรย์ใหม่ แต่จะไม่มีค่าใช้จ่ายสำหรับตัวเองที่จะมั่นใจได้ว่าหากพวกเขาเห็นอาร์เรย์ใหม่พวกเขาจะเห็นเนื้อหาของมัน
supercat

1

องค์ประกอบสำคัญในการนี้คือการแยกของการรวบรวมจากขั้นตอนการดำเนินการ ด้วยวิธีนี้คุณสามารถเขียนคอมไพเลอร์อื่น ๆ เพื่อรวบรวมภาษาอื่น ๆ ไปยัง bytecode

Bytecode นั้นทำหน้าที่คล้ายกับรหัสเครื่องของ CPU - คุณมีการดำเนินการเล็ก ๆ น้อย ๆ ที่จำเป็นสำหรับการรันโปรแกรม - คุณสามารถรับตัวแปรทำคณิตศาสตร์กับมันมีการทำงานแบบมีเงื่อนไข ฯลฯ

Java ยังไม่พิเศษ ใน Java การมีอยู่ของหลายภาษานั้นไม่ได้เป็นเป้าหมายในการออกแบบเหมือน VM อื่น ๆ สำหรับ.Net CIL ของ Microsoftความสามารถในการรันหลายภาษา (C #, VB.Net, ... ) เป็นองค์ประกอบการออกแบบที่สำคัญเช่นกันParrotVMจากโครงการ Perl6 มุ่งเป้าไปที่ VM ทั่วไป

เพื่อความสนุกฉันได้สร้างหลักฐานว่าแม้แต่ Zend Engine ของ PHP ก็สามารถทำได้

และที่จริงแล้วนี่ไม่ใช่สิ่งใหม่ - แม้แต่บนฮาร์ดแวร์จริงที่คุณสามารถรันหลายภาษาได้เช่น C หรือ Fortran

ความแตกต่างระหว่างการแยกและการประมวลผลนี้คือล่าม clssic เช่นพื้นฐานบางรูปแบบ, เชลล์สคริปต์, ฯลฯ พวกเขามักจะทำงานในวิธีที่พวกเขาเรียกใช้รหัสในบรรทัดทีละมากขึ้นหรือน้อยลงโดยไม่ต้องนำมันในรูปแบบทันที ในระหว่าง.


1

JVM เป็นเครื่องเสมือนเครื่องแรกที่ฉันทราบว่ามีการรวบรวมขยะประสิทธิภาพและโมเดล Sandbox ที่สามารถทำงานได้ การเกิดขึ้นของหลายภาษาเพื่อสนับสนุน JVM นั้นอาจไม่ได้เกิดจาก "ความสามารถรอบตัว" แต่ความจริงที่ว่าภาษาจาวาขาดคุณสมบัติที่สำคัญบางอย่างที่ผู้คนต้องการในภาษาการเขียนโปรแกรม ตัวอย่างเช่นในขณะที่ภาษาเครื่องส่วนใหญ่มีชนิดข้อมูลเพียงครึ่งโหลหรือมากกว่านั้น (เช่นไบต์, ครึ่งคำ, คำ, คำสองคำ, ความแม่นยำหนึ่งเดียวและความแม่นยำสองเท่า), ภาษาโปรแกรมส่วนใหญ่อนุญาตให้ใช้รหัสได้ จำนวนชนิดข้อมูลที่ผู้ใช้กำหนดเองโดยพลการ JVM รู้จักชนิดดั้งเดิมสองสามอย่างที่คล้ายกับชนิดที่อยู่บนเครื่องทั่วไปรวมถึงประเภทอื่น ๆ อีกหนึ่งชนิด: การอ้างอิงวัตถุที่มีหลายประเภท ภาษาจาวาก็จดจำสิ่งเหล่านั้นด้วย และการอ้างอิงวัตถุที่หลากหลาย ในขณะที่ตัวแปรอาจถูก จำกัด ไม่ให้มีการอ้างอิงถึงสิ่งใด ๆ ที่ไม่ใช่คลาสเฉพาะภาษาจะไม่แยกความแตกต่างระหว่างฟิลด์ประเภทต่อไปนี้List<String>ที่อาจจัดขึ้นโดยMyThingคลาสอินสแตนซ์MyClass:

  • การอ้างอิงถึงโค้ดบางอย่างรู้ว่าเป็นการใช้งานที่ไม่เปลี่ยนรูป List<String>

  • การอ้างอิงไปยังอินสแตนซ์ของประเภทรายการที่ไม่แน่นอนซึ่งจะไม่ถูกเปิดเผยต่อสิ่งใด ๆ ที่อาจทำให้เกิดการเปลี่ยนแปลง

  • การอ้างอิงถึงรายการที่ไม่แน่นอนซึ่งยกเว้นในระหว่างการดำเนินการของMyThingsวิธีการไม่มีการอ้างอิงอื่นใดที่อาจมีอยู่ทุกที่ในจักรวาล

  • การอ้างอิงถึงรายการที่ไม่แน่นอนซึ่งวัตถุอื่นเป็นเจ้าของซึ่งวัตถุอื่นต้องการMyThingใช้ในบางลักษณะ

  • การอ้างอิงไปยังรายการที่ไม่แน่นอนซึ่งMyThingเป็นเจ้าของ แต่ที่มันยังได้สัมผัสกับวัตถุอื่น ๆ เพื่อให้พวกเขาอาจทำอะไรกับมัน

แม้ว่าเขตข้อมูลเหล่านั้นทั้งหมดจะสามารถพิมพ์ได้List<String>แต่ก็มีความแตกต่างกันมาก ภาษาที่แสดงออกอาจอนุญาตให้แยกความแตกต่างระหว่างความหมายเหล่านั้น แต่ Java ไม่ได้ เนื่องจากภาษาสามารถแนบความหมายกับสิ่งต่าง ๆ (อย่างน้อยนอกบริบททั่วไป) และเรียกใช้บน JVM ซึ่งทำให้มีพื้นที่ว่างมากสำหรับภาษาที่กำหนดเป้าหมาย JVM เพื่อแสดงแนวคิดที่ Java ไม่สามารถทำได้

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