プログラミング言語SML#解説 3.7.1版
6 SML#プログラミング環境の準備

6.4 SML#のコンパイルモードを試してみよう

SML#コンパイラは,対話型以外に,Cコンパイラのようにファイ ルをコンパイルすることができます.

まず,簡単な例として,前節での入力# "Hello world";
をファ イル書いてコンパイルしてみましょう. そのために,hello1.smlを以下のような内容で作成します.

"Hello world";

最後のセミコロンはあってもなくても同じです. この作成したファイルは,以下のようにしてコンパイルできます.

$ smlsharp hello1.sml
$ file a.out
a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=43a2c24d3728ad6a35262f6f386317a2fda1ba78, not stripped
$

SML#は,引数としてファイル名のみが与えられると,Cコンパイ ラ同様,そのファイルをコンパイル,リンクし実行形式ファイルを作成します. 以上のようにシステム標準の実行形式ファイルa.outが作成され ていることが確認できます. 作成されるファイル名はtt -oスイッチで指定できます.

$ smlsharp -o hello1 hello1.sml
$ ls hello1*
hello1 hellp1.sml
$

作成したファイルは,通常のコマンドと同じように実行できます.

$ ./hello1
$

何も表示されませんが,これで正常です. ファイルのコンパイルでは,対話型モードと違い,結果の値と型を表示 するコードは付加されません.

結果を表示したければ,結果を表示する関数を呼ぶ必要があります. そこで,hello2.smlを以下のような内容で作成します.

print "hello world!\n"

このファイルには,このファイルで定義していないprint関数が 使用されています. 我々の意図は基本ライブラリで定義されたprint : string -> unitを使用することですが,printは自由に再定義できますから, SML#コンパイラにとっては,名前printが 基本ライブラリ関数のprintを指すとはかぎりません. そこでこのファイルをコンパイルするためには,printが定義さ れているファイルをコンパイラに通知する必要があります.

このようにファイルに定義された名前以外の名前を使用するファイルを コンパイルするためには,そのファイルで使用する名前が他のソースファイルで 定義されていることを,インターフェイスファイルで宣言する必要があり ます. SML#は,ソースファイル名に対応するインターフェイスファイル "hello2.smi"を探します. hello.smlを実行するためには,以下の"hello2.smi"ファ イルを以下のように作成する必要があります.

_require "basis.smi"

この宣言は,hello2.smlがインターフェイスファイル"basis.smi"で宣言されている資源を必要としていることを表しています. "basis.smi"はStandard MLの基本ライブラリで定義されているすべての名 前が宣言されているインターフェイスファイルです.

この用意の下で,以下のコマンドを実行すれば,実行形式プログラムが 作成されます.

$ smlsharp hello.sml -o hello
$ ./hello
hello world!