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ドキュメントhttp://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
私たちの目標は、言語実装者の問題に対する可能な解決策を提供することです。l動的言語用のl * o * pインタープリターと、重要な設計上の決定を伴う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はインタープリターであり、Pythonコードを解釈できるRPythonプログラムです。出力言語がないため、コンパイラーと見なすことはできません。
追加:
- 翻訳した後でも、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を書き換えます
より良いZを生成するためにfを書き直します
Zが解釈される場合は、より優れたZインタープリターを作成します(PyPyはここにありますか?)
Zで書かれたプログラムを再帰的に高速化する
より良い機械を手に入れる
ps。この質問は、コンパイラーの作成方法に関する技術的な問題ではなく、特定の種類のコンパイラーを作成することの実現可能性と複雑さについてです。