สมมติว่า X คือภาษาอินพุต Z คือภาษาเอาต์พุตจากนั้น f คือคอมไพเลอร์ซึ่งเขียนเป็นภาษา Y
f = X -> Z
เนื่องจาก f เป็นเพียงโปรแกรมฉันคิดว่า Y สามารถเป็นภาษาใด ๆ ใช่ไหม เราสามารถคอมไพล์เลอร์ f1, f2, แต่ละอันเขียนใน Y1, Y2
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
ใช้คอมไพเลอร์ cpython เช่น X คือ Python, Z คือรหัส Python VM, Y คือ C
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
แหล่งไพ ธ อนถูกคอมไพล์กับรหัส Python VM ไฟล์. pyc จากนั้นตีความโดยล่าม ดูเหมือนว่ามีความเป็นไปได้ที่จะมีคอมไพเลอร์ซึ่งสามารถทำ Python -> MachineCode ได้โดยตรง แต่ก็ยากที่จะนำไปใช้:
hardpython = interpreter2 . cpython
นอกจากนี้เรายังสามารถเขียนคอมไพเลอร์ตัวอื่นทำผลงาน Python -> PythonVMCode ในภาษาอื่นพูด Python เอง
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
ตอนนี้นี่คือตัวอย่าง PyPy ที่ซับซ้อน ฉันเป็นมือใหม่ของ PyPy ให้แก้ไขฉันถ้าฉันผิด:
PyPy doc http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
เป้าหมายของเราคือการจัดหาทางออกที่เป็นไปได้สำหรับปัญหาของผู้ใช้ภาษา: ต้องเขียนล่าม l * o * p สำหรับภาษา l ไดนามิกและแพลตฟอร์ม p ด้วยการตัดสินใจออกแบบที่สำคัญ
เราสามารถคิดว่า l คือ X, p คือ Y มีโปรแกรมที่แปลโปรแกรม RPython ทั้งหมดเป็น C:
rpython_compiler = RPython -> C Python
pypy = Python -> Nothing RPython
translate = compile the program pypy written in RPython using rpython_compiler
py2rpy = Python -> RPython Python
py2c = Python -> C Python
py2c = rpython_compiler . py2rpy
โปรแกรม RPython เหมือนกับคำสั่ง VM, rpython_compiler คือ VM
q1 pypy คือ interpreter ซึ่งเป็นโปรแกรม RPython ที่สามารถแปลรหัส Python ได้ไม่มีภาษาเอาท์พุทดังนั้นเราจึงไม่สามารถถือว่ามันเป็นคอมไพเลอร์ใช่มั้ย
ที่เพิ่ม:
- ฉันเพิ่งพบว่าแม้ว่าหลังจากการแปล Pypy ยังคงเป็นล่าม แต่คราวนี้เขียนเป็น C เท่านั้น
- หากเรามองลึกลงไปใน pypy ล่ามฉันเชื่อว่าต้องมีคอมไพเลอร์บางชนิดซึ่งรวบรวมไพทอนแหล่งที่มากับ AST บางตัวจากนั้นดำเนินการ
แบบนี้:
compiler_inside_pypy = Python -> AST_or_so
q2 คอมไพเลอร์ py2rpy มีอยู่สามารถแปลงโปรแกรม Python ทั้งหมดเป็น RPython ได้หรือไม่ ภาษาที่ใช้เขียนนั้นไม่เกี่ยวข้อง ถ้าใช่เราได้รับ py2c คอมไพเลอร์อื่น ความแตกต่างระหว่าง pypy และ py2rpy ในธรรมชาติคืออะไร? py2rpy เขียนยากกว่า pypy หรือไม่?
q3 มีกฎหรือทฤษฎีทั่วไปเกี่ยวกับเรื่องนี้หรือไม่?
คอมไพเลอร์เพิ่มเติม:
gcc_c = C -> asm? C # not sure, gimple or rtl?
g++ = C++ -> asm? C
clang = C -> LLVM_IR C++
jython = Python -> JVMCode java
ironpython = Python -> CLI C#
q4 รับ f = X -> Z โปรแกรม P ที่เขียนด้วย X เมื่อเราต้องการเร่งความเร็ว P เราจะทำอะไรได้บ้าง วิธี Possbile:
เขียน P ใหม่ในอัลกอริทึมที่มีประสิทธิภาพมากขึ้น
เขียน f เพื่อสร้าง Z ที่ดีกว่า
ถ้า Z ถูกตีความให้เขียนล่าม Z ที่ดีกว่า (PyPy อยู่ที่นี่?)
เร่งความเร็วโปรแกรมที่เขียนด้วย Z แบบวนซ้ำ
รับเครื่องที่ดีกว่า
PS คำถามนี้ไม่ได้เกี่ยวกับเทคโนโลยีของวิธีการเขียนคอมไพเลอร์ แต่ความเป็นไปได้และความซับซ้อนของการเขียนคอมไพเลอร์ชนิดหนึ่ง