Ch.2 SML#プログラミング環境の準備

§ 2.3. SML#のインストール

SML#1.0.1版は以下のプラットフォームで動作します.

  • Linux(x86版.または32ビット開発環境のあるamd64版),

  • Mac OS X(Intel版),

  • WindowsのMinGW(32ビット版)

また,SML#のコンパイルと実行にはGMP(GNU Multiple Precision Arithmetic Library)が必要です. GMPはLGPL(GNU Lesser General Public License)の下で配布されている フリーソフトウェアです. SML#コンパイラおよびSML#コンパイラが生成した実行形式 ファイルは,このライブラリを動的にリンクします. GMPはSML#の配布パッケージには含まれていませんので,SML# コンパイラをインストールするユーザは,GMPを別途インストールする必要が あります. 多くの場合,OSのパッケージ管理システムなどで簡単に導入できるはずです.

以上の環境があれば,SML#は,簡単な手順でインストールでき ます. 以下に各OS毎のインストール処理の詳細は以下のとおりです.

§ 2.3.1. Mac OS X

MacPortsのPortfileが用意されていますので,MacPortsを使って インストールするのが最も簡単です. MacPortsをセットアップ後,SML#のPortfileをダウンロードし, ローカルなPortfileとして設定した上で,port install smlsharp を実行すれば インストールされます. 詳細は,以下のとおりです.

  1. http://www.macports.org/を参照し, MacPorts をセットアップする.

  2. 適当なディレクトリを作成し,ローカルなPortfileリポジトリとして設定する. 例えば,ローカルなPortfileを /opt/var/macports/sources/local に置く場合は,そのディレクトリを作成した上で, /opt/etc/macports/sources.confファイルに

    file:///opt/var/macports/sources/local [nosync]

    と記述する. 詳しくは, http://guide.macports.org/#development.local-repositories を参照.

  3. 下記URLよりSML#のPortfileのアーカイブをダウンロードする. http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-macports.zip

  4. ローカルPortfileリポジトリのディレクトリで上記アーカイブを展開する.

    $ cd /opt/var/macports/sources/local
    $ unzip smlsharp-macports.zip

    この結果,lang/smlsharp/Portfileが現れる.

  5. ローカルPortfileリポジトリのディレクトリに対してportindex コマンドを実行する.

    $ portindex /opt/var/macports/sources/local
  6. 以上でSML#パッケージがMacPortsに設定されたので,portコマンドでSML#コンパイラをインストールする.

    $ port install smlsharp

SML#は32ビットモード(x86アーキテクチャ)のみ対応しています. Mac OS X 10.6 以降で64ビット版のMacPortsを使う場合, GMPライブラリなどのSML#が必要とするソフトウェアも 32ビット版または32ビット版を含むユニバーサル バイナリである必要があります. この依存関係はSML#のインストールの際にportコマンドに よって自動的に解消されるはずです. この解消のために,portコマンドはインストール済みの64ビット版 GMPライブラリなどをユニバーサルバイナリ化するために再ビルドする場合がある ことに注意してください.

§ 2.3.2. Debian GNU/LinuxおよびUbuntu

Debian GNU/LinuxおよびUbuntu用のdeb形式のバイナリパッケージが用意されています. 依存する他のパッケージをインストールした上で,このバイナリパッケー ジをdpkgコマンドでインストールすれば,SML#コンパイラが使用可 能になります. 詳細は,以下のとおりです.

  1. ダウンロードしたパッケージをdpkg --installコマンドでインストール する. このとき,もしSML#が必要とするパッケージがインストールされていなければ, その旨を表すエラーメッセージが表示されるので,必要なパッケージを apt-getコマンドでインストールしてから再度dpkgコマンドを実行する. 例えば,i386版であれば,以下のコマンドを実行する.

    $ apt-get install gcc
    $ apt-get install libgmp-dev
    $ sudo dpkg --install smlsharp-1.0.1-1_i386.deb

なお,このdebパッケージはDebianまたはUbuntuの公式なパッケージで はないことに注意してください. 公式のパッケージとは異なり,メンテナによる署名は行われていません. また,amd64版のdebパッケージも32ビット版SML#のみを含むことに ご注意ください. SML#コンパイラは64ビットコードを出力しません.

§ 2.3.3. Windows上のMinGW

32ビット版MinGW用のバイナリパッケージが, http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-1.0.1-1-mingw32-bin.tar.lzma に用意されています. 32ビット版MinGWのCコンパイラとGMPライブラリをセットアップした後, このバイナリパッケージをMinGWのルートディレクトリで展開すれば, SML#コンパイラが使用可能になります.

単に展開する代わりに以下の手順を実行すれば,SML#コンパイ ラがパッケージ管理下に入り,GMPなど必要なソフトウェアの自動インストールや, 将来のバージョンアップなどにも簡単に対応できるようになります.

  1. MinGWのホームページを参考に,MinGWをセットアップする. 以下では,MinGWは

     C:\MinGW
    

    にインストールされたものと仮定する.

  2. ファイル

     C:\MinGW\var\lib\mingw-get\data\profile.xml
    

    <profile>要素の中に以下の設定を書き加える.

     <repository uri="http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/mingw32/%F.xml.lzma">
       <package-list catalogue="smlsharp-package-list" />
     </repository>
    
  3. 以下のコマンドを実行する.

    mingw-get update
    mingw-get install smlsharp

§ 2.3.4. ソースからビルドする場合

Linuxなどのその他システムではソースからビルドしてください. ソースからのビルドには,以下の開発ツールとライブラリが事前に インストールされている必要があります.

  1. プログラム開発用のツール群GNU binutils(GNU Binary Utilities).

  2. gccのCコンパイラ.

  3. make(GNU makeを推奨)

  4. GMPのライブラリ本体とヘッダーファイル

64ビットOSを使う場合,これらのツールおよびライブラリの32ビット版が 必要です.

32ビット版GMPライブラリがOSのパッケージシステムによって提供されて いない場合,32ビット版GMPライブラリもソースからビルドする必要があります. GMPライブラリのWebページ http://gmplib.org/ などからGMPの ソースコードを入手,展開し,configureABI=32オプションを与える ことで32ビット版GMPライブラリをビルドすることができます.

$ ./configure ABI=32 $ make $ make install

すでにインストールされているGMPライブラリとの衝突を防ぐためにも, さらに--prefixオプションなどを与えると良いでしょう. GMPのビルド方法についての詳細はGMPライブラリのドキュメントを参照 してください.

以上の環境の下で,以下の手順でSML#をソースからビルドします.

  1. ソースパッケージ( http://www.pllab.riec.tohoku.ac.jp/smlsharp/download/smlsharp-\version{}.tar.gz )をダウンロード

  2. 適当なSML#ソースディレクトリを決め,そこに展開.

  3. 適当なSML#のインストールディレクトリを決める.そのディレクトリへのパスをPATHとする.

  4. SML#ソースディレクトリにてconfigureスクリプトを実行する. このとき,64ビットOSでは,Cコンパイラおよびリンカが32ビット版となる ようにCCおよびLDを適切に設定する. マルチスレッド(pthread)サポートを有効化したい場合は, --enable-threadスイッチを加える. また,ビルドにかかる時間を短縮したい場合は --enable-fast-buildスイッチを加える.

    i386 Linux の場合:

    $ ./configure --prefix=PATH --enable-fast-build

    amd64 Linux の場合:

    $ ./configure CC='gcc -m32' LD='ld -m elf_i386' --prefix=PATH --enable-fast-build
  5. makeコマンドを実行しビルドとインストールを行う.

    $ make
    $ make install

    システム管理の都合上,インストールされるファイルを PATHとは異なるディレクトリPATHに出力させたい場合は, make installコマンドにDESTDIR=PATHオプションを指定する.

以上により,以下のファイルがインストールされます.

  1. smlsharpコマンド:PATH/bin/smlsharp

  2. smlformatコマンド:PATH/bin/smlformat

  3. smllexコマンド:PATH/bin/smllex

  4. smlyaccコマンド:PATH/bin/smlyacc

  5. ライブラリファイル:PATH/lib/smlsharp/ディレクトリ以下のファイル

以下のコマンドでSML#コンパイラが起動できるはずです.

$ PATH/bin/smlsharp

補足とヒント:

  • ソースからビルドする全てのユーザーに, configure--enable-fast-buildスイッチを指定することを推奨します. このスイッチが指定されると,コンパイル済みアセンブリコードを再利用す ることでビルドにかかる時間を短縮します. このスイッチを指定しても,ビルド結果はこのスイッチを指定しない場合と 同一です. なお,このスイッチを指定しなかった場合, makeコマンドの実行に時間がかかります.(例えば,ThinkPadのVMWare上の Linux では,3時間以上かかるようです.) 特に,yaccが生成したiml.grm.smlml.grm.smlの2つの ファイルのコンパイルに時間がかかりますが,ループしているわけではありませ ん. 将来の最適化されたバージョンでは改善されるはずです.

  • マルチコアCPUをお使いの方は,GNU makeならばmakeコマンドを実行 するとき-jnスイッチを指定すると,並列にコンパイルされ, 実行時間が短縮される場合があります.nは並列度です.コアの数程度 に指定すると良い結果が得られると思います.