33.1 コンパイラスタートアップ
SML#コンパイラコマンドは,SML#言語で書かれたプログ ラムをSML#コンパラで分割コンパイル・リンクし生成された実行形式プ ログラムである. SML#のプログ ラムのメインコードは,SML#コマンドをリンクモードで起動した時に指 定されたインタフェイスファイルに対応するソースファイルおよび,そのインタ フェイスファイルから参照されるインタフェイスファイルに対応するソースファ イル集合のトップレベルの宣言の列を,依存関係に従い順次実行するコードであ る.
SML#コンパイラをリンクするコードは Makefileに src/compiler/smlsharp をターゲットとして記述されている以下のshellコマンドである.
$(SMLSHARP_ENV) $(SMLSHARP_STAGE1) -Bsrc -nostdpath $(SMLFLAGS) \ Ψ-filemap=filemap \ Ψ$(RDYNAMIC_LDFLAGS) $(LLVM_SMLSHARP_LDFLAGS) --link-all \ Ψ$(srcdir)/src/compiler/smlsharp.smi \ Ψ$(COMPILER_SUPPORT_OBJECTS) $(LLVM_LIBS) $(LLVM_SYSLIBS) -o $@
標準の環境では,SMLSHARP_STAGE1はminismlsharpコマンドと 定義されている. minismlsharpは,SML#コンパイラのソースコードをコンパイルするのに必要な 最小のライブラリリンクされたsmlsharpコンパイラである. smlsharpコンパイラのトップレベルソースファイルは このコマンドで指定されたルートインタフェイスファイル ./src/compiler/smlsharp.smi に対応する以下のファイルである.
./src/compiler/smlsharp.sml
このソースファイルの内容は以下の4行である.
val commandLineName = CommandLine.name () val commandArgs = CommandLine.arguments () val status = Main.main (commandLineName, commandArgs) val () = OS.Process.exit status
Main.main はcomiler/compilePhases/main/mainにある Main.smlファイルに書かれた以下の型を持つmain関数である.
val main : string * string list -> OS.Process.status
この関数がSML#コンパイラのトップレベル関数である. この関数は,コマンド名(smlsharp)とコマンドライン引数文字列リスト を受け取り,コンパイルやリンク処理を実行する.