คอมไพเลอร์ JIT ทำอะไรเป็นพิเศษเมื่อเทียบกับคอมไพเลอร์ที่ไม่ใช่ของ JIT ใครสามารถให้คำอธิบายสั้น ๆ และเข้าใจง่าย
คอมไพเลอร์ JIT ทำอะไรเป็นพิเศษเมื่อเทียบกับคอมไพเลอร์ที่ไม่ใช่ของ JIT ใครสามารถให้คำอธิบายสั้น ๆ และเข้าใจง่าย
คำตอบ:
คอมไพเลอร์ JIT ทำงานหลังจากที่โปรแกรมเริ่มต้นและรวบรวมรหัส (โดยปกติคือ bytecode หรือคำสั่ง VM บางชนิด) ได้ทันที ชุดคำสั่ง JIT มีการเข้าถึงข้อมูลรันไทม์แบบไดนามิกในขณะที่คอมไพเลอร์มาตรฐานไม่สามารถและเพิ่มประสิทธิภาพที่ดีขึ้นเช่นฟังก์ชั่นอินไลน์ที่ใช้บ่อย
นี่ตรงกันข้ามกับคอมไพเลอร์ดั้งเดิมที่รวบรวมรหัสทั้งหมดเป็นภาษาเครื่องก่อนที่โปรแกรมจะทำงานครั้งแรก
ในการถอดความคอมไพเลอร์ทั่วไปจะสร้างโปรแกรมทั้งหมดเป็นไฟล์ EXE ก่อนที่คุณจะรันครั้งแรก สำหรับโปรแกรมสไตล์ที่ใหม่กว่าแอสเซมบลีจะถูกสร้างขึ้นด้วย pseudocode (รหัส p) เฉพาะหลังจากที่คุณรันโปรแกรมบนระบบปฏิบัติการ (เช่นโดยการดับเบิลคลิกที่ไอคอน) คอมไพเลอร์ (JIT) จะเตะและสร้างรหัสเครื่อง (m-code) ที่โปรเซสเซอร์ที่ใช้ Intel หรืออะไรก็ตามที่จะเข้าใจ
ในการเริ่มต้นคอมไพเลอร์มีหน้าที่เปลี่ยนภาษาระดับสูง (กำหนดเป็นระดับที่สูงกว่าแอสเซมเบลอร์) เป็นรหัสวัตถุ (คำสั่งเครื่อง) ซึ่งจะถูกเชื่อมโยง
จนถึงจุดหนึ่งในการวิวัฒนาการของภาษาคอมไพเลอร์จะรวบรวมภาษาระดับสูงเป็นรหัสหลอกซึ่งจะถูกตีความ (โดยล่าม) เพื่อเรียกใช้โปรแกรมของคุณ สิ่งนี้จะกำจัดรหัสวัตถุและไฟล์ปฏิบัติการและทำให้ภาษาเหล่านี้สามารถพกพาไปยังระบบปฏิบัติการหลายระบบและแพลตฟอร์มฮาร์ดแวร์ได้ Pascal (ซึ่งรวบรวมไปยัง P-Code) เป็นหนึ่งในคนแรก Java และ C # เป็นตัวอย่างล่าสุด ในที่สุดคำ P-Code ก็ถูกแทนที่ด้วย bytecode เนื่องจากการดำเนินการหลอกส่วนใหญ่นั้นยาวไบต์
คอมไพเลอร์ Just-In-Time (JIT) เป็นคุณลักษณะของล่ามรันไทม์ซึ่งแทนที่จะตีความ bytecode ทุกครั้งที่มีการเรียกใช้เมธอดจะรวบรวม bytecode ลงในคำแนะนำรหัสเครื่องของเครื่องที่ทำงานแล้วเรียกสิ่งนี้ รหัสวัตถุแทน ในทางกลับกันประสิทธิภาพของการรันออบเจ็กต์โค้ดจะเอาชนะความไม่มีประสิทธิภาพในการคอมไพล์โปรแกรมใหม่ทุกครั้งที่รัน
JIT- ทันเวลาคำพูดของตัวเองบอกว่าเมื่อมันจำเป็น (ตามความต้องการ)
รหัสที่มาจะถูกแปลงเป็นรหัสเครื่องอย่างสมบูรณ์
ซอร์สโค้ดจะถูกแปลงเป็นภาษาแอสเซมบลีเช่นโครงสร้าง [สำหรับ ex IL (ภาษากลาง) สำหรับ C #, ByteCode สำหรับ java]
รหัสกลางจะถูกแปลงเป็นภาษาเครื่องเฉพาะเมื่อแอปพลิเคชันต้องการรหัสที่จำเป็นเท่านั้นที่จะถูกแปลงเป็นรหัสเครื่องเท่านั้น
ใน JIT ไม่ใช่รหัสทั้งหมดจะถูกแปลงเป็นรหัสเครื่องก่อนส่วนหนึ่งของรหัสที่จำเป็นจะถูกแปลงเป็นรหัสเครื่องแล้วหากวิธีการหรือฟังก์ชันการทำงานที่เรียกว่าไม่ได้อยู่ในเครื่องแล้วจะกลายเป็นรหัสเครื่อง ... จะลดลง ภาระในซีพียู
เนื่องจากรหัสเครื่องจะถูกสร้างขึ้นในเวลาทำงาน .... คอมไพเลอร์ JIT จะผลิตรหัสเครื่องที่ปรับให้เหมาะสมสำหรับสถาปัตยกรรม CPU ของเครื่อง
ดังที่คนอื่น ๆ ได้กล่าวถึง
JIT ย่อมาจาก Just-in-Time ซึ่งหมายความว่าโค้ดจะถูกรวบรวมเมื่อจำเป็นไม่ใช่ก่อนรันไทม์
เพียงเพื่อเพิ่มประเด็นการอภิปรายข้างต้น JVM ยังคงนับว่าเป็นเวลาเท่าไหร่ฟังก์ชั่นจะถูกดำเนินการ หากจำนวนนี้เกินขีด จำกัด ที่กำหนดไว้ล่วงหน้า JIT จะรวบรวมรหัสเป็นภาษาเครื่องซึ่งสามารถประมวลผลได้โดยตรงโดยโปรเซสเซอร์ (ซึ่งแตกต่างจากกรณีปกติที่ javac รวบรวมรหัสเป็น bytecode แล้วจาวา - ล่ามตีความบรรทัด bytecode นี้โดยสายแปลงเป็น รหัสเครื่องและดำเนินการ)
ครั้งต่อไปที่ฟังก์ชั่นนี้ถูกคำนวณรหัสที่คอมไพล์เดียวกันจะถูกดำเนินการอีกครั้งซึ่งแตกต่างจากการตีความปกติซึ่งโค้ดจะถูกตีความอีกครั้งทีละบรรทัด ทำให้การดำเนินการเร็วขึ้น
คอมไพเลอร์ JIT จะคอมไพล์โค้ดไบต์กับโค้ดเนทีฟที่เทียบเท่าในการเรียกใช้ครั้งแรก ตามการดำเนินการต่อเนื่องทุกครั้ง JVM จะใช้โค้ดเนทีฟที่คอมไพล์แล้วเพื่อเพิ่มประสิทธิภาพ
หากไม่มีคอมไพเลอร์ JIT ตัวแปล JVM จะแปลโค้ดไบต์ต่อบรรทัดเพื่อให้ปรากฏราวกับว่ามีการเรียกใช้แอปพลิเคชันดั้งเดิม
JIT ย่อมาจาก Just-in-Time ซึ่งหมายความว่าโค้ดจะถูกรวบรวมเมื่อจำเป็นไม่ใช่ก่อนรันไทม์
สิ่งนี้มีประโยชน์เนื่องจากคอมไพเลอร์สามารถสร้างรหัสที่ปรับให้เหมาะสมสำหรับเครื่องของคุณโดยเฉพาะ คอมไพเลอร์แบบคงที่เช่นคอมไพเลอร์ C เฉลี่ยของคุณจะรวบรวมรหัสทั้งหมดไปยังรหัสที่สามารถใช้งานได้บนเครื่องของนักพัฒนาซอฟต์แวร์ ดังนั้นคอมไพเลอร์จะทำการปรับให้เหมาะสมตามสมมติฐานบางอย่าง มันสามารถรวบรวมได้ช้ากว่าและเพิ่มประสิทธิภาพมากขึ้นเพราะมันไม่ได้ทำให้การทำงานของโปรแกรมช้าลงสำหรับผู้ใช้
หลังจากโค้ดไบต์ (ซึ่งเป็นสถาปัตยกรรมที่เป็นกลาง) ถูกสร้างขึ้นโดยคอมไพเลอร์ Java การดำเนินการจะถูกจัดการโดย JVM (ใน Java) โค้ดไบต์จะถูกโหลดเข้าสู่ JVM โดยโหลดเดอร์จากนั้นคำสั่งแต่ละไบต์จะถูกตีความ
เมื่อเราต้องการเรียกวิธีการหลาย ๆ ครั้งเราจำเป็นต้องตีความรหัสเดียวกันหลาย ๆ ครั้งและอาจต้องใช้เวลามากกว่าที่จำเป็น ดังนั้นเราจึงมีคอมไพเลอร์ JIT (ทันเวลา) เมื่อโหลดไบต์ไปยัง JVM (เวลารัน) โค้ดทั้งหมดจะถูกคอมไพล์แทนที่จะแปลความหมายจึงช่วยประหยัดเวลา
คอมไพเลอร์ JIT ใช้งานได้เฉพาะในช่วงรันไทม์ดังนั้นเราจึงไม่มีเอาต์พุตไบนารีใด ๆ
Just In Time Compiler (JIT):
มันรวบรวม java bytecode เป็นคำสั่งเครื่องของ CPU เฉพาะนั้น
ตัวอย่างเช่นถ้าเรามีคำสั่งวนรอบในรหัส java ของเรา:
while(i<10){
// ...
a=a+i;
// ...
}
โค้ดลูปข้างต้นทำงาน 10 ครั้งหากค่าของ i เป็น 0
ไม่จำเป็นต้องคอมไพล์โค้ดไบต์เป็นเวลา 10 ครั้งซ้ำแล้วซ้ำอีกเพราะคำสั่งเดิมจะดำเนินการ 10 ครั้ง ในกรณีนั้นจำเป็นต้องรวบรวมรหัสนั้นเพียงครั้งเดียวและสามารถเปลี่ยนค่าตามจำนวนครั้งที่ต้องการ ดังนั้น Just In Time (JIT) คอมไพเลอร์ติดตามคำสั่งและวิธีการดังกล่าว (ดังที่ได้กล่าวไว้ก่อนหน้านี้) และรวบรวมรหัสไบต์ดังกล่าวเป็นรหัสเครื่องเพื่อประสิทธิภาพที่ดีขึ้น
อีกตัวอย่างที่คล้ายกันคือการค้นหารูปแบบโดยใช้ "นิพจน์ปกติ" ในรายการของสตริง / ประโยค
JIT Compiler ไม่ได้รวบรวมรหัสทั้งหมดไปยังรหัสเครื่อง มันรวบรวมรหัสที่มีรูปแบบที่คล้ายกันในเวลาทำงาน
ดูเอกสารของออราเคิลในหัวข้อทำความเข้าใจ JITเพื่ออ่านเพิ่มเติม
คุณมีรหัสที่บ่นเกี่ยวกับ IL (ภาษาระดับกลาง) เมื่อคุณเรียกใช้โปรแกรมคอมพิวเตอร์ไม่เข้าใจรหัสนี้ มันเข้าใจรหัสเนทีฟเท่านั้น ดังนั้นคอมไพเลอร์ JIT จะคอมไพล์ IL ของคุณเป็นโค้ดเนทีฟ มันเป็นเช่นนี้ในระดับวิธีการ
ฉันรู้ว่านี่เป็นเธรดเก่า แต่การเพิ่มประสิทธิภาพรันไทม์เป็นอีกส่วนสำคัญของการรวบรวม JIT ที่ดูเหมือนจะไม่ได้กล่าวถึงที่นี่ โดยพื้นฐานแล้วคอมไพเลอร์ JIT สามารถมอนิเตอร์โปรแกรมในขณะที่มันรันเพื่อกำหนดวิธีในการปรับปรุงการดำเนินการ จากนั้นสามารถเปลี่ยนแปลงได้ทันที - ระหว่างรันไทม์ การเพิ่มประสิทธิภาพ Google JIT (javaworld มีบทความที่ดีเกี่ยวกับเรื่องนี้ )
Just in time compiler (JIT) เป็นซอฟต์แวร์ที่รับอินพุตที่ไม่สามารถเรียกทำงานได้และส่งคืนรหัสเครื่องที่เหมาะสมที่จะดำเนินการ ตัวอย่างเช่น:
Intermediate representation JIT Native machine code for the current CPU architecture
Java bytecode ---> machine code
Javascript (run with V8) ---> machine code
ผลลัพธ์ของสิ่งนี้คือสำหรับสถาปัตยกรรม CPU บางตัวต้องติดตั้งคอมไพลเลอร์ JIT ที่เหมาะสม
แม้ว่าจะมีข้อยกเว้นโดยทั่วไปเมื่อเราต้องการแปลงรหัสต้นฉบับเป็นรหัสเครื่องที่เราสามารถใช้:
Jit ย่อมาจากทันเวลาคอมไพเลอร์ jit เป็นโปรแกรมที่เปลี่ยนโค้ดจาวาไบต์เป็นคำสั่งที่สามารถส่งโดยตรงไปยังหน่วยประมวลผล
การใช้จาวาคอมไพเลอร์ทันเวลา (จริงๆคอมไพเลอร์ตัวที่สอง) ที่แพลตฟอร์มระบบโดยเฉพาะประมวลผล bytecode เป็นรหัสระบบเฉพาะเมื่อรหัสถูกคอมไพล์อีกครั้งโดย jit complier มันมักจะทำงานได้เร็วขึ้นในคอมพิวเตอร์
คอมไพเลอร์ทันเวลามาพร้อมกับเครื่องเสมือนจริงและใช้เป็นทางเลือก มันจะรวบรวม bytecode ลงในรหัสปฏิบัติการเฉพาะแพลตฟอร์มที่จะดำเนินการทันที
เพียงในเวลา (JIT) สะสม (ยังเป็นแบบไดนามิกแปลหรือการรวบรวมเวลาทำงาน) เป็นวิธีการดำเนินรหัสคอมพิวเตอร์ที่เกี่ยวข้องกับการรวบรวมในระหว่างการดำเนินของโปรแกรม - ในเวลาทำงาน - มากกว่าก่อนที่จะมีการดำเนินการ
การรวบรวมไอทีเป็นการผสมผสานระหว่างสองวิธีการดั้งเดิมในการแปลเป็นรหัสเครื่อง - การรวบรวมล่วงหน้า (AOT)และการตีความ - และรวมข้อดีและข้อเสียของทั้งสองอย่างเข้าด้วยกัน รวบรวม JIT รวมความเร็วของการรวบรวมรหัสที่มีความยืดหยุ่นในการตีความ
ลองพิจารณา JIT ที่ใช้ใน JVM
ตัวอย่างเช่นคอมไพเลอร์ HotSpot JVM JIT สร้างการปรับให้เหมาะสมแบบไดนามิก กล่าวคือพวกเขาตัดสินใจปรับให้เหมาะสมในขณะที่แอปพลิเคชัน Java กำลังทำงานและสร้างคำสั่งเครื่องที่มีประสิทธิภาพสูงซึ่งกำหนดเป้าหมายสำหรับสถาปัตยกรรมระบบพื้นฐาน
เมื่อวิธีถูกเลือกสำหรับการรวบรวม JVM ฟีดไบต์ของมันไปยัง Just-In-Time คอมไพเลอร์ (JIT) JIT จำเป็นต้องเข้าใจความหมายและไวยากรณ์ของ bytecode ก่อนจึงจะสามารถรวบรวมวิธีการได้อย่างถูกต้อง เพื่อช่วยให้ผู้รวบรวม JIT วิเคราะห์วิธีนั้นไบต์แรก ๆ ของมันจะถูกจัดรูปแบบใหม่ในรูปแบบภายในที่เรียกว่าร่องรอยต้นไม้ซึ่งคล้ายกับรหัสเครื่องอย่างใกล้ชิดกว่า bytecode การวิเคราะห์และปรับให้เหมาะสมนั้นจะดำเนินการบนต้นไม้ของวิธีการ ในตอนท้ายต้นไม้จะถูกแปลเป็นรหัสพื้นเมือง
โครงสร้างการสืบค้นกลับเป็นโครงสร้างข้อมูลที่ใช้ในการรวบรวมรันไทม์ของรหัสการเขียนโปรแกรม แผนผังการสืบค้นกลับถูกใช้ในประเภท 'เพียงทันเวลาคอมไพเลอร์' ที่ติดตามโค้ดที่ดำเนินการระหว่างฮอตสปอตและคอมไพล์มัน อ้างถึงนี้
อ้างอิง:
คอมไพเลอร์ที่ไม่ใช่ JIT ใช้ซอร์สโค้ดและแปลงเป็นโค้ดไบต์ของเครื่องเฉพาะในเวลารวบรวม คอมไพเลอร์ JIT ใช้โค้ดไบต์ที่ไม่เชื่อเรื่องพระเจ้าของเครื่องจักรที่สร้างขึ้นในเวลาคอมไพล์และแปลงเป็นโค้ดไบต์เฉพาะของเครื่องในเวลาทำงาน คอมไพเลอร์ JIT ที่ Java ใช้คือสิ่งที่อนุญาตให้ไบนารีเดียวรันบนหลากหลายแพลตฟอร์มโดยไม่มีการดัดแปลง
20% ของรหัสไบต์ใช้ 80% ของเวลา คอมไพเลอร์ JIT ได้รับสถิติเหล่านี้และเพิ่มประสิทธิภาพ 20% ของรหัสไบต์เพื่อให้ทำงานได้เร็วขึ้นโดยการเพิ่มวิธีการแบบอินไลน์การลบล็อคที่ไม่ได้ใช้ ฯลฯ และยังสร้างรหัสไบต์เฉพาะสำหรับเครื่องนั้น ฉันอ้างจากบทความนี้ฉันพบว่ามันมีประโยชน์ http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT อ้างถึงเอ็นจินการเรียกใช้งานในการใช้งาน JVM เพียงเล็กน้อยซึ่งเร็วกว่า แต่ต้องการหน่วยความจำมากขึ้นเป็นคอมไพเลอร์ทันเวลา ในโครงร่างนี้ไบต์ของวิธีจะถูกคอมไพล์ไปยังรหัสเครื่องในครั้งแรกที่มีการเรียกใช้เมธอด จากนั้นรหัสเครื่องดั้งเดิมสำหรับวิธีการจะถูกแคชดังนั้นจึงสามารถนำมาใช้ใหม่ได้ในครั้งถัดไปที่เรียกใช้วิธีการเดียวกัน
JVM ดำเนินขั้นตอนการคอมไพล์ระหว่างรันไทม์ด้วยเหตุผลด้านประสิทธิภาพ ซึ่งหมายความว่า Java ไม่มีการแยกการประมวลผลแบบคอมไพล์ ก่อนอื่นจะทำการรวบรวมแบบคงที่ที่เรียกว่าจากซอร์สโค้ด Java ไปเป็น bytecode จากนั้นโค้ดไบต์นี้จะถูกส่งไปยัง JVM เพื่อดำเนินการ แต่การประมวลผล bytecode ช้าดังนั้น JVM จะวัดความถี่ที่เรียกใช้ bytecode และเมื่อตรวจพบรหัส "ฮอตสปอต" ของรหัสที่ทำงานบ่อยมาก ดังนั้นโปรแกรม Java ในปัจจุบันจึงถูกรันด้วยการประมวลผลของโค้ด
Just In Time compiler หรือ JIT compiler ใช้สำหรับการปรับปรุงประสิทธิภาพใน Java มันถูกเปิดใช้งานโดยค่าเริ่มต้น เป็นการรวบรวมที่กระทำในเวลาดำเนินการค่อนข้างเร็วกว่า Java ได้รับความนิยมใช้ JIT คอมไพเลอร์โดยรวมไว้ใน JVM