プログラミング言語SML#解説 4.1.0版
33 コンパイラの制御構造

33.2 コンパイラコマンドのメイン処理

SML#コンパイラの初期化処理等を行うメイン関数は, comiler/compilePhases/main/main/Main.smlファイルに書かれたの型を持つmain関数である.

  val main : string * string list -> OS.Process.status

この関数は,コマンド名と引数リストを受け取り,command関数 を呼び出し,以下の処理を行う.

  1. 1.

    引数を解釈し,コンパイラの動作モードと動作オプションを決定する.

  2. 2.

    動作モードに対応した以下のいずれかの処理を実行する.

    1. (a)

      ソースファイルリストのコンパイル

    2. (b)

      ソースファイルのコンパイル及びリンク

    3. (c)

      インタフェイスファイルで指定されたシステムのリンク

    4. (d)

      依存関係ファイルの出力とMakefileの生成

    5. (e)

      種々の情報のプリント

    ソースファイルのコンパイルは,compileSMLFile関数によって以下の手順で行われる.

    • ソースファイルをオープン

    • コンパイルモードを決定し,command関数で用意されたコンパイル 環境topContextを生成する.

    • Top.compileを呼び出す. Top.compile関数は, comiler/compilePhases/top/main/Top.smlファイルに書かれたの型を持つ関数である.

        val compile
            : LLVMUtils.compile_options
              -> options
              -> toplevelContext
              -> Parser.input
              -> InterfaceName.dependency * result
      

      返される値の型InterfacceName.dependencyはソースファイルが 依存するインタフェイスファイルのリスト,resultはコンパイル結果の オブジェクトファイルである.

    コンパイル及びリンクは,link関数によって以下の手順で行われる.

    1. (a)

      入力ソースファイルが.smlファイルなら,コンパイルしオブジェクトファイルを生成し, ルートのオブジェクトファイルとする. 入力ソースファイルが.smiファイルなら,ファイル名から,ルートのオブジェクトファイルを名を決定する.

    2. (b)

      入力ソースファイルが.smlファイルなら,コンパイル関数が返す依存するインタフェイスファイルのリストから, リンクするオブジェクトファイル集合を決定する. 入力ソースファイルが.smiファイルなら,ファイルを loadSMI関数で解析し,トップレベルのソースが依存するインタフェイス ファイルのリストをもとめ,リンクするオブジェクトファイル集合を決定する.

    3. (c)

      ルートオブジェクトファイル,依存オブジェクトファイル,ライブラリリストを 指定しシステムリンカ呼び出しリンクを実行する