Предположим, 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 - это код Python VM, Y - это C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Исходные коды Python компилируются в код Python VM, файлы .pyc, а затем интерпретируются интерпретатором. Похоже, что существует вероятность того, что существует компилятор, который может напрямую выполнять Python -> MachineCode, хотя его сложно реализовать:
hardpython = interpreter2 . cpython
Мы также можем написать другой компилятор, выполняющий работу Python -> PythonVMCode, на другом языке, скажем, сам Python.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Теперь вот сложный пример PyPy. Я просто новичок в PyPy, поправьте меня, если я ошибаюсь:
Документ PyPy http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Наша цель состоит в том, чтобы обеспечить возможное решение проблемы разработчиков языка: необходимость писать l * o * p интерпретаторов для l динамических языков и p платформ с критически важными проектными решениями.
Мы можем думать, что 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 аналогичны инструкциям виртуальной машины, а rpython_compiler - виртуальная машина.
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 рекурсивно
получить лучшую машину
пс. Этот вопрос не о технических вещах о том, как написать компилятор, а о целесообразности и сложности написания компилятора определенного вида.