Załóżmy, że X jest językiem wejściowym, Z jest językiem wyjściowym, a następnie f jest kompilatorem napisanym w języku Y.
f = X -> Z
Ponieważ f jest tylko programem, myślę, że Y może być dowolnym językiem, prawda? Możemy więc mieć kompilatory f1, f2, każdy napisany w Y1, Y2.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Weźmy na przykład kompilator cpython, X to Python, Z to kod VM Python, Y to C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Źródła Pythona są kompilowane do kodu VM języka Python, plików .pyc, a następnie interpretowane przez interpretera. Wygląda na to, że możliwe jest istnienie kompilatora, który może bezpośrednio wykonywać Pythona -> MachineCode, choć jest to bardzo trudne do wdrożenia:
hardpython = interpreter2 . cpython
Możemy też napisać inny kompilator do pracy w Pythonie -> PythonVMCode, w innym języku, powiedzmy sam Python.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Oto skomplikowany przykład PyPy. Jestem tylko nowicjuszem PyPy, popraw mnie, jeśli się mylę:
PyPy doc http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Naszym celem jest zapewnienie możliwego rozwiązania problemu implementatorów języków: pisanie l * o * p tłumaczy dla l dynamicznych języków i platform p z ważnymi decyzjami projektowymi.
Możemy myśleć, że l to X, p to Y. Istnieje program, który tłumaczy wszystkie programy RPython na 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
Programy RPython są jak instrukcje VM, rpython_compiler to VM.
q1. pypy to interpreter, program RPython, który potrafi interpretować kod Pythona, nie ma języka wyjściowego, więc nie możemy traktować go jako kompilatora, prawda?
Dodany:
- Właśnie odkryłem, że nawet jeśli po tłumaczeniu pypy nadal jest tłumaczem, tylko tym razem napisane w C.
- Jeśli spojrzymy głęboko w pypy tłumacza, uważam, że musi istnieć jakiś kompilator, który kompiluje źródła Pythona do niektórych AST, a następnie uruchom
lubię to:
compiler_inside_pypy = Python -> AST_or_so
q2. Czy istnieje kompilator py2rpy, który przekształca wszystkie programy Pythona w RPython? W jakim języku jest napisany, nie ma znaczenia. Jeśli tak, otrzymujemy kolejny kompilator py2c. Jaka jest różnica między pypy a py2rpy w naturze? Czy py2rpy jest dużo trudniejszy do napisania niż pypy?
q3. Czy dostępne są jakieś ogólne zasady lub teoria?
Więcej kompilatorów:
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. Biorąc pod uwagę f = X -> Z, program P napisany w X. Co chcemy zrobić, gdy chcemy przyspieszyć P? Możliwości:
przepisz P w bardziej wydajnym algorytmie
przepisz f, aby wygenerować lepsze Z
jeśli Z jest interpretowane, napisz lepszy interpreter Z (PyPy jest tutaj?)
przyspieszyć programy napisane w Z rekurencyjnie
zdobądź lepszą maszynę
ps. To pytanie nie dotyczy technicznych sposobów pisania kompilatora, ale wykonalności i złożoności pisania pewnego rodzaju kompilatora.