2011-01-06 18 views
7

Actualmente estoy haciendo un recherche para la universidad sobre F #. Tengo una pregunta sobre la consola interactiva F # y el compilador F #.¿El intérprete de F # (fsi.exe) también produce un código de idioma intermedio como lo hace el compilador de F # (fsc.exe)?

El F # compilador produce código de lenguaje intermedio de Microsoft (MSIL) cuando su compilación F # -fuente. Esto es traducido por el compilador JIT al código máquina, al ejecutar el programa escrito.

Pero, ¿qué hace la consola de intérprete F #? ¿También traduce línea por línea el código F # en MSIL, y luego lo convierte en código máquina? ¿O se traduce el código F # directamente en el código de la máquina?

Si primero lo convierte en IL, entonces creo que probablemente haya un intérprete de IL porque el compilador de JIT solo compila programas completos. ¿No es así?

¿Qué opinas, ¿cómo F # F # -Intérprete maneja código y lo traduce?

Saludos, Martin

Respuesta

13

El F # compilador emite IL utilizando su propia biblioteca AbsIL. AbsIL es otro proyecto de MSR que fue absorbido por F #.

Al compilar para el modo interactivo, el AbsIL usesSystem.Reflection.Emit espacio de nombres para emitir IL en la memoria, en tiempo de ejecución, lo que a su vez está compilado a código nativo por el JIT conforme se ejecuta el código.

+0

Un grep rápido de la fuente parece sugerir que ABSIL no utiliza System.Reflection.Emit pero genera un binario directamente a una corriente .NET BinaryWriter. En algunos lugares, también parece usar un ByterBuffer personalizado definido en bytes.fs. Creo que esto se debe a que originalmente AbsIL tuvo que realizar una compilación cruzada con OCaml, pero se ha alejado de eso, ya que el compilador tenía una falla de arranque. – Robert

+1

@Robert, eche un vistazo al segundo enlace de mi publicación, verá que tiene un backend SRE, como se especifica en el encabezado: «Escribir estructuras IL abstractas en tiempo de ejecución usando Reflection.Emit» –

+0

Además, teniendo en cuenta el número de problemas que fsi desencadenó, y aún se desencadena en la implementación de Mono de SRE, puedo decir por experiencia :) –

Cuestiones relacionadas