Giả sử X là ngôn ngữ đầu vào, Z là ngôn ngữ đầu ra, sau đó f là trình biên dịch, được viết bằng ngôn ngữ Y.
f = X -> Z
Vì f chỉ là một chương trình, tôi nghĩ Y có thể là bất kỳ ngôn ngữ nào, phải không? Vì vậy, chúng ta có thể có các trình biên dịch F1, f2, mỗi trình biên dịch bằng Y1, Y2.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Lấy trình biên dịch cpython làm ví dụ, X là Python, Z là mã VM Python, Y là C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Các nguồn Python được biên dịch thành mã Python VM, các tệp .pyc, sau đó được phiên dịch bởi trình thông dịch. Có vẻ như có thể tồn tại một trình biên dịch có thể trực tiếp làm Python -> MachineCode, mặc dù rất khó thực hiện:
hardpython = interpreter2 . cpython
Chúng ta cũng có thể viết một trình biên dịch khác thực hiện công việc Python -> PythonVMCode, bằng ngôn ngữ khác, nói chính Python.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Bây giờ, đây là ví dụ phức tạp PyPy. Tôi chỉ là người mới của PyPy, hãy sửa tôi nếu tôi sai:
Tài liệu PyPy http://doc.pypy.org/en/latest/arch architecture.html #pypy-the-translation-framework
Mục tiêu của chúng tôi là cung cấp một giải pháp khả thi cho vấn đề của những người thực hiện ngôn ngữ: phải viết trình thông dịch l * o * p cho các ngôn ngữ động và nền tảng p với các quyết định thiết kế quan trọng.
Chúng ta có thể nghĩ l là X, p là Y. Tồn tại một chương trình dịch tất cả các chương trình RPython sang 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
Các chương trình RPython giống như các hướng dẫn VM, rpython_compiler là VM.
q1. pypy là trình thông dịch, một chương trình RPython có thể diễn giải mã Python, không có ngôn ngữ đầu ra, vì vậy chúng ta không thể coi nó là một trình biên dịch, phải không?
Thêm:
- Tôi chỉ thấy rằng ngay cả sau khi dịch, pypy vẫn là một thông dịch viên, chỉ lần này được viết bằng C.
- Nếu chúng ta nhìn sâu vào pypy trình thông dịch, tôi tin rằng phải tồn tại một loại trình biên dịch nào đó, nó biên dịch các nguồn Python thành một số AST, sau đó thực thi
như thế này:
compiler_inside_pypy = Python -> AST_or_so
q2. Trình biên dịch py2rpy có thể tồn tại, chuyển đổi tất cả các chương trình Python thành RPython không? Trong đó ngôn ngữ nó được viết là không liên quan. Nếu có, chúng tôi nhận được một trình biên dịch py2c khác. Sự khác biệt giữa pypy và py2rpy trong tự nhiên là gì? Là py2rpy khó viết hơn nhiều so với pypy?
q3. Có một số quy tắc chung hoặc lý thuyết có sẵn về điều này?
Trình biên dịch khác:
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. Cho f = X -> Z, một chương trình P được viết bằng X. Khi chúng ta muốn tăng tốc P, chúng ta có thể làm gì? Cách khả thi:
viết lại P trong thuật toán hiệu quả hơn
viết lại f để tạo Z tốt hơn
nếu Z được thông dịch, hãy viết một trình thông dịch Z tốt hơn (PyPy có ở đây không?)
tăng tốc các chương trình viết bằng Z đệ quy
có được một máy tốt hơn
ps. Câu hỏi này không phải là về các công cụ công nghệ về cách viết trình biên dịch, mà là tính khả thi và độ phức tạp của việc viết một trình biên dịch loại nhất định.