SML# - SmlSharpCompiler Diff

  • Added parts are displayed like this.
  • Deleted parts are displayed like this.

!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#システムは一プロセスで実行されるため,この問題は発生しない.