Java มี JVM, C คืออะไร?


15

ฉันรู้ว่า C มีคอมไพเลอร์ แต่สิ่งที่กำหนดประสิทธิภาพการดำเนินการ?

ตัวอย่างเช่นในบล็อก if else จะเกิดอะไรขึ้นหากโค้ดเพิ่งมี ifs ทั้งหมดแทน ifes elses จะเป็นตัวกำหนดว่า ifs ทั้งหมดจะถูกรันอย่างไร ใน Java มันจะเป็น JVM แต่ใน C สิ่งที่คอมไพเลอร์ประมวลผลคืออะไร?


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

10
+1 นี่เป็นคำถามที่ดีมาก ฉันจะไม่ลงคะแนนเพราะความเขลา - มันน่าแปลกใจที่นักเรียน Java ไม่ถามเรื่องนี้
djechlin

นอกจากนี้คุณยังสามารถรวบรวม Java เป็นรหัสเครื่องและหลีกเลี่ยง JVM ...
AK_

2
นอกจากนี้: ภาษาโปรแกรม! = Framework! = ไลบรารีไลบรารี่! = คอมไพเลอร์! = เพียงแค่ในเวลาคอมไพเลอร์! = Interperter
AK_

คำตอบ:


17

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

ดังนั้นโปรแกรม Java จะถูกแปลงเป็นคำสั่งจริงโดย JVM เมื่อคุณโหลดในขณะที่โปรแกรม C จะถูกแปลงเป็นคอมไพเลอร์คำแนะนำจริงก่อนที่จะรัน


20
มีคอมไพเลอร์ที่ใช้จาวาและสร้างรหัสเครื่อง ยกตัวอย่างเช่นExcelsior เจ็ต นอกจากนี้ยังมี interpeters สำหรับ C ( picoc ) ที่ไม่เคยสร้างรหัสที่เครื่องจริงดำเนินการ ภาษาเป็นภาษา การใช้งานคือการใช้งาน การทำให้ทั้งสองอย่างสับสนอาจทำให้ผู้คนสับสน

6

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

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

แม้ว่าโปรแกรมของคุณจะถูกรวบรวมแบบคงที่นานก่อนที่จะดำเนินการเว้นแต่ว่าคุณกำลังเขียนเฟิร์มแวร์มันเป็นเรื่องยากที่โค้ดที่รวบรวมจะทำงานโดยตรงบนโลหะเปลือยโดยไม่มีอะไรรองรับ ระบบปฏิบัติการจัดเตรียมเครื่องเสมือนสำหรับโปรแกรมพื้นที่ผู้ใช้ซึ่งมักจะให้คุณสมบัติเช่นภาพลวงตาที่คุณมีซีพียูทั้งหมดให้กับตัวเอง ภาพลวงตาของพื้นที่หน่วยความจำแบบเรียบซึ่งอาจมีขนาดใหญ่กว่าแรมจริงที่ติดกับเครื่องเรียกว่า "หน่วยความจำเสมือน"

ยิ่งไปกว่านั้นแม้ว่าคุณจะเขียนโปรแกรมใน C ก็มีเครื่องเสมือน C! มันเป็นประเพณีที่เรียกว่า "C runtime" หรือ CRT สั้น ๆ

เนื่องจาก C ถูกแปลส่วนใหญ่เป็นรหัสแอสเซมบลี / เครื่องโดยตรงล่วงหน้า (ในบางแพลตฟอร์มอาจมีโค้ดเธรดบางส่วนและถือได้ว่าเป็นส่วนหนึ่งของเครื่องเสมือน) เครื่องเสมือนจึงมักจะจัดการเริ่มต้นและ ปิดตัวลง.

โดยทั่วไปแล้วการเริ่มต้นจะเกี่ยวข้องกับการตั้งค่าสแต็กและฮีป ระบบปฏิบัติการจะให้สิ่งเหล่านี้แก่คุณน้อยมากและเป็นหน้าที่ของภาษาการเขียนโปรแกรมเพื่อให้สิ่งเหล่านี้แก่โปรแกรมเมอร์ ในบางแพลตฟอร์มอาจมีการเริ่มต้นบางอย่างของการจัดการสัญญาณตั้งค่าเธรด "main" ในสภาพแวดล้อมแบบมัลติเธรดการเรียกใช้ตัวสร้างทั่วโลกในโอกาสที่โปรแกรมถูกเชื่อมโยงกับรหัส C ++, การจัดการไลบรารี่ที่เชื่อมโยงแบบไดนามิกหรือ อาจต้องดำเนินการบางอย่างเพื่อตั้งค่า argc / argv และ envp ในที่สุด CRT ถ่ายโอนการควบคุมไปยังหลัก

สำหรับการปิดระบบหลายระบบสามารถฆ่ากระบวนการที่ไม่สะอาดได้ดังนั้นการปิดระบบไม่จำเป็นต้องทำมากนัก สิ่งสำคัญคือการประมวลผล atexit () เรียกกรณีที่โปรแกรมออกอย่างหมดจด


2
รันไทม์ C และ JVM เป็นสัตว์ที่แตกต่างอย่างสิ้นเชิง CRT เป็นเพียงห้องสมุด
DeadMG

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

@ นามแฝง: ไม่ได้จริงๆ เอาล่ะ VirtualBox เป็นเวอร์ชวลไลเซอร์ในขณะที่ JVM ทั่วไปเป็นอีมูเลเตอร์ แต่ถ้าคุณแทนที่เช่น VirtualBox ด้วย QEmu ในประโยคของคุณทั้งสองก็เหมือนกัน
Jörg W Mittag
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.