Припустимо, 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 - код VM Python, Y - C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Джерела Python компілюються у код VM Python, файли .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 платформ з o важливими дизайнерськими рішеннями.
Можна подумати, що 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 - це інтерпретатор, програма RPython, яка може інтерпретувати код Python, мови виводу немає, тому ми не можемо розглядати це як компілятор, правда?
Додано:
- Я щойно виявив, що навіть якщо після перекладу, pypy - це все ще перекладач, лише цього разу написаний на C.
- Якщо ми заглянемо глибоко в pypy інтерпретатора, я вважаю, що повинен існувати якийсь компілятор, який компілює джерела Python в якийсь 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, що ми можемо зробити? Можливі способи:
перепишіть P у більш ефективний алгоритм
перепишіть f для отримання кращого Z
якщо інтерпретується Z, напишіть кращий інтерпретатор Z (PyPy тут?)
прискорювати програми, записані на Z рекурсивно
отримати кращу машину
пс. Це питання стосується не технічних речей, як написати компілятор, а доцільності та складності написання компілятора певного виду.