Supponiamo che X sia la lingua di input, Z sia la lingua di output, quindi f sia il compilatore, che è scritto nella lingua Y.
f = X -> Z
Dato che f è solo un programma, penso che Y possa essere qualsiasi lingua, giusto? Quindi possiamo avere compilatori f1, f2, ognuno scritto in Y1, Y2.
f1 = f Y1
f2 = f Y2
g = Z -> M
h = g . f # We get a compiler X -> M
Prendi ad esempio il compilatore di cpython, X è Python, Z è il codice Python VM, Y è C.
cpython = Python -> PythonVMCode C
interpreter = PythonVMCode -> Nothing
interpreter2 = PythonVMCode -> MachineCode
I sorgenti Python vengono compilati nel codice VM Python, i file .pyc, quindi interpretati dall'interprete. Sembra che sia possibile che esista un compilatore che può eseguire direttamente Python -> MachineCode, anche se molto difficile da implementare:
hardpython = interpreter2 . cpython
Possiamo anche scrivere un altro compilatore per fare il lavoro Python -> PythonVMCode, in un'altra lingua, dire Python stesso.
mypython = Python -> PythonVMCode Python
mypython2 = Python -> PythonVMCode Ruby
Ora, ecco l'esempio complicato di PyPy. Sono solo un principiante di PyPy, correggimi se sbaglio:
PyPy doc http://doc.pypy.org/en/latest/architecture.html#pypy-the-translation-framework
Il nostro obiettivo è fornire una possibile soluzione al problema degli implementatori di linguaggi: dover scrivere interpreti l * o * p per linguaggi dinamici e piattaforme p con decisioni di progettazione cruciali.
Possiamo pensare che sia X, p sia Y. Esiste un programma che traduce tutti i programmi RPython in 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
I programmi RPython sono proprio come le istruzioni della VM, rpython_compiler è la VM.
q1. pypy è l'interprete, un programma RPython in grado di interpretare il codice Python, non esiste un linguaggio di output, quindi non possiamo considerarlo come un compilatore, giusto?
Inserito il:
- Ho appena scoperto che anche se dopo la traduzione, pypy è ancora un interprete, solo questa volta scritto in C.
- Se guardiamo in profondità nel pypy dell'interprete, credo che debba esistere una sorta di compilatore, che compila i sorgenti Python in alcuni AST, quindi eseguiamo
come questo:
compiler_inside_pypy = Python -> AST_or_so
q2. Può esistere il compilatore py2rpy, trasformando tutti i programmi Python in RPython? In quale lingua è scritta è irrilevante. Se sì, otteniamo un altro compilatore py2c. Qual è la differenza tra pypy e py2rpy in natura? Py2rpy è molto più difficile da scrivere di pypy?
q3. Ci sono alcune regole o teorie generali disponibili su questo?
Più compilatori:
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. Dato f = X -> Z, un programma P scritto in X. Quando vogliamo velocizzare P, cosa possiamo fare? Modi possibili:
riscrivi P in un algoritmo più efficiente
riscrivi f per generare una Z migliore
se Z viene interpretato, scrivi un interprete Z migliore (PyPy è qui?)
velocizzare i programmi scritti in Z in modo ricorsivo
ottenere una macchina migliore
ps. Questa domanda non riguarda gli aspetti tecnici di come scrivere un compilatore, ma la fattibilità e la complessità di scrivere un certo compilatore.