Supongamos que X es el idioma de entrada, Z es el idioma de salida, luego f es el compilador, que está escrito en el lenguaje Y.
f = X -> Z
Como f es solo un programa, creo que Y puede ser cualquier lenguaje, ¿verdad? Entonces podemos tener compiladores f1, f2, cada uno escrito en Y1, Y2.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Tome el compilador cpython por ejemplo, X es Python, Z es el código de Python VM, Y es C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
Las fuentes de Python se compilan en el código de Python VM, los archivos .pyc, luego son interpretados por el intérprete. Parece que es posible que exista un compilador que pueda hacer directamente Python -> MachineCode, aunque es muy difícil de implementar:
hardpython = interpreter2 . cpython
También podemos escribir otro compilador para hacer el trabajo Python -> PythonVMCode, en otro idioma, digamos Python.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Ahora, aquí está el complicado ejemplo de PyPy. Solo soy un novato de PyPy, corrígeme si me equivoco:
Documento de PyPy http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Nuestro objetivo es proporcionar una posible solución al problema de los implementadores del lenguaje: tener que escribir l * o * p intérpretes para l lenguajes dinámicos y p plataformas con o decisiones de diseño cruciales.
Podemos pensar que l es X, p es Y. Existe un programa que traduce todos los programas RPython a 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
Los programas RPython son como las instrucciones de VM, rpython_compiler es la VM.
q1. Pypy es el intérprete, un programa RPython que puede interpretar el código Python, no hay lenguaje de salida, por lo que no podemos considerarlo como un compilador, ¿verdad?
Adicional:
- Acabo de descubrir que, incluso después de la traducción, pypy sigue siendo un intérprete, solo que esta vez escrito en C.
- Si observamos profundamente el intérprete pypy, creo que debe existir algún tipo de compilador, que compila las fuentes de Python para algún AST, luego ejecuta
Me gusta esto:
compiler_inside_pypy = Python -> AST_or_so
q2. ¿Puede existir el compilador py2rpy, transformando todos los programas de Python a RPython? En qué idioma está escrito es irrelevante. En caso afirmativo, obtenemos otro compilador py2c. ¿Cuál es la diferencia entre pypy y py2rpy en la naturaleza? ¿Py2rpy es mucho más difícil de escribir que pypy?
q3. ¿Hay algunas reglas generales o teorías disponibles sobre esto?
Más compiladores:
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. Dado f = X -> Z, un programa P escrito en X. Cuando queremos acelerar P, ¿qué podemos hacer? Posibles formas:
reescribir P en un algoritmo más eficiente
reescribe f para generar una mejor Z
si se interpreta Z, escriba un mejor intérprete de Z (¿PyPy está aquí?)
acelerar los programas escritos en Z recursivamente
obtener una mejor máquina
PD. Esta pregunta no se trata de los aspectos tecnológicos de cómo escribir un compilador, sino de la viabilidad y complejidad de escribir un compilador de cierto tipo.