web-dev-qa-db-ja.com

SML-NJ、スタンドアロンの実行可能ファイルをコンパイルする方法

私はStandardMLを学び始め、今はNewJerseyコンパイラのStandardMLを使おうとしています。

これでインタラクティブループを使用できますが、ソースファイルをスタンドアロンの実行可能ファイルにコンパイルするにはどうすればよいですか?

たとえば、Cでは次のように書くことができます。

$ gcc hello_world.c -o helloworld

次に、helloworldバイナリを実行します。

SML NJコンパイルマネージャーのドキュメントを読みましたが、明確な例がありません。

また、別のSMLコンパイラ(スタンドアロンのバイナリ作成を可能にする)は利用できますか?

45
S.J.

MosMLMLton の両方に、スタンドアロンのバイナリファイルを作成する可能性もあります。 mosmlcコマンドを介したMosMLおよびmltonコマンドを介したMLton。

MLtonには対話型ループはありませんが、プログラム全体を最適化するコンパイラであることに注意してください。これは基本的に、コンパイルにかなりの時間がかかることを意味しますが、順番に 信じられないほど高速 SMLプログラムを生成します。

SML/NJの場合、CM.mk_standalone関数を使用できますが、これはCMユーザーマニュアルの45ページでは推奨されていません。代わりに、ml-buildコマンドを使用することをお勧めします。これにより、SML/NJヒープイメージが生成されます。ヒープイメージは@SMLloadパラメータを使用して実行する必要があります。または、サポートされているシステムがある場合は、 heap2exec プログラムを使用できます。そうでない場合は、代わりにMLtonを使用することをお勧めします。

以下を使用して、有効なSML/NJヒープイメージを生成できます。

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

また、ヒープイメージを生成するには、次を使用できます。ml-build test.cm Test.main test-image次に、sml @SMLload test-image.XXXXX arg1 arg2 "this is one argument"で実行します。ここでXXXXXはアーキテクチャです。

ある時点でMLtonを使用することにした場合は、メイン機能は必要ありません。これはすべてをトップレベルで評価するため、main関数を作成して、次のようなもので呼び出すことができます。

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

val foo = 4

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

val _ = main ()

次に、mlton foo.smlでコンパイルすると、「foo」という名前の実行可能ファイルが生成されます。あなたがそれを実行すると、それは結果としてこれを生成します:

./foo 
4
this is the main function

これは1つのファイルにすぎないことに注意してください。複数のファイルがある場合は、MLtonsプロジェクトファイルであるMLB(MLベーシスファイル)を使用するか、cmファイルを使用してmlton projectr.mlbでコンパイルする必要があります。

39
Jesper.Reenberg