sml smlnj

SML-NJ, cómo compilar ejecutable independiente



smlnj (1)

Empiezo a aprender Standard ML, y ahora trato de usar el compilador Standard ML of New Jersey.

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

En C, por ejemplo, uno puede escribir

$ gcc hello_world.c -o helloworld

y luego ejecute el binario de helloworld.

Leí la documentación de SML NJ Compilation Manager, pero no tengo ningún ejemplo claro.

Además, ¿hay otro compilador SML (que permita la creación binaria independiente) disponible?


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 pero es un compilador que optimiza todo el programa. Lo que en principio significa que la compilación lleva bastante tiempo, pero a su vez genera programas SML increíblemente rápidos .

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

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

prueba.cm:

Group is test.sml $/basis.cm

test.sml:

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 para generar la imagen del montón puede usar: ml-build test.cm Test.main test-image y luego ejecútelo con sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument" donde XXXXX es su arquitectura.

Si decide utilizar MLton en algún momento, no necesita tener ninguna función principal. Evalúa todo a un nivel superior, por lo que puede crear una función principal y hacer que se llame de esta forma:

fun main () = print "this is the main function/n" val foo = 4 val _ = print ((Int.toString 4) ^ "/n") val _ = main ()

Luego puede 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 esto es solo un archivo; cuando tenga varios archivos, deberá usar MLB (archivos ML Basis), que son archivos de proyecto MLtons, o puede usar archivos cm y luego compilarlo por mlton projectr.mlb