X'in giriş dili, Z'nin çıkış dili olduğunu, sonra f'nin Y dilinde yazılan derleyici olduğunu varsayalım.
f = X -> Z
F sadece bir program olduğundan, Y'nin herhangi bir dil olabileceğini düşünüyorum, değil mi? Yani her biri Y1, Y2 ile yazılmış f1, f2 derleyicilerine sahip olabiliriz.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Örneğin cpython derleyicisini ele alalım, X Python, Z Python VM kodudur, Y C'dir.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Python kaynakları Python VM koduna, .pyc dosyalarına derlenir ve ardından yorumlayıcı tarafından yorumlanır. Uygulaması çok zor olsa da, doğrudan Python -> MachineCode yapabilen bir derleyici var gibi görünüyor:
hardpython = interpreter2 . cpython
Python -> PythonVMCode işini yapan başka bir derleyici yazabiliriz, başka bir dilde, Python'un kendisi.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Şimdi, karmaşık örnek PyPy. Ben sadece PyPy'nin bir acemisiyim, yanılıyorsam beni düzeltin:
PyPy doc http://doc.pypy.org/tr/latest/architecture.html#pypy-the-translation-framework
Amacımız dil uygulayıcıları sorununa olası bir çözüm sunmaktır: l dinamik diller için l * o * p tercümanları ve önemli tasarım kararlarına sahip p platformları yazmak zorunda kalmak.
L'nin X, p'nin Y olduğunu düşünebiliriz. Tüm RPython programlarını C'ye çeviren bir program var:
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 programları tıpkı VM talimatları gibidir, rpython_compiler VM'dir.
q1. pypy yorumlayıcıdır, Python kodunu yorumlayabilen bir RPython programıdır, çıktı dili yoktur, bu yüzden onu derleyici olarak kabul edemeyiz, değil mi?
Katma:
- Ben sadece çeviri sonra bile, pypy hala bir tercüman olduğunu, sadece bu sefer C ile yazılmış buldum.
- Tercüman pypy'nin derinliklerine bakarsak, Python kaynaklarını bir AST'ye derleyen bir tür derleyici olması gerektiğine inanıyorum.
bunun gibi:
compiler_inside_pypy = Python -> AST_or_so
q2. Bütün Python programlarını RPython'a dönüştüren py2rpy derleyicisi var olabilir mi? Hangi dilde yazıldığı önemsiz. Evet ise, başka bir derleyici py2c alırız. Doğada pypy ve py2rpy arasındaki fark nedir? Py2rpy yazmak pypy'den daha mı zor?
q3. Bununla ilgili bazı genel kurallar veya teoriler var mı?
Daha fazla derleyici:
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. X ile yazılmış bir P programı olan f = X -> Z verildi. P'yi hızlandırmak istediğimizde ne yapabiliriz? Olası yollar:
P'yi daha verimli algoritmada yeniden yaz
daha iyi Z oluşturmak için f'yi yeniden yaz
Z yorumlanırsa, daha iyi bir Z tercümanı yazın (PyPy burada mı?)
Z ile yazılmış programları özyinelemeli olarak hızlandırma
daha iyi bir makine al
ps. Bu soru, bir derleyicinin nasıl yazılacağıyla ilgili teknik konularla ilgili değil, belirli bir tür derleyicinin yazılmasının fizibilitesi ve karmaşıklığı ile ilgilidir.