45 votes

SML-NJ, comment compiler un exécutable autonome

Je commence à apprendre le ML standard et maintenant j'essaie d'utiliser le compilateur ML standard du New Jersey.

Maintenant, je peux utiliser la boucle interactive, mais comment puis-je compiler le fichier source en exécutable autonome?

En C, par exemple, on peut simplement écrire

$ gcc hello_world.c -o helloworld

puis exécutez helloworld binary.

J'ai lu la documentation de SML NJ Compilation Manager, mais elle n'a pas d'exemples clairs.

Existe-t-il également un autre compilateur SML (qui permet la création binaire autonome)?

39voto

Jesper.Reenberg Points 3985

Les deux MosML et MLton ont également la possibilité de créer autonome des fichiers binaires. MosML par mosmlc de commande et MLton par le biais de la mlton de commande.

Notez que MLton n'a pas de boucle d'interaction, mais est un ensemble de programme d'optimisation du compilateur. Qui de base signifie qu'il prend du temps à compiler, mais à son tour il génère incroyablement rapide SML programmes.

Pour SML/NJ, vous pouvez utiliser l' CM.mk_standalone de la fonction, mais ce n'est pas conseillé dans la CM Manuel de l'Utilisateur page 45. Au lieu de cela, ils recommandent que vous utilisez le ml-commande créer. Cela va générer un SML/NJ tas d'image. Le segment de l'image doit être exécuté avec le @SMLload paramètre, ou vous pouvez utiliser le heap2exec programme, étant donné que vous avez un système pris en charge. Si vous n'avez pas, alors je suggère que vous utilisez MLton à la place.

Les éléments suivants peuvent être utilisés pour générer un valide SML/NJ tas d'image:

test.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

Et pour générer le segment de l'image vous pouvez utiliser: ml-build test.cm Test.main test-image , puis l'exécuter en sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument" où XXXXX est votre architecture.

Si vous décidez de MLton à un certain point, alors vous n'avez pas besoin d'avoir une fonction principale. Il évalue tout au toplevel, vous pouvez donc créer une fonction principale et de l'avoir appelé par quelque chose comme ceci:

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

val foo = 4

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

val _ = main ()

Ensuite, vous pouvez le compiler mlton foo.sml , qui permettra de produire un exécutable nommé "toto". Lorsque vous l'exécutez, il va produire ceci comme résultat:

./foo 
4
this is the main function

Notez que ce n'est qu'un fichier, lorsque vous avez plusieurs fichiers, vous aurez besoin soit de l'utilisation de la MLB (ML fichiers) qui est MLtons fichiers de projet ou vous pouvez utiliser les cm des fichiers et de les compiler en mlton projectr.mlb

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X