ไลบรารี NativeJIT ของ Microsoft ที่พัฒนาโดยทีม Bing เพื่อการคอมไพล์แบบ just-in-time ประสิทธิภาพสูง ได้จุดประกายการอภิปรายอย่างมีนัยสำคัญในชุมชนนักพัฒนาเกี่ยวกับสถานะปัจจุบันและข้อจำกัดในทางปฏิบัติ แม้ว่าไลบรารี open-source นี้จะสัญญาว่าจะคอมไพล์ expressions ได้อย่างรวดเร็วเป็นโค้ด x64 ที่ปรับให้เหมาะสม แต่ข้อเสนอแนะจากชุมชนล่าสุดเผยให้เห็นข้อกังวลหลายประการเกี่ยวกับทิศทางการพัฒนาและการใช้งานทางเทคนิค
คุณสมบัติหลัก:
- ไลบรารี JIT compilation แบบข้ามแพลตฟอร์ม
- ไม่มี dependencies นอกเหนือจาก standard C++ runtime
- การจัดสรร register ที่ได้รับการปรับแต่ง
- รองรับการดำเนินการทางคณิตศาสตร์/ตรรกศาสตร์ เงื่อนไข การเข้าถึง field ของ structure
- ความสามารถในการเรียกใช้ฟังก์ชันไปยังฟังก์ชัน C
ช่องว่างระหว่างเวอร์ชันภายในและ Open Source
ข้อกังวลหลักที่นักพัฒนาหยิบยกขึ้นมาคือการขาดการเชื่อมต่อที่ชัดเจนระหว่างเวอร์ชันภายในของ Microsoft และโค้ดที่เปิดให้สาธารณะ สมาชิกชุมชนได้ค้นพบว่า Bing ใช้เวอร์ชันภายในของ NativeJIT ที่ปรับปรุงแล้วอย่างมีนัยสำคัญ แต่การปรับปรุงเหล่านี้ไม่ได้ถูกรวมกลับเข้าไปใน repository ของ GitHub สิ่งนี้สร้างสถานการณ์ที่น่าหงุดหงิดที่ชุมชน open-source ไม่สามารถได้รับประโยชน์จากการปรับปรุงในโลกแห่งความเป็นจริงที่ Microsoft ได้พัฒนาขึ้นสำหรับการใช้งานจริง
คำถามเกี่ยวกับคุณภาพการสร้างโค้ด
ความสามารถในการสร้างโค้ดของไลบรารีได้รับการตรวจสอบอย่างละเอียดจากนักพัฒนาที่มุ่งเน้นประสิทธิภาพ การวิเคราะห์โค้ด assembly ที่สร้างขึ้นเผยให้เห็นผลลัพธ์ที่ไม่เหมาะสมที่สุด โดยเฉพาะอย่างยิ่งเกี่ยวกับการตั้งค่าและการรื้อถอน stack frame ที่ไม่จำเป็น ซึ่งคอมไพเลอร์สมัยใหม่มักจะปรับให้เหมาะสมโดยอัตโนมัติ สิ่งนี้ทำให้เกิดคำถามว่า NativeJIT ให้ข้อได้เปรียบที่มีความหมายเหนือแนวทางแบบดั้งเดิม เช่น การคอมไพล์โค้ดและใช้ dynamic loading ผ่านฟังก์ชัน dlopen หรือ LoadLibrary หรือไม่
การอภิปรายเกี่ยวกับการออกแบบ API
อินเทอร์เฟซการเขียนโปรแกรมของไลบรารีได้จุดประกายการอภิปรายเกี่ยวกับความสะดวกในการใช้งานและแนวปฏิบัติ C++ สมัยใหม่ ในขณะที่ NativeJIT ต้องการให้นักพัฒนาสร้าง expressions โดยใช้การเรียกเมธอดเช่น expression.Mul()
สมาชิกชุมชนบางคนโต้แย้งว่าควรสนับสนุน operator overloading ที่จะช่วยให้สามารถใช้ syntax ที่เป็นธรรมชาติมากขึ้นคล้ายกับไลบรารีอย่าง Eigen หรือ z3 ของ Python สิ่งนี้จะช่วยให้นักพัฒนาสามารถเขียน expressions โดยใช้สัญลักษณ์ทางคณิตศาสตร์ที่คุ้นเคยแทนที่จะเป็น method chains ที่ยาวเหยียด
ใช่ แต่สิ่งที่ผู้แสดงความคิดเห็นคาดว่าจะพูดคือคุณสามารถสร้าง expression โดยใช้ operator overloading ได้เช่นกัน ดังนั้นคุณสามารถพิมพ์ 'a + b' ไม่ใช่ 'a.Add(b)'
ความแน่นอนและศักยภาพการแคช
การอภิปรายทางเทคนิคที่น่าสนใจได้เกิดขึ้นเกี่ยวกับลักษณะที่แน่นอนของการสร้างโค้ดของ NativeJIT นักพัฒนากำลังตั้งคำถามว่าการป้อน expression trees ที่เหมือนกันให้กับคอมไพเลอร์จะสร้างผลลัพธ์ที่เหมือนกันทุกไบต์ในการรันหลายครั้งหรือไม่ หากผลลัพธ์มีความแน่นอน สิ่งนี้อาจเปิดใช้งานกลยุทธ์ memoization ที่ทรงพลังที่โค้ดที่คอมไพล์แล้วสามารถถูกแคชและนำมาใช้ซ้ำได้ ซึ่งจะปรับปรุงประสิทธิภาพอย่างมีนัยสำคัญสำหรับ expressions ที่ซ้ำกัน
โซลูชันทางเลือกและการแข่งขัน
การอภิปรายของชุมชนได้เน้นแนวทางและเครื่องมือที่แข่งขันกันหลายอย่างในพื้นที่ JIT compilation นักพัฒนาได้กล่าวถึงโปรเจ็กต์ ORC ของ LLVM, Clang-REPL และ libgccjit เป็นทางเลือกที่น่าพิจารณา บางคนแม้กระทั่งแนะนำว่าภาษาที่มีการใช้งาน JIT ที่เป็นผู้ใหญ่ เช่น HotSpot VM ของ Java อาจเหมาะสมกว่าสำหรับสถานการณ์ที่ต้องการการคอมไพล์และการปรับให้เหมาะสม expression ในขณะรันไทม์
แม้ว่า NativeJIT จะแสดงแนวทางที่น่าสนใจต่อการสร้างโค้ดในขณะรันไทม์ แต่ข้อเสนอแนะจากชุมชนชี้ให้เห็นว่าผู้ใช้ที่มีศักยภาพควรประเมินอย่างรอบคอบว่าข้อจำกัดปัจจุบันมีน้ำหนักมากกว่าประโยชน์หรือไม่ ช่องว่างระหว่างเวอร์ชันภายในและสาธารณะ รวมกับข้อกังวลเกี่ยวกับคุณภาพการสร้างโค้ด อาจผลักดันให้นักพัฒนาหันไปใช้ทางเลือกที่เป็นผู้ใหญ่มากกว่าจนกว่าปัญหาเหล่านี้จะได้รับการแก้ไข
อ้างอิง: NativeJIT