Supongamos que está compilando un lenguaje funcional para C portátil, y suponga también que por diversas razones desea una recolección de basura precisa en lugar de conservadora. No existe una forma portátil (quizás de ninguna manera en el caso general) para que el recolector de basura descubra qué es y qué no es un puntero en la pila C. Me parece que hay dos soluciones para este problema:Compilación de lenguajes funcionales a C
Shadow stack. Haga que cada función C mantenga la información de contabilidad sobre lo que es y no es un puntero. Este es el enfoque recomendado por, p. LLVM.
Aproveche el hecho de que está compilando un lenguaje funcional, lo que significa que el código principal no tiene efectos secundarios. Cuando el asignador detecta falta de memoria, en lugar de llamar al recolector de basura, aborta la operación actual con una vuelta larga al ciclo principal, que llama al recolector de basura (en un contexto donde se conoce el conjunto de variables que pueden contener punteros) de antemano) luego reinicia la operación.
Me parece que, si se trata de un lenguaje funcional puro, donde el segundo enfoque es aplicable, debe ser más eficiente que el primer enfoque, así como más fácil de mezclar con manuscrito C.
¿Hay algún problema que tenga en cuenta? ¿Alguna referencia a la discusión existente o implementaciones de esta técnica?
Posiblemente no sea útil, pero probé la primera mientras escribía el barrido de mi intérprete de esquemas. El rendimiento fue desagradable, así que terminé con una pila puramente virtual fuera de la pila del tiempo de ejecución de C, principalmente porque la introspección de la pila en tiempo de ejecución cruzada es prácticamente imposible. El rendimiento también fue malísimo, pero fue más fácil de depurar sin gdb/ddd. Decidí hacer las paces ya que este era el intérprete y abordarlo cuando llegué a la etapa de implementación del compilador (que normalmente nunca terminaba). – Deleted
¿Cómo planea reiniciar la operación actual? Guarde los puntos de control de vez en cuando, luego restaure el último bueno (¿cómo?) –
@ n.m .: la parte importante de la pregunta al respecto es "el código no tiene efectos secundarios". El que pregunta está asumiendo un lenguaje funcional puro, por lo que ningún estado se modifica alguna vez. No es necesario "tomar" un punto de control, y cuando salta a un estado anterior no necesita "deshacer" ningún cambio porque el idioma no es capaz de realizar cambios. En principio, su posición en el código le dice todo lo que necesita saber sobre el estado del programa. –