VS CodeでOCamlのデバッグ可能な開発環境を構築する

1. 背景

最近はRustを個人的にインプットする事をしていて、Rustで使われるenumOCamlなどの関数型言語に影響を受けているという記述を見て、今まで触れてこなかった関数型言語にも手を出してみようという考えに至った。
丁度読みたかった本もOCamlで書かれているということもあり、良い機会だったのでVS Codeデバッグ可能なOCamlの開発環境をローカルPCに構築してみた。

2. 環境

3. OCamlのインストール

ここは以下公式にある通り進める。Macのパッケージ管理にはHomebrewを使用し、OCamlのパッケージマネージャをインストールする。

ocaml.org

❯❯❯ brew install opam

opamの初期化を行う。ここでOCamlがインストールされる。
opamについて詳細を知りたいのならopam --helpやら公式を見ると良い。

❯❯❯ opam init
# デフォルトシェルを判断してくれるからyしておく

バージョンを確認してOCamlインストール出来たことを確認。

❯❯❯ ocaml -version
The OCaml toplevel, version 4.12.0

4. duneのインストール

OCamlのビルドシステムをインストールする。

❯❯❯ opam install dune

5. utopのインストール

興味本位でutopもインストールする。本題とは関係ないところなので、これはスキップしても良い。

❯❯❯ ocaml install utop

utopを動かして見るとこんな感じ。

6. デバッガーをインストール

OCamlのデバッガーをインストールする。

❯❯❯ opam install earlybird

VS CodeOCamlを使用するので、以下のOCaml Platform拡張機能もインストール。

marketplace.visualstudio.com

これに合わせてocaml-lsp-serverも必要となるのでインストール。

❯❯❯ opam install ocaml-lsp-server

7. プロジェクトの作成

duneを使用してOCamlのプロジェクトを作成する。

# 任意の場所で良い
❯❯❯ dune init proj hello_ocaml
Success: initialized project component named hello_ocaml
❯❯❯ cd hello_ocaml/
# VS Codeを開く
~/hello_ocaml ❯❯❯ code .

8. デバッグ確認

VS Codeを開いたらbin/main.mlに以下を記載。

let () = print_endline "Hello, World!"

ブレークポイントで止まるか確かめたいので、動作するなら正直何でも良い。
書いたらbin/main.mlファイル内でデバッグしたい箇所にブレークポイントを追加し、バイトコードコンパイルする。
バイトコード以外だとearlybirdデバッグはどうやら出来ない模様。

~/hello_ocaml ❯❯❯ ocamlc -g bin/main.ml

出力されたa.outファイルを右クリックすると、メニューにStart an OCaml Debug Sessionが表示されるので選択する。上手くいくと以下のようにデバッグが可能になる。

実はdune buildのコマンドでも試したが、この場合にtestディレクトリのファイルは.bcファイルで出力された。しかし、bin/main.mlについてのデバッグ可能なファイルが見当たらなかったためocamlcで対応した。

9. ちなみに

読みたかった本はこちらになります。
※読み進めるにあたって当記事の環境構築をする必要はありません。

www.saiensu.co.jp

10. 参考

ocaml.org

github.com

dune.readthedocs.io