假设X是输入语言,Z是输出语言,则f是使用语言Y编写的编译器。
f = X -> Z
由于f只是一个程序,我认为Y可以是任何语言,对吗?这样我们就可以得到分别以Y1,Y2编写的编译器f1,f2。
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 doc http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
我们的目标是为语言实现者的问题提供一种可能的解决方案:必须为l种动态语言和p平台(具有o个关键的设计决策)编写l * o * 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程序就像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,这是用X编写的程序P。当我们想加快P的速度时,该怎么办?可能的方式:
用更有效的算法重写P
重写f以生成更好的Z
如果解释了Z,则编写更好的Z解释器(PyPy在这里?)
递归地加快用Z编写的程序的速度
得到更好的机器
ps。这个问题不是关于如何编写编译器的技术问题,而是关于编写某种编译器的可行性和复杂性。