大堀 淳先生のコンパイラ本(動画)では、SML#言語を用いてコンパイラ実装を行っていきます。公式サイトに記されていたインストール手法ではすんなり行かない箇所がありましたので、うまく行った手法を記載しておきます。
インストール方法
まず、SML#の依存関係にあるライブラリやビルドに必要なライブラリ等をインストールしましょう。
$ sudo apt install -y \
build-essential \
wget \
libmassivethreads-dev \
libgmp-dev \
llvm-11
SML#のコンパイルと実行には、MassiveThreads
・GMPライブラリ
・LLVM 11
が必要なのでそれぞれインストールしています。
$ wget https://github.com/smlsharp/smlsharp/releases/download/v4.0.0/smlsharp-4.0.0.tar.gz \
&& tar -xzf smlsharp-4.0.0.tar.gz \
&& cd smlsharp-4.0.0 \
&& ./configure --with-llvm=/usr/lib/llvm-11 \
&& make -j$(nproc) \
&& sudo make install
公式サイトにはaptコマンドでSML#コンパイラをインストール、アップデートさせる手法が記載されています。しかし、SML#自体のコンパイルに使用されたGCCのバージョンが少し古くなっており、SML#コンパイラでのコンパイル時に使用するGCCのバージョンと合わず、リンク時で使用されるLTO(Link Time Optimization)のバージョンが一致しないことによるエラーが発生しました。そのため、ソースからビルドする方がいいと思います。
また、configure実行時に、オプションを用いて設定内容を指定しています。このオプションについては--helpを引数にして実行する(./configure --help
)と確認できるものの一つで、使用するLLVMのパスを指定するものです。未設定だと、自動的に最新のLLVMが使用されてconfigureの実行が中止してしまいました。
makeコマンドに-jオプションとプロセスの数を指定する(例:make j4
)と、複数のスレッドでビルドされることになり、コンパイルやビルドの処理速度が向上します。また、nprocコマンドを用いると利用可能なプロセス数を知ることができ、動的に最適な数が指定できます。
$ smlsharp -v
# ....複数行の説明
# SML# 4.0.0 (2021-04-06 05:12:50 JST) for x86_64-pc-linux-gnu with LLVM 11.1.0
# ....複数行の説明
このような表示が出ればインストール成功です!
サンプルプログラムの実行
きちんとコンパイルできるか確認するため、サンプルプログラムを実行します。
smlsharp-4.0.0/sample
内に複数のサンプルプログラムがあります。今回はその中のcallback
をコンパイル・実行してみましょう。
$ make
$ ./callback
# f1
# h1
# f2
# h2
# f3
# h3
# g1
# g2
# g3
# g4
makeコマンドでコンパイル、生成された実行可能ファイルで実行できたらバッチリです!
まとめ
SML#をインストールして、楽しくコンパイラを勉強していきましょう!
参考文献
SML# のインストール
関数型プログラミング言語SML # の導入(Windows PC上のプログラミング環境整備 第4回)
configureの設定を変更してみる:仕事で使える魔法のLAMP(12)
make -jの値には何を指定するべき?それと注意事項。