Me gustaría escribir un pequeño compilador JIT de prueba de concepto para un procesador de lenguaje de juguete que he escrito (puramente académico), pero estoy teniendo algunos problemas en las altitudes medias del diseño. Conceptualmente, estoy familiarizado con el funcionamiento de JIT: ¿compila el código de bytes en el código (máquina o ensamblaje?) Para ejecutar. En el nivel de tuercas y pernos, sin embargo, no estoy realmente agarrando cómo realmente va sobre haciendo que.¿Cómo generar y ejecutar código nativo de forma dinámica?
Mi (muy "Novato") reacción automática, ya que tengo no es la primera idea de por dónde empezar, sería la de intentar algo así como lo siguiente:
- mmap() un bloque de memoria , el establecimiento de acceso a PROT_EXEC
- escribir el código nativo en el bloque
- tienda de los registros actuales (stack pointer, et al.) un lugar acogedor
- modificar los registros actuales para apuntar en el bloque de código nativo en la región asignada
- el código nativo ahora conseguiría ejecutado por la máquina
- restaurar los registros anteriores
es que incluso cerca de un/el algoritmo correcto? He intentado leer diferentes proyectos que sé que tienen compiladores JIT para estudiar (como V8), pero estas bases de datos resultan difíciles de consumir debido a su tamaño, y tengo poca idea de dónde empezar a buscar.
Probablemente pueda simplificar aún más las cosas: a menudo puede simplemente tomar la dirección inicial de su código dentro del bloque 'mmap''ed y convertirla en un puntero de función. En ese caso, el código necesitaría guardar y restaurar sus propios registros y tal. Le recomendamos que consulte las convenciones de llamadas en sus plataformas ABI (Interfaz binaria de aplicaciones) para saber exactamente lo que necesita guardar (y cómo obtener argumentos del código C, funciones de llamada C, etc.). –
No es que tenga mucha experiencia en esto, pero podría ver el intérprete de python de PiPi. He revisado el intérprete de CPython y es muy bueno para leer. – Falmarri
¡Muy buena pregunta, Chris! – jweyrich