"PyPy เป็นการปรับใช้ Python ใน Python อีกครั้ง" เป็นวิธีที่ค่อนข้างหลอกลวงในการอธิบาย PyPy, IMHO แม้ว่ามันจะเป็นเทคนิคจริงก็ตาม
PyPy มีสองส่วนหลัก
- กรอบการแปล
- ล่าม
กรอบการแปลเป็นคอมไพเลอร์ มันรวบรวมรหัสRPythonลงไปที่ C (หรือเป้าหมายอื่น ๆ ) โดยอัตโนมัติเพิ่มในด้านต่าง ๆ เช่นการเก็บขยะและคอมไพเลอร์ JIT มันไม่สามารถจัดการรหัส Python ได้เองโดยเฉพาะ RPython
RPython เป็นชุดย่อยของ Python ปกติ รหัส RPython ทั้งหมดเป็นรหัส Python แต่ไม่ใช่รหัสอื่น ๆ ไม่มีคำจำกัดความที่เป็นทางการของ RPython เนื่องจาก RPython เป็นเพียง "ชุดย่อยของ Python ที่สามารถแปลได้โดยกรอบการแปลของ PyPy" แต่เพื่อที่จะได้รับการแปลรหัส RPython จะต้องพิมพ์แบบคงที่ (ประเภทที่อนุมานคุณไม่ได้ประกาศ แต่ก็ยังคงประเภทหนึ่งต่อตัวแปรอย่างเคร่งครัด) และคุณไม่สามารถทำสิ่งต่าง ๆ เช่นประกาศ / แก้ไขฟังก์ชั่น / คลาสที่รันไทม์อย่างใดอย่างหนึ่ง
ล่ามนั้นเป็นล่าม Python ปกติที่เขียนใน RPython
เนื่องจากรหัส RPython เป็นรหัส Python ปกติคุณจึงสามารถเรียกใช้บนตัวแปล Python ใด ๆ แต่ความเร็วของ PyPy นั้นไม่ได้มาจากการวิ่ง นี้เป็นเพียงสำหรับรอบการทดสอบอย่างรวดเร็วเพราะแปลล่ามใช้เวลานานเวลา
ด้วยความเข้าใจนั้นควรเห็นได้อย่างชัดเจนในทันทีว่าการคาดเดาเกี่ยวกับ PyPyPy หรือ PyPyPyPy ไม่สมเหตุสมผลจริง ๆ คุณมีล่ามเขียนไว้ใน RPython คุณแปลเป็นรหัส C ซึ่งดำเนินการ Python อย่างรวดเร็ว กระบวนการหยุดลงที่นั่น ไม่มี RPython ที่จะเร่งความเร็วโดยประมวลผลอีกครั้ง
ดังนั้น "เป็นไปได้อย่างไรที่ PyPy จะเร็วกว่า CPython" จึงกลายเป็นสิ่งที่ค่อนข้างชัดเจนเช่นกัน PyPy มีการนำไปใช้ที่ดีขึ้นรวมถึง JIT คอมไพเลอร์ (โดยทั่วไปจะไม่เร็วเท่านี้หากไม่มี JIT คอมไพเลอร์ฉันเชื่อว่าซึ่งหมายความว่า PyPy นั้นเร็วกว่าเฉพาะโปรแกรมที่ไวต่อการรวบรวม JIT) CPython ไม่เคยได้รับการออกแบบให้ใช้งานภาษา Python ให้เกิดประโยชน์สูงสุด (แม้ว่าพวกเขาจะพยายามทำให้เป็นการนำไปใช้ที่มีประสิทธิภาพสูงสุดหากคุณทำตามความแตกต่าง)
บิตที่แปลกใหม่ของโปรเจค PyPy คือพวกเขาไม่ได้เขียนโครงร่าง GC ที่ซับซ้อนหรือคอมไพเลอร์ JIT ด้วยมือ พวกเขาเขียนล่ามค่อนข้างตรงไปตรงมาใน RPython และสำหรับ RPython ทั้งหมดนั้นอยู่ในระดับที่ต่ำกว่า Python มันยังคงเป็นภาษาที่รวบรวมขยะเชิงวัตถุซึ่งมีระดับสูงกว่า C มากดังนั้นกรอบการแปลจะเพิ่มสิ่งต่าง ๆ เช่น GC และ JIT โดยอัตโนมัติ ดังนั้นกรอบการแปลจึงมีขนาดใหญ่มากความพยายาม แต่มันใช้กับตัวแปล PyPy python ได้ดีพอ ๆ กัน แต่พวกมันเปลี่ยนการใช้งานทำให้มีอิสระมากขึ้นในการทดลองเพื่อปรับปรุงประสิทธิภาพ (โดยไม่ต้องกังวลกับการแนะนำข้อบกพร่อง GC หรือปรับปรุง JIT คอมไพเลอร์เพื่อรับมือกับการเปลี่ยนแปลง) นอกจากนี้ยังหมายถึงเมื่อพวกเขาได้ใช้งานล่าม Python3 ก็จะได้รับประโยชน์โดยอัตโนมัติ และล่ามอื่น ๆ ที่เขียนด้วยกรอบ PyPy (ซึ่งมีจำนวนในขั้นตอนการขัดที่แตกต่างกัน) และล่ามทั้งหมดที่ใช้เฟรมเวิร์ก PyPy จะสนับสนุนแพลตฟอร์มทั้งหมดที่สนับสนุนโดยเฟรมเวิร์กโดยอัตโนมัติ
ดังนั้นประโยชน์ที่แท้จริงของโครงการ PyPy คือการแยกส่วนต่าง ๆ ทั้งหมดของการใช้ล่ามที่ไม่ขึ้นกับแพลตฟอร์มที่มีประสิทธิภาพสำหรับภาษาแบบไดนามิก และจากนั้นเกิดการใช้งานที่ดีเพียงครั้งเดียวในที่เดียวซึ่งสามารถนำมาใช้ซ้ำได้กับล่ามหลายคน นี่ไม่ใช่การชนะอย่างทันทีทันใดเช่น "โปรแกรม Python ของฉันทำงานเร็วขึ้น" แต่มันเป็นโอกาสที่ดีสำหรับอนาคต
และสามารถเรียกใช้โปรแกรม Python ของคุณได้เร็วขึ้น (อาจ)