ฉันจะอธิบายการรวบรวมรหัส IL เป็นคำแนะนำของ CPU ดั้งเดิมตามตัวอย่างด้านล่าง
public class Example
{
static void Main()
{
Console.WriteLine("Hey IL!!!");
}
}
โดยพื้นฐานแล้ว CLR จะรู้ทุกรายละเอียดเกี่ยวกับประเภทและวิธีการที่เรียกจากประเภทนั้นเนื่องจากข้อมูลเมตา
เมื่อ CLR เริ่มดำเนินการ IL ในคำสั่ง CPU ดั้งเดิมเวลานั้น CLR จะจัดสรรโครงสร้างข้อมูลภายในสำหรับทุกประเภทที่อ้างอิงโดยรหัสของ Main
ในกรณีของเราเรามีคอนโซลเพียงประเภทเดียวดังนั้น CLR จะจัดสรรโครงสร้างข้อมูลภายในหนึ่งโครงสร้าง ด้วยโครงสร้างภายในนั้นเราจะจัดการการเข้าถึงประเภทที่อ้างอิง
ภายในโครงสร้างข้อมูลนั้น CLR มีรายการเกี่ยวกับวิธีการทั้งหมดที่กำหนดโดยประเภทนั้น แต่ละรายการมีที่อยู่ที่สามารถพบการใช้งานวิธีการ
เมื่อเริ่มต้นโครงสร้างนี้ CLR จะตั้งค่าแต่ละรายการในFUNCTION ที่ไม่มีเอกสารซึ่งอยู่ภายใน CLR เอง และอย่างที่คุณเดาได้FUNCTION นี้คือสิ่งที่เราเรียกว่า JIT Compiler
โดยรวมแล้วคุณสามารถพิจารณา JIT Compiler เป็นฟังก์ชัน CLR ซึ่งรวบรวม IL เข้ากับคำสั่งของ CPU ดั้งเดิม ให้ฉันแสดงรายละเอียดว่ากระบวนการนี้จะเป็นอย่างไรในตัวอย่างของเรา
1. เมื่อ Main โทรไปยัง WriteLine เป็นครั้งแรกฟังก์ชัน JITCompiler จะถูกเรียกใช้
2. ฟังก์ชั่น JIT Compiler รู้ว่าวิธีใดถูกเรียกใช้และประเภทใดที่กำหนดเมธอดนี้
3. จากนั้น Jit Compiler จะค้นหาแอสเซมบลีที่กำหนดประเภทนั้นและรับรหัส IL สำหรับวิธีการที่กำหนดโดยประเภทนั้นในกรณีของเรารหัส IL ของวิธี WriteLine
4. คอมไพเลอร์ JIT จัดสรรบล็อกหน่วยความจำDYNAMICหลังจากนั้น JIT จะตรวจสอบและรวบรวมรหัส IL เป็นรหัส CPU ดั้งเดิมและบันทึกรหัส CPU นั้นในบล็อกหน่วยความจำนั้น
5. จากนั้นคอมไพเลอร์ JIT จะกลับไปที่รายการโครงสร้างข้อมูลภายในและแทนที่แอดเดรส (ซึ่งส่วนใหญ่อ้างอิงถึงการใช้โค้ด IL ของ WriteLine) ด้วยแอดเดรสบล็อกหน่วยความจำที่สร้างแบบไดนามิกใหม่ซึ่งมีคำสั่ง CPU ดั้งเดิมของ WriteLine
6. ในที่สุดฟังก์ชัน JIT Compiler จะข้ามไปยังโค้ดในบล็อกหน่วยความจำและเรียกใช้โค้ดเนทีฟของวิธีการเขียน
7. หลังจากดำเนินการ WriteLine โค้ดจะกลับไปที่ Mains'code ซึ่งจะดำเนินการต่อไปตามปกติ