2012-04-22 2 views
8

¿Cómo funciona la evaluación en tiempo de compilación (CTFE) funciona? Estoy tratando de entender cómo el compilador, mientras se está ejecutando, crea algo que no existe (por ejemplo, una función) y lo ejecuta. Estoy acostumbrado a la idea de que el código fuente se convierta en un archivo binario a través de la compilación, y luego se ejecute el binario. Entonces, ¿cómo se convierte un código fuente en algo ejecutable mientras el compilador se está ejecutando y puede ejecutarlo? ¿Realmente se crea y ejecuta una función, o es solo una emulación de una llamada a función?¿Cómo funciona CTFE?

Respuesta

11

CTFE utiliza un intérprete que construyamos en el compilador - muy parecido a lo que cabría esperar de un lenguaje interpretado como Python. Al compilar algo como esto:

bool not(bool arg) { 
    return !arg; 
} 
void main() { 
    enum compileTime = not(true); // not() called at compile time 
    bool runTime = not(true);  // not() called at runtime 
} 

El compilador pasa por las etapas habituales de tokenising/léxico/análisis y así sucesivamente. Cuando se encuentra en tiempo de compilación de enumeración (o cualquier otra construcción que requiere un valor de tiempo de compilación), que tratará de evaluar lo que está en el lado derecho de la expresión. En el caso de una constante, hace lo que esperaría y almacena una constante. Si encuentra una llamada de función, iniciará el intérprete CTFE. En el ejemplo dado, sabe cuáles son los argumentos, y lo que hacen las declaraciones en la función, va paso a paso e interpreta cada uno. Si no puede interpretar la declaración en tiempo de compilación emitirá un error de tiempo de compilación. En este ejemplo simple, simplemente niega el parámetro, pero CTFE es capaz de interpretar estructuras, clases, bucles y mucho más, documentado aquí: http://dlang.org/function#interpretation.

+4

Tenga en cuenta que todo (o la mayoría) de eso es una implementación detalle de la tación. Cualquier implementación que tenga el mismo efecto final también funcionaría. – BCS

1

esto es esencialmente una forma avanzada de constant folding donde el compilador intenta calcular los valores utilizados para que no tenga que suceder en tiempo de ejecución (las operaciones que no pueden ocurrir en tiempo de compilación (IO, memoria alloc, ...) causarán que falle)

CTFE es especial, ya que se puede hacer explícita (mediante la asignación a un enum por ejemplo) y que tratará de evaluar las funciones definidas por el usuario

en la práctica esto puede hacerse por un intérprete construir en el compilador