SML#コンパイラ

SML#コンパイラの使用方法

SML#をインストールすると以下の2つのコマンドが使用可能になる.

smlsharp
SML# compiler.
smlsharprun
SML# runtime.

SML#コンパイラは,評価モードとコンパイルモード(さらに特殊なpreludeをプリコンパイルするモード)をサポートする.

評価モード

smlsharpを"-c"スイッチなしで起動すると,SML#が評価モードで起動する.

コマンドラインの引数を指定しなければ,対話型モードで起動する.

$ smlsharp
# val x = 1;
val x = 1 : int
# ^D

コマンドラインの引数を指定すると,SML#は最初の引数を入力ファイル名と解釈しファイルからプログラムを読み込み実行する.

$ cat foo.sml
print "foo\n";

$ smlsharp ./foo.sml
foo

2番目以降の引数は,プログラムから'CommandLine.arguments'関数により参照できる.

$ cat bar.sml
app print (CommandLine.arguments ());

$ smlsharp ./bar.sml foo bar boo
foobarboo

コンパイルモード

"-c"スイッチとともにsmlsharpを起動すると,SML#がコンパイルモードで起動する.このモードでは,ソースプログラムをオブジェクトファイルにコンパイルする.オブジェクトファイル名が指定されていなければ,"a.sme"をデフォールトオブジェクトファイル名として使用する.

$ smlsharp -c
# print "foo\n";
# ^D

$ ls a.sme
a.sme

作られたオブジェクトファイルは,smlsharprunコマンドにより実行できる.

$ smlsharprun a.sme
foo

さらに,コマンドsmlsharprunのパスがPATH環境変数にはいっていれば,コマンドshellからオブジェクトファイル名を指定することにより,smlsharprunが自動的に起動されオブジェクトファイルを実行することができる.

$ ./a.sme
foo

評価モードの場合と同様,コマンドラインの最初の引数はソースファイル名と解釈される.

$ cat foo.sml
print "foo\n";

$ smlsharp -c foo.sml
$ ls a.sme
a.sme

評価モードと異なり,2番目以降の引数は無視される.

オブジェクトファイル起動時の引数は,ソースプログラムに渡される.

$ cat bar.sml
app print (CommandLine.arguments ());

$ smlsharp -c ./bar.sml
$ smlsharprun a.sme foo bar boo
foobarboo

$ ./a.sme foo bar boo
foobarboo

プレリュードコンパイルモード

"--make-compiled-prelude"スイッチと共に起動されると,コンパイラは,プレコンパイルしたプレリュードファイルを生成する.

$ smlsharp --make-compiled-prelude -o myprelude.smc myprelude.sml

これによって,myprelude.smlをコンパイルした時点のSML#の内部状態がmyprelude.smcに保存される.保存された内部状態は,"--compiled-prelude"スイッチによって回復できる.

$ smlsharp --compiled-prelude=./myprelude.smc

コマンドラインオプション

smlsharpへのオプション

smlsharpの使用法:

smlsharp [options ...] [ { -e EXP | --expression=EXP | --stdin | FILE } ARGS ...]

コンパイルモードオプション

-c
コンパイルモードでの起動
-o FILE / --output=FILE
オブジェクトファイル名の指定

ソースプログラムの指定

-e EXPRESSION / --expression=EXPRESSION
EXPRESSIONをソースプログラムとする
--stdin
標準入力をソースファイルとする.
-I DIR / --load-path=DIR
ディレクトリリストのロードパスリストへの追加.ロードパスリストについてはFilePathResolutionを参照のこと.

メッセージ表示の制御

-q / --quiet
すべてのメッセージをプリントしない.
--nowarn
警告メッセージをプリントしない.
--no-printbind
束縛情報をプリントしない.

情報の表示

-v / --version
バージョン情報の印字
-h / --help
コマンドオプションの表示
-X
非標準のコマンドオプションの表示

プレリュードの制御

--nobasis
最小プレリュードファイルを使用
--prelude=FILE
FILEをプレリュードファイルとして使用.
--compiled-prelude=FILE
FILEをコンパイル済みプレリュードファイルとして使用.
--make-compiled-prelude
プレリュードファイルのプリコンパイル

非標準コマンドオプション

そのほかにもチューニングや開発用のオプションがある. その一部を挙げる.

VMHeapSize=NUM
ヒープサイズを決定するヒント.
VMStackSize=NUM
フレームスタックサイズを決定するヒント.
runtimePath=PATH
SML#ランタイムプログラムのファイルパス.

利用可能なすべての非標準オプションは'-X'で表示される.

これらのオプションは, '--x'で始まるコマンドラインオプションか, 'IML_'で始まる環境変数で指定できる. たとえば, ヒープサイズはコマンドラインオプション--xVMHeapSizeか, 環境変数IML_VMHeapSizeで指定できる.

$ smlsharp --xVMHeapSize=1024000
$ env IML_VMHeapSize=1024000 smlsharp

smlsharprunへのコマンドラインオプション

使用法

smlsharprun [-heap heapsize] [-stack stacksize] FILE
-heap NUM
NUM語を実行時ヒープとして割り当てる.
-stack NUM
NUM語を実行時スタックとして割り当てる.

SML#が使用する環境変数

SMLSHARP_LIB_PATH
ロードパスリスト FilePathResolutionを参照.

注意事項

SML#が使用するプロセスについて

SML/NJでビルドしたSML#システムは,コンパイラと実行時システムをそれぞれプロセスとして実現し,両者が通信することによってSML#のコンパイルと実行を実現している.ユーザの入力やプログラムからの出力なども両者の通信チャネルにてプロトコルを組むことによって実現している.

プログラムが終了すれば,これら2つのプロセスも終了するが,通信のタイミングにより,まれに,どちらかのプロセスが異常終了し,他のプロセスが残ってしまう場合がある.そのような状況が発生した場合は,smlsharpまたはsmlsharprunの名前のプロセスを手動で終了すること.

次版では,より堅牢な終了処理を実現し,この問題の改善を図る予定.

MLtonでビルドしたSML#システムは一プロセスで実行されるため,この問題は発生しない.

Last modified:2007/03/30 02:23:41
Keyword(s):
References: