ในอดีตฉันใช้ภาษา C ++ เป็นภาษาโปรแกรม ฉันรู้ว่ารหัสที่เขียนใน C ++ ต้องผ่านกระบวนการรวบรวมจนกว่ามันจะกลายเป็นรหัสวัตถุ "รหัสเครื่อง"
ฉันอยากรู้ว่า Java ทำงานอย่างไรในแง่นั้น ผู้ใช้เขียนโค้ด Java เรียกใช้โดยคอมพิวเตอร์อย่างไร
ในอดีตฉันใช้ภาษา C ++ เป็นภาษาโปรแกรม ฉันรู้ว่ารหัสที่เขียนใน C ++ ต้องผ่านกระบวนการรวบรวมจนกว่ามันจะกลายเป็นรหัสวัตถุ "รหัสเครื่อง"
ฉันอยากรู้ว่า Java ทำงานอย่างไรในแง่นั้น ผู้ใช้เขียนโค้ด Java เรียกใช้โดยคอมพิวเตอร์อย่างไร
คำตอบ:
Java implementations มักจะใช้กระบวนการรวบรวมสองขั้นตอน ซอร์สโค้ด Java ถูกคอมไพล์ลงไปเป็นbytecodeโดยคอมไพเลอร์ Java bytecode ดำเนินการโดย Java Virtual Machine (JVM) JVM สมัยใหม่ใช้เทคนิคที่เรียกว่าการรวบรวม Just-in-Time (JIT)เพื่อรวบรวม bytecode ไปยังคำสั่งพื้นฐานที่เข้าใจโดยซีพียูฮาร์ดแวร์ในทันทีที่รันไทม์
การใช้งานบางอย่างของ JVM อาจเลือกตีความรหัสไบต์แทนการรวบรวม JIT ให้เป็นรหัสเครื่องและเรียกใช้โดยตรง ในขณะนี้ยังถือว่าเป็น "ล่าม" มันค่อนข้างแตกต่างจากล่ามที่อ่านและรันซอร์สโค้ดระดับสูง (เช่นในกรณีนี้ซอร์สโค้ด Java ไม่ถูกตีความโดยตรง bytecode เอาต์พุตของคอมไพเลอร์ Java คือ)
มีความเป็นไปได้ทางเทคนิคในการรวบรวม Java ลงในรหัสเนทีฟล่วงหน้าและรันไบนารีผลลัพธ์ นอกจากนี้ยังเป็นไปได้ที่จะตีความรหัส Java โดยตรง
เพื่อสรุปโดยขึ้นอยู่กับสภาพแวดล้อมการดำเนินการ bytecode สามารถ:
รหัสที่เขียนใน Java คือ:
java ตีความตีความ bytecode เมื่อใดและจะรวบรวมเมื่อใด รหัสแอปพลิเคชันจะถูกตีความในขั้นต้น แต่ JVM จะตรวจสอบว่าลำดับของ bytecode ใดที่ถูกเรียกใช้งานบ่อยครั้งและแปลเป็นรหัสเครื่องสำหรับการดำเนินการโดยตรงบนฮาร์ดแวร์ สำหรับ bytecode ซึ่งดำเนินการเพียงไม่กี่ครั้งสิ่งนี้จะช่วยประหยัดเวลาในการรวบรวมและลดเวลาแฝงเริ่มต้น สำหรับ bytecode ที่ถูกเรียกใช้งานบ่อยครั้งการคอมไพล์ JIT ถูกใช้เพื่อรันด้วยความเร็วสูงหลังจากเฟสแรกของการตีความช้า นอกจากนี้เนื่องจากโปรแกรมใช้เวลาส่วนใหญ่ในการประมวลผลส่วนน้อยของรหัสเวลาในการรวบรวมที่ลดลงจึงมีความสำคัญ ในที่สุดในระหว่างการตีความรหัสเริ่มต้นสถิติการดำเนินการสามารถรวบรวมได้ก่อนการรวบรวมซึ่งช่วยในการเพิ่มประสิทธิภาพที่ดีขึ้น
คำว่า "ตีความภาษา" หรือ "ภาษารวบรวม" ไม่สมเหตุสมผลเพราะภาษาการเขียนโปรแกรมใด ๆ ที่สามารถตีความและ / หรือรวบรวม
สำหรับการใช้งานที่มีอยู่ของ Java ส่วนใหญ่เกี่ยวข้องกับขั้นตอนการรวบรวมเพื่อbytecodeดังนั้นพวกเขาจึงเกี่ยวข้องกับการรวบรวม รันไทม์ยังสามารถโหลด bytecode แบบไดนามิกดังนั้นจึงจำเป็นต้องใช้รูปแบบบางอย่างของล่าม bytecode ล่ามนั้นอาจจะใช่หรือไม่ก็ได้ในการใช้การคอมไพล์โค้ดเนทีฟภายใน
วันนี้การรวบรวมแบบทันเวลาบางส่วนใช้สำหรับหลายภาษาซึ่งครั้งหนึ่งเคยถูกพิจารณาว่า "ตีความ" เช่น JavaScript
Java ถูกคอมไพล์ไปยัง bytecode ซึ่งจะไปสู่ Java VM ซึ่งแปลความหมายนั้น
Java เป็นภาษาการเขียนโปรแกรมที่คอมไพล์ แต่แทนที่จะคอมไพล์ตรงไปยังโค้ดเครื่องที่เรียกทำงานได้มันจะคอมไพล์เป็นรูปแบบไบนารีกลางที่เรียกว่ารหัสไบต์ JVM จากนั้นโค้ดไบต์จะถูกคอมไพล์และ / หรือตีความเพื่อรันโปรแกรม
ชนิดของทั้งสอง เริ่มแรกรวบรวม Java (บางคนชอบที่จะพูดว่า "แปล") เพื่อ bytecode ซึ่งจากนั้นรวบรวมหรือตีความขึ้นอยู่กับอารมณ์ของ JIT
Java ทำการรวบรวมและตีความ
ใน Java โปรแกรมไม่ได้เรียบเรียงไฟล์ปฏิบัติการ ; พวกเขาจะรวบรวมเป็น bytecode (ตามที่กล่าวไว้ก่อนหน้า) ซึ่ง JVM (Java Virtual Machine) จากนั้นตีความ / รันที่รันไทม์ ซอร์สโค้ด Java ถูกคอมไพล์เป็น bytecode เมื่อเราใช้คอมไพเลอร์ javac bytecode ได้รับการบันทึกไว้ในดิสก์ด้วยนามสกุลไฟล์. class.class
เมื่อโปรแกรมจะถูกเรียกใช้bytecode จะถูกแปลง bytecode อาจถูกแปลงโดยใช้คอมไพเลอร์ just-in-time (JIT) ผลลัพธ์คือรหัสเครื่องซึ่งถูกป้อนเข้าสู่หน่วยความจำและดำเนินการ
Javacเป็นJava Compilerซึ่งรวบรวมโค้ด Java ลงใน Bytecode JVM เป็น Java Virtual Machine ที่รัน / ตีความ / แปล Bytecode เป็น Native Machine Code ใน Java แม้ว่ามันจะถือเป็นภาษาตีความมันอาจใช้การรวบรวม JIT (Just-in-Time) เมื่อ bytecode อยู่ใน JVM คอมไพเลอร์ JIT อ่าน bytecode ในหลายส่วน (หรือเต็มไม่ค่อย) และรวบรวมไว้ในโค้ดของเครื่องจักรแบบไดนามิกเพื่อให้โปรแกรมสามารถทำงานได้เร็วขึ้นจากนั้นแคชและนำมาใช้ใหม่ในภายหลังโดยไม่จำเป็นต้องทำการคอมไพล์ใหม่ ดังนั้นการคอมไพล์ JIT จะรวมความเร็วของโค้ดที่คอมไพล์ด้วยความยืดหยุ่นในการตีความ
แปลภาษาเป็นประเภทของการเขียนโปรแกรมภาษาที่มากที่สุดของการใช้งานของมันทำงานตามคำสั่งโดยตรงได้อย่างอิสระโดยไม่ต้องก่อนหน้านี้รวบรวมโปรแกรมลงในคำแนะนำการใช้เครื่องภาษา ล่ามดำเนินการโปรแกรมโดยตรงแปลแต่ละคำสั่งเป็นลำดับของรูทีนย่อยหนึ่งรายการขึ้นไปที่คอมไพล์แล้วลงในรหัสเครื่อง
ภาษาเรียบเรียงเป็นภาษาโปรแกรมที่มีการใช้งานโดยทั่วไปจะมีคอมไพเลอร์ (แปลว่าสร้างรหัสเครื่องจาก source code) และไม่ล่าม (รัฟขั้นตอนโดยขั้นตอนของรหัสที่มาที่ไม่มีการแปลก่อนรันไทม์จะเกิดขึ้น)
ในการใช้ภาษาโปรแกรมที่ทันสมัยเช่นใน Java มันเป็นที่นิยมมากขึ้นสำหรับแพลตฟอร์มเพื่อให้ทั้งสองตัวเลือก
Java เป็นภาษาที่คอมไพล์ด้วยการกำหนดเป้าหมายเป็นแพลตฟอร์มที่เรียกว่าJava Virtual Machineซึ่งเป็นแบบสแต็กและมีการใช้งานที่รวดเร็วมากในหลาย ๆ แพลตฟอร์ม
ใบเสนอราคาจาก: https://blogs.oracle.com/ask-arun/entry/run_your_java_applications_faster
ผู้พัฒนาแอพพลิเคชั่นสามารถพัฒนารหัสแอพพลิเคชั่นบนระบบปฏิบัติการที่หลากหลายที่มีอยู่ในตลาดปัจจุบัน ภาษา Java นั้นไม่เชื่อเรื่องพระเจ้าในระยะนี้กับระบบปฏิบัติการ ซอร์สโค้ดที่ยอดเยี่ยมที่เขียนโดยนักพัฒนา Java Application ตอนนี้ได้รับการคอมไพล์ไปยังโค้ด Java Byte ซึ่งในศัพท์ภาษาจาวาเรียกว่าการคอมไพล์ฝั่งไคลเอ็นต์ การรวบรวมโค้ด Java Byte นี้เป็นสิ่งที่ช่วยให้นักพัฒนา Java สามารถ 'เขียนครั้งเดียว' รหัส Java Byte สามารถเรียกใช้บนระบบปฏิบัติการและเซิร์ฟเวอร์ที่รองรับใด ๆ จึงทำให้ซอร์สโค้ดไม่เชื่อเรื่อง OS / Server โพสต์การสร้างโค้ด Java Byte การโต้ตอบระหว่างแอ็พพลิเคชัน Java และ OS / Server พื้นฐานนั้นใกล้ชิดยิ่งขึ้น การเดินทางยังดำเนินต่อไป - เฟรมเวิร์กแอปพลิเคชันระดับองค์กรดำเนินการโค้ด Java Byte เหล่านี้ในสภาพแวดล้อมรันไทม์ซึ่งรู้จักกันในนาม Java Virtual Machine (JVM) หรือ Java Runtime Environment (JRE) JVM มีความสัมพันธ์ใกล้ชิดกับระบบปฏิบัติการและฮาร์ดแวร์พื้นฐานเพราะใช้ประโยชน์จากทรัพยากรที่มีให้โดยระบบปฏิบัติการและเซิร์ฟเวอร์ โค้ด Java Byte ได้รับการคอมไพล์ในขณะที่รหัสภาษาที่ใช้งานได้ของเครื่องซึ่งเป็นแพลตฟอร์มเฉพาะ สิ่งนี้เรียกว่าการรวบรวมฝั่งเซิร์ฟเวอร์
ดังนั้นฉันจะบอกว่า Java เป็นภาษาที่รวบรวมแน่นอน