Angenommen, X ist die Eingabesprache, Z ist die Ausgabesprache, dann ist f der Compiler, der in Sprache Y geschrieben ist.
f = X -> Z
Da f nur ein Programm ist, denke ich, dass Y jede Sprache sein kann, oder? Wir können also Compiler f1, f2 haben, die jeweils in Y1, Y2 geschrieben sind.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Nehmen wir zum Beispiel den cpython-Compiler: X ist Python, Z ist der Python-VM-Code, Y ist C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Python-Quellen werden aus dem Python-VM-Code, den .pyc-Dateien, kompiliert und dann vom Interpreter interpretiert. Es scheint möglich, dass es einen Compiler gibt, der Python -> MachineCode direkt ausführen kann, obwohl dies sehr schwer zu implementieren ist:
hardpython = interpreter2 . cpython
Wir können auch einen anderen Compiler schreiben, der die Arbeit Python -> PythonVMCode erledigt, in einer anderen Sprache, sagen wir Python selbst.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Hier ist das komplizierte Beispiel PyPy. Ich bin nur ein Neuling von PyPy. Korrigieren Sie mich, wenn ich falsch liege:
PyPy-Dokument http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Unser Ziel ist es, eine mögliche Lösung für das Problem der Sprachimplementierer zu finden: Wir müssen l * o * p-Interpreter für l dynamische Sprachen und p Plattformen mit o entscheidenden Entwurfsentscheidungen schreiben.
Wir können denken, l ist X, p ist Y. Es gibt ein Programm, das alle RPython-Programme in C übersetzt:
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-Programme sind genau wie VM-Anweisungen, rpython_compiler ist die VM.
q1. pypy ist der Interpreter, ein RPython-Programm, das Python-Code interpretieren kann. Es gibt keine Ausgabesprache, daher können wir ihn nicht als Compiler betrachten, oder?
Hinzugefügt:
- Ich habe gerade festgestellt, dass Pypy auch nach der Übersetzung noch Dolmetscher ist, nur diesmal in C.
- Wenn wir tief in die Interpreter-Pypy schauen, muss es meiner Meinung nach eine Art Compiler geben, der die Python-Quellen zu einem AST kompiliert und dann ausführt
so was:
compiler_inside_pypy = Python -> AST_or_so
q2. Kann der Compiler py2rpy existieren, der alle Python-Programme in RPython umwandelt? In welcher Sprache es geschrieben ist, spielt keine Rolle. Wenn ja, bekommen wir einen anderen Compiler py2c. Was ist der Unterschied zwischen pypy und py2rpy in der Natur? Ist py2rpy viel schwieriger zu schreiben als pypy?
q3. Gibt es dazu allgemeine Regeln oder Theorien?
Weitere Compiler:
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. Wenn f = X -> Z ist, ein in P geschriebenes Programm P. Was können wir tun, wenn wir P beschleunigen wollen? Mögliche Wege:
Schreiben Sie P in einen effizienteren Algorithmus um
schreibe f um, um besseres Z zu erzeugen
Wenn Z interpretiert wird, schreiben Sie einen besseren Z-Interpreter (PyPy ist hier?)
Beschleunigen Sie rekursiv in Z geschriebene Programme
Holen Sie sich eine bessere Maschine
ps. Bei dieser Frage geht es nicht um die technischen Aspekte des Schreibens eines Compilers, sondern um die Machbarkeit und Komplexität des Schreibens eines bestimmten Compilers.