Misalkan X adalah bahasa input, Z adalah bahasa output, maka f adalah kompiler, yang ditulis dalam bahasa Y.
f = X -> Z
Karena f hanya sebuah program, saya pikir Y dapat bahasa apa pun, bukan? Jadi kita dapat memiliki kompiler f1, f2, masing-masing ditulis dalam Y1, Y2.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Ambil cpython compiler misalnya, X adalah Python, Z adalah kode VM Python, Y adalah C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Sumber-sumber Python dikompilasi ke kode VM Python, file .pyc, kemudian ditafsirkan oleh penerjemah. Sepertinya mungkin ada kompiler yang dapat langsung melakukan Python -> MachineCode, meskipun jauh lebih sulit untuk diimplementasikan:
hardpython = interpreter2 . cpython
Kita juga dapat menulis kompiler lain melakukan pekerjaan Python -> PythonVMCode, dalam bahasa lain, katakan Python itu sendiri.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Sekarang, inilah contoh rumit PyPy. Saya hanya pemula di PyPy, koreksi saya jika saya salah:
PyPy doc http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Tujuan kami adalah untuk memberikan solusi yang mungkin untuk masalah pelaksana bahasa: harus menulis penerjemah l * o * p untuk bahasa yang dinamis dan platform p dengan o keputusan desain yang penting.
Kita dapat berpikir l adalah X, p adalah Y. Ada sebuah program yang menerjemahkan semua program RPython ke 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
Program RPython sama seperti instruksi VM, rpython_compiler adalah VM.
q1. pypy adalah interpreter, program RPython yang dapat menginterpretasikan kode Python, tidak ada bahasa output, jadi kita tidak bisa menganggapnya sebagai kompiler, kan?
Ditambahkan:
- Saya baru menemukan bahwa walaupun setelah menerjemahkan, pypy masih menjadi penerjemah, hanya saja kali ini ditulis dalam C.
- Jika kita melihat jauh ke dalam pypy interpreter, saya percaya pasti ada semacam kompiler, yang mengkompilasi sumber Python ke beberapa AST, kemudian jalankan
seperti ini:
compiler_inside_pypy = Python -> AST_or_so
q2. Bisakah kompiler py2rpy ada, mengubah semua program Python menjadi RPython? Dalam bahasa mana itu ditulis tidak relevan. Jika ya, kami mendapatkan py2c kompiler lain. Apa perbedaan antara pypy dan py2rpy di alam? Apakah py2rpy jauh lebih sulit untuk ditulis daripada pypy?
q3. Apakah ada aturan umum atau teori yang tersedia tentang ini?
Lebih banyak kompiler:
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. Diberikan f = X -> Z, sebuah program P ditulis dalam X. Ketika kita ingin mempercepat P, apa yang bisa kita lakukan? Cara berbisa:
tulis ulang P dalam algoritma yang lebih efisien
tulis ulang f untuk menghasilkan Z yang lebih baik
jika Z ditafsirkan, tulislah juru bahasa Z yang lebih baik (PyPy ada di sini?)
mempercepat program yang ditulis dalam Z secara rekursif
dapatkan mesin yang lebih baik
ps. Pertanyaan ini bukan tentang hal-hal teknologi tentang cara menulis kompiler, tetapi kelayakan dan kompleksitas penulisan kompiler jenis tertentu.