プログラミング言語SML#解説 3.7.1版
33.3 コンパイラのトップレベル
SML#コンパイラのトップレベル関数は, comiler/compilePhases/toplevel/main/の Top.smlファイルに書かれた以下の型を持つcompile関数である.
val compile :
: LLVMUtils.compile_options
-> options
-> toplevelContext
-> Parser.input
-> InterfaceName.dependency * result
この関数は,LLVMコード生成オプション,コンパイルオプション, コンパイル環境,ソースファイルのインプットストリームを受け取り, ソースファイルをコンパイルし,ソースファイルが依存するインタフェイスファイルのリスト (InterfaceName.dependency)と コンパイル結果のオブジェクトファイル (result) を返す.
この関数は,Main.smlのcompileSML関数から呼び出され, 以下の表に示す通り,各コンパイルフェーズの関数を順に呼び出しソースファイ ルのコンパイルを行う.
| Compile step | Compile Phase Function | Source Language | Target Language |
|---|---|---|---|
| 1 | Parser.parse | (input stream) | Absyn.absyn |
| 2 | LoadFile.load | Absyn.absyn | AbsynInterface.compile_unit |
| 3 | Elaborator.elaborate | AbsynInterface.compile_unit | PatternCalcInterface.compile_unit |
| 4 | NameEval.nameEval | PatternCalcInterface.compile_unit | IDCalc.topdecl |
| 5 | TypedElaboration.elaborate | IDCalc.topdecl | IDCalc.topdecl |
| 6 | VALREC_Optimizer.optimize | IDCalc.topdecl | IDCalc.topdecl |
| 7 | InferTypes.typeinf | IDCalc.topdecl | TypedCalc.tpdecl list |
| 8 | UncurryFundecl.optimize | TypedCalc.tpdecl list | TypedCalc.tpdecl list |
| 9 | PolyTyElimination.compile | TypedCalc.tpdecl list | TypedCalc.tpdecl list |
| 10 | TPOptimize.optimize | TypedCalc.tpdecl list | TypedCalc.tpdecl list |
| 11 | MatchCompiler.compile | TypedCalc.tpdecl list | RecordCalc.rcdecl list |
| 12 | FFICompilation.compile | RecordCalc.rcdecl list | RecordCalc.rcdecl list |
| 13 | RecordCompilation.compile | RecordCalc.rcdecl list | RecordCalc.rcdecl list |
| 13 | DatatypeCompilation.compile | RecordCalc.rcdecl list | TypedLambda.tldecl list |
| 14 | BitmapCompilation2.compile | TypedCalc.tpdecl list | BitmapCalc2.bcdecl list |
| 15 | ClosureConversion2.convert | BitmapCalc2.bcdecl list | ClosureCalc.program |
| 16 | CallingConventionCompile.compile | ClosureCalc.program | RuntimeCalc.program |
| 17 | ANormalize.compile | RuntimeCalc.program | ANormal.program |
| 18 | MachineCodeGen.compile | ANormal.program | MachineCode.program |
| 18 | ConcurrencySupport.insertCheckGC | MachineCode.program | MachineCode.program |
| 19 | StackAllocation.compile | MachineCode.program | MachineCode.program |
| 19 | LLVMGen.compile | MachineCode.program | LLVMIR.program |
| 20 | LLVMEmit.emit | LLVMIR.program | LLVM.LLVMModuleRef |