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
예를 들어, 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
또 다른 컴파일러로 파이썬-> PythonVMCode 작업을 수행 할 수도 있습니다.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
자, 여기 PyPy의 복잡한 예가 있습니다. 나는 PyPy의 초보자 일뿐입니다. 틀린 경우 수정하십시오.
파이 파이 문서 http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
우리의 목표는 언어 구현 자들의 문제에 대한 가능한 해결책을 제공하는 것입니다.
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 프로그램 인 인터프리터입니다. 출력 언어가 없으므로 컴파일러로 간주 할 수 없습니다.
추가 :
- 번역 후에도 pypy는 여전히 통역사이며 이번에는 C로 작성되었습니다.
- 인터프리터 pypy를 자세히 살펴보면 일종의 컴파일러가 있어야한다고 생각합니다. 파이썬 소스를 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. X로 작성된 프로그램 P 인 f = X-> Z가 주어집니다. P의 속도를 높이려면 어떻게해야합니까? 가능한 방법 :
보다 효율적인 알고리즘으로 P를 다시 작성
더 나은 Z를 생성하려면 f를 다시 작성
Z가 해석되면 더 나은 Z 해석기를 작성하십시오 (PyPy가 여기 있습니까?)
Z로 재귀 적으로 작성된 프로그램 속도 향상
더 나은 기계를 얻다
추신. 이 질문은 컴파일러를 작성하는 방법에 대한 기술적 내용이 아니라 특정 종류의 컴파일러를 작성하는 타당성과 복잡성에 관한 것입니다.