c++ - Ensamblar una función según sea necesario y calcularla rápidamente
lambda linker (1)
Existen idiomas interpretados, como Lisp, Tcl, Perl, etc., que facilitan la definición de un lambda / proc / sub dentro de su código durante el tiempo de ejecución y para evaluarlo dentro de la misma sesión.
Hay lenguajes compilados, como C ++, que se ejecutarían mucho más rápido que los interpretados, pero definir una función dentro de un programa compilado durante el tiempo de ejecución y ejecutarlo no es fácil, si es posible.
El problema aquí es hacer lo siguiente:
Defina una función durante el tiempo de ejecución: por ejemplo, basándose en los datos de entrada iniciales, se deriva un modelo analítico de los datos.
Ejecute la función anterior rápidamente en un bucle: por ejemplo, aplique el modelo analítico derivado para analizar datos entrantes.
Una solución que vi no era muy bonita:
Se derivó un procedimiento que representa el modelo analítico en Tcl integrado basado en los datos de entrada iniciales.
Se creó una tabla de búsqueda evaluando el procedimiento en Tcl en una matriz de puntos de muestra que, de manera optimista, cubriría el rango de aplicabilidad.
La tabla de búsqueda se pasó del intérprete Tcl al binario (que se desarrolló en C ++).
Luego, los datos entrantes se analizaron interpolando entre los valores "suficientemente cercanos" en la tabla de búsqueda.
La solución anterior funciona, pero tiene bastantes problemas, tanto conceptuales como computacionales. Por lo tanto, la pregunta: ¿es posible definir una función puramente dentro de C ++ y hacerla disponible para su ejecución dentro de la misma sesión de tiempo de ejecución?
Conceptualmente hablando, ¿es posible hacer algo como crear una función como una cadena, compilarla en la memoria y vincularla de alguna manera al binario que se está ejecutando?
Si quieres algo que funcione de inmediato, echa un vistazo a ExprTK . Si quieres escribir un analizador de expresiones, echa un vistazo a Boost Spirit .
Una alternativa sería crear código C ++ sobre la marcha, compilarlo como una biblioteca compartida (complemento) y cargarlo en tiempo de ejecución. Esta probablemente sea la solución más rápida.