คุณใช้ถ้อยแถลงของ Guido ในการเขียนคำถามของคุณ ปัญหาไม่ได้เขียนคอมไพเลอร์สำหรับภาษาที่พิมพ์แบบไดนามิก ปัญหาคือการเขียนหนึ่งที่ (เกณฑ์ 1) ถูกต้องเสมอ (เกณฑ์ 2) รักษาการพิมพ์แบบไดนามิกและ (เกณฑ์ 3) จะเร็วขึ้นอย่างเห็นได้ชัดสำหรับจำนวนรหัสที่สำคัญ
ง่ายในการติดตั้ง Python 90% (ไม่ผ่านเกณฑ์ 1) และรวดเร็วในการใช้งาน ในทำนองเดียวกันมันเป็นเรื่องง่ายที่จะสร้างตัวแปร Python ที่เร็วขึ้นด้วยการพิมพ์แบบสแตติก การปรับใช้ 100% นั้นง่าย (ตราบเท่าที่การใช้ภาษาที่ซับซ้อนนั้นง่าย) แต่จนถึงทุก ๆ วิธีที่ง่ายในการนำไปใช้นั้นจะค่อนข้างช้า (ไม่ผ่านเกณฑ์ 3)
การใช้ล่ามและ JITที่ถูกต้องนั้นใช้ทั้งภาษาและเร็วกว่าสำหรับบางโค้ดกลายเป็นไปได้แม้ว่าจะยากขึ้นอย่างมาก (เทียบกับ PyPy) และดังนั้นถ้าคุณทำการสร้างคอมไพเลอร์ JIT โดยอัตโนมัติ (Psyco ทำได้โดยไม่มีมัน แต่มีข้อ จำกัด มากในโค้ดที่สามารถเพิ่มความเร็วได้) แต่โปรดทราบว่านี่ไม่ใช่ขอบเขตอย่างชัดเจนเนื่องจากเรากำลังพูดถึงสเตติกคอมไพเลอร์ (aka ล่วงหน้า) ฉันเพียงแค่พูดถึงสิ่งนี้เพื่ออธิบายว่าทำไมวิธีการของมันจึงไม่สามารถใช้งานกับคอมไพเลอร์แบบสแตติก (หรืออย่างน้อยก็ไม่มีตัวอย่างที่มีอยู่เดิม): ก่อนอื่นต้องทำการตีความและสังเกตโปรแกรมจากนั้นสร้างรหัสสำหรับการวนซ้ำ เส้นทาง) จากนั้นปรับค่านรกให้เหมาะสมตามสมมติฐานที่เป็นจริงสำหรับการทำซ้ำเฉพาะนั้น (หรืออย่างน้อยไม่ใช่การทำซ้ำที่เป็นไปได้ทั้งหมด) ความคาดหวังคือการประมวลผลในภายหลังของรหัสนั้นจะตรงกับความคาดหวังและทำให้ได้รับประโยชน์จากการปรับให้เหมาะสม มีการเพิ่มการตรวจสอบ (ค่อนข้างถูก) บางอย่างเพื่อรับรองความถูกต้อง ในการทำสิ่งนี้คุณต้องมีความคิดในสิ่งที่ต้องทำและการใช้งานที่ช้า แต่โดยทั่วไปกลับไปใช้ คอมไพเลอร์ AOT ไม่มี พวกเขาไม่สามารถเชี่ยวชาญได้ทั้งหมดขึ้นอยู่กับรหัสที่พวกเขาไม่สามารถมองเห็นได้ (เช่นรหัสที่โหลดแบบไดนามิก) และผู้เชี่ยวชาญอย่างไม่ระมัดระวังหมายถึงการสร้างรหัสเพิ่มเติมซึ่งมีจำนวนของปัญหา (การใช้ icache, ขนาดไบนารี, เวลารวบรวม, สาขาเพิ่มเติม)
การใช้คอมไพเลอร์ AOT ที่ใช้ภาษาทั้งหมดอย่างถูกต้องนั้นค่อนข้างง่าย: สร้างรหัสที่เรียกใช้ในรันไทม์เพื่อทำสิ่งที่ล่ามจะทำเมื่อป้อนด้วยรหัสนี้ Nuitka (ส่วนใหญ่) ทำสิ่งนี้ อย่างไรก็ตามสิ่งนี้ไม่ได้ให้ประโยชน์ด้านประสิทธิภาพมากนัก (เกณฑ์ที่ล้มเหลว 3) ในขณะที่คุณยังต้องทำงานที่ไม่จำเป็นเท่าล่ามให้บันทึกการจัดส่งรหัสไบต์ไปยังบล็อกของรหัส C ซึ่งทำสิ่งที่คุณรวบรวมไว้ นั่นเป็นเพียงค่าใช้จ่ายที่ค่อนข้างน้อย - มีความสำคัญพอที่จะคุ้มค่าในการใช้ล่ามที่มีอยู่ แต่ไม่สำคัญพอที่จะพิสูจน์การใช้งานใหม่ทั้งหมดพร้อมกับปัญหาของตัวเอง
จะต้องมีอะไรบ้างในการบรรลุเกณฑ์ทั้งสาม เราไม่มีความคิด มีรูปแบบการวิเคราะห์แบบสแตติกซึ่งสามารถดึงข้อมูลบางอย่างเกี่ยวกับประเภทคอนกรีตการควบคุมการไหล ฯลฯ จากโปรแกรม Python คนที่ให้ข้อมูลที่ถูกต้องเกินขอบเขตของบล็อกพื้นฐานเดียวช้ามากและต้องดูโปรแกรมทั้งหมดหรืออย่างน้อยที่สุด แต่ถึงกระนั้นคุณก็ไม่สามารถทำอะไรกับข้อมูลนั้นได้มากไปกว่าการเพิ่มประสิทธิภาพการทำงานบางอย่างในประเภทบิวด์อิน
ทำไมเป็นอย่างนั้น? คอมไพเลอร์จะลบความสามารถในการเรียกใช้งานโค้ด Python ที่รันไทม์ (ไม่ผ่านเกณฑ์ 1) หรือไม่ได้ตั้งสมมติฐานใด ๆ ที่สามารถทำให้โมฆะโดยรหัส Python ใด ๆ เลย แต่น่าเสียดายที่มีทุกอย่างสวยมากมีประโยชน์สำหรับการเพิ่มประสิทธิภาพของโปรแกรม: Globals รวมทั้งฟังก์ชั่นสามารถฟื้นตัวเรียนสามารถกลายพันธุ์หรือแทนที่ทั้งหมดโมดูลสามารถแก้ไขได้โดยพลเกินไปนำเข้าสามารถแย่งชิงในหลายวิธีเป็นต้นสายเดียวผ่านไปeval
, exec
, __import__
หรือฟังก์ชั่นอื่น ๆ อีกมากมายอาจดำเนินการใด ๆ ที่ ซึ่งหมายความว่าแทบจะไม่สามารถใช้การปรับแต่งขนาดใหญ่ให้เกิดประโยชน์ด้านประสิทธิภาพเพียงเล็กน้อย (เกณฑ์ความล้มเหลว 3) กลับไปที่ย่อหน้าด้านบน