SML-NJ, cómo compilar un ejecutable independiente


Empiezo a aprender ML Estándar, y ahora trato de usar ML Estándar del compilador de Nueva Jersey.

Ahora puedo usar loop interactivo, pero ¿cómo puedo compilar el archivo fuente en un ejecutable independiente?

En C, por ejemplo, uno puede escribir

$ gcc hello_world.c -o helloworld

Y luego ejecute el binario helloworld.

He leído la documentación de SML NJ Compilation Manager, pero no tiene ejemplos claros.

También, hay otro compilador SML (que permite la creación binaria independiente) disponible?

 40
Author: S.J., 2011-02-19

1 answers

Tanto MosML como MLton también tienen la posibilidad de crear archivos binarios independientes. MosML a través del comando mosmlc y MLton a través del comando mlton.

Tenga en cuenta que MLton no tiene un bucle interactivo, sino que es un compilador de optimización de todo el programa. Lo que en basic significa que toma bastante tiempo compilar pero a su vez genera increíblemente rápido programas SML.

Para SML / NJ puede usar la función CM.mk_standalone, pero esto no se aconseja en el CM Manual de Usuario página 45. En su lugar, recomiendan que utilice el comando ml-build. Esto generará una imagen de montón SML / NJ. La imagen del montón debe ejecutarse con el parámetro @SMLload, o puede usar el programa heap2exec, siempre que tenga un sistema compatible. Si no lo hace, le sugiero que use MLton en su lugar.

Se puede usar lo siguiente para generar una imagen de montón SML/NJ válida:

Test.cm:

Group is 
        test.sml

        $/basis.cm

Prueba.lme:

structure Test =
struct

fun main (prog_name, args) =
    let
      val _ = print ("Program name: " ^ prog_name ^ "\n")
      val _ = print "Arguments:\n"
      val _ = map (fn s => print ("\t" ^ s ^ "\n")) args
    in
      1
    end
end

Y generar el imagen de montón puede utilizar: ml-build test.cm Test.main test-image y luego ejecutarlo por sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument" donde XXXXX es su arquitectura.

Si decide MLton en algún momento, entonces no necesita tener ninguna función principal. Evalúa todo en el nivel superior, por lo que puede crear una función principal y llamarla por algo como esto:

fun main () = print "this is the main function\n"

val foo = 4

val _ = print ((Int.toString 4) ^ "\n")

val _ = main ()

Entonces puedes compilarlo por mlton foo.sml que producirá un ejecutable llamado "foo". Cuando lo ejecutes, producirá esto como resultado:

./foo 
4
this is the main function

Tenga en cuenta que este es solo un archivo, cuando tenga varios archivos, necesitará usar MLB (ML Basis files) , que es MLtons project files, o puede usar archivos cm y luego compilarlos mediante mlton projectr.mlb

 35
Author: Jesper.Reenberg,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-02-22 01:25:20