OCaml Weekly News

先週号 上へ 次週号

こんにちは

2026年7月21日から28日までの週の OCaml Weekly News をお届けします。

Table of Contents

Theo 0.1.0: 理論サポート付き BDD ライブラリ

Jérôme Vouillon が発表しました

OCaml 向けの Binary Decision Diagrams (BDDs) ライブラリ Theo の最初のリリースをお知らせします。

BDD はブール関数の 正規 表現を提供します。論理的に等価な2つの式は常に全く同じ構造を生成するため、等価性の検査はポインタ比較(O(1))になります。Theo の主要な拡張は 理論サポート です。アトムは単なるブール変数ではなく、ocaml >= 4.14name = "foo" のような制約であり、エンジンはその意味論を理解します。これにより、実世界の制約問題への実用的な適用が可能になります。

例えば、パッケージマネージャは (ocaml >= 4.14 AND dune >= 3.0) OR (ocaml >= 5.0)ocaml < 5.0 と互換性があるかどうかを問い合わせることができます。Theo はバージョン制約を直接推論します。ocaml >= 5.0 が成立するとき ocaml >= 4.14 が冗長であることを認識し、2番目の選言肢が ocaml < 5.0 と矛盾することを検出し、最もシンプルな充足代入(ocaml >= 4.14, dune >= 3.0)を抽出できます。

0.1.0 リリースのハイライト:

  • 弱テーブルによるハッシュ・コンシングと正規負辺形式を持つコア BDD エンジン
  • ブール演算: AND、OR、NOT、IMPLIES、EQUIV、XOR、さらに exists~/~forall 量化子
  • 線形順序と等式(ブール値、文字列、整数、セマンティックバージョン)に対するプラガブルな理論サポート、同一 BDD 内で理論を混在させる Combine functor
  • 外部制約のセット下での部分評価のための restrict と、パターンマッチによる制約内省
  • 最小証人抽出(最短充足代入)とゼロアロケーション充足可能性チェック(含意、非交差性、網羅性)
  • 冗長でない積和形(Minato–Morreale)計算
  • プロパティベーステストスイート

興味深い実装の詳細として、メモ化キャッシュは ephemerons 上に構築されているため、依存する BDD ノードが到達不能になると自動的にキャッシュエントリが回収され、手動キャッシュ無効化やリークが発生しません。理論を考慮した単純化は BDD 構築中に行われ、アトム順序を使って冗長な境界を刈り取ります。理論インターフェースは小さな functor ベースの API であり、同じ Syntax functor が BDD 式と制約リストの両方を生成します。

ハッシュ・コンシングと ephemerons キャッシュ、理論を考慮した単純化、restrict・最小証人・ゼロアロケーションクエリの背後にあるアルゴリズム技法などの主要なアイデアを詳しく解説したブログ記事も書きました。

フィードバックやコントリビューションをお待ちしています!

qiskit 2.0.1

Davide Gessa が発表しました

IBM の Python 量子コンピューティングライブラリ "qiskit" の OCaml ラッパーである qiskit 2.0.1 のリリースをお知らせします。今回のリリースでは qiskit > 2.0 のサポートが追加されました。これにはいくつかの破壊的変更が含まれています:

  • IBMProvider が IBMRuntime になりました
  • いくつかのゲートの追加と削除

https://opam.ocaml.org/packages/qiskit/qiskit.2.0.1/

https://github.com/dakk/caml_qiskit/

Wax 0.1.0: WebAssembly の Rust 風構文

Jérôme Vouillon が発表しました

WebAssembly に馴染みやすい式指向の構文を提供するツールチェーン Wax の最初のリリースをお知らせします。OCaml で書かれており、0.1.0 時点で wax は opam リポジトリで入手可能です:

opam install wax

開発の動機。 wasm_of_ocaml ランタイムは現在、約 23,000 行の手書き WebAssembly テキスト(WAT、WebAssembly の公式な人間可読テキスト表現)で構成されています。これは維持するには非常に大量のコードです。WAT は読みやすいものの非常に冗長で、S 式ベースで構築されており、変数アクセスから型まですべてが明示的です。私は Tarides でこの問題に対処するために Wax を開発しており、そのランタイムに対して、まったく同じバイトコードにコンパイルしながらも、より簡潔で型チェックされた構文を提供します。

WebAssembly テキスト形式はすべてを明示します:

(func $add (param $x i32) (param $y i32) (result i32)
  (i32.add (local.get $x) (local.get $y)))

Wax はプログラミング言語のように読めます:

fn add(x: i32, y: i32) -> i32 {
    x + y;
}

どちらも同一のバイトコードにコンパイルされます。その恩恵はプログラムが大きくなるほど拡大します。構造体型、nullable 参照、キャスト、ループは、等価な WAT が肥大化するのに対して、Wax では読みやすいまま保たれます:

type list = { value: i32, next: &?list };

#[export = "sum"]
fn sum(l: &?list) -> i32 {
    let total: i32 = 0;
    while l is &list {
        total += l!.value;
        l = l!.next;
    }
    total;
}

いくつかのハイライト:

  • 全方向対応。 waxwatwasm 間の9つすべての変換が動作します。任意の .wasm バイナリを読みやすい Wax に逆コンパイルすることも含まれます。
  • WebAssembly 3.0 完全対応。 ガベージコレクション、例外処理、末尾呼び出し、複数の64ビットメモリ、SIMD、さらにスタックスイッチング、スレッド、広算術、ブランチヒントに対応。
  • 本格的な型チェッカー。 出力が生成される前にエラーを検出し、ソースコンテキストとともに報告します。
  • 単なるコンパイラではなくツールチェーン。 フォーマッタ、バリデータ、設定可能な lint、条件付きコンパイル、ソースマップ、VS Code 拡張と tree-sitter 文法を備えた言語サーバー(LSP)。

インストール不要でブラウザで試せるプレイグラウンドで Wax を入力すると WAT と診断をリアルタイムで確認できます。

これは初期の実験的リリースです。 構文とツールチェーンはまだ進化中であり、粗削りな部分も予想されます。だからこそ今公開しています。構文、使い勝手、不足している機能、障害になるものなど、ぜひフィードバックをお寄せください。バグ報告や感想もすべて歓迎します。

Cascade: OCaml による型付き CSS ツールキット

Thomas Gazagnaire が発表しました

opam(opam install cascade)および brew(brew install samoht/tap/cascade)で入手可能な cascade の最初のリリースをお知らせします。

Cascade はライブラリです:

  • CSS ドキュメントを表現するための型付き AST
  • その AST 上の(カスケード順を保持する)変換のセット。これには、(葉)値のミニフィケーション(色空間座標でのたくさんの楽しみを含む)、最適化(優れた SatCSS 論文 に基づくセマンティクス保存ノード書き換え)、セマンティクス保存の正規化、その他 が含まれます
  • それら(オプションで正規化された)AST を比較する diff 関数
  • CSS 値を HTML ドキュメントにスタイル属性として適用し、カスケード順を保持する apply 関数

しかし cascade は CLI ツールでもあります!これらの操作はすべてサブコマンドとして利用できます(cascade fmtcascade diffcascade apply)。

詳細はこちらでご覧いただけます: https://gazagnaire.org/blog/2026-07-22-cascade-minify.html

issue の報告やアイデアの議論は GH トラッカー でお気軽にどうぞ。

Dune 3.24

このスレッドを継続して、Ali Caglayan が発表しました

Dune チームは dune 3.24.1 のリリースをお知らせします。

すべての新機能と修正、およびそれを可能にしてくださったコントリビューターへの謝辞については、完全な変更履歴をご覧ください。コントリビューターの皆さん、ありがとうございました!

このリリースで問題が発生した場合は、イシュートラッカーにご報告ください。

ocaml-wire: EverParse 3D 出力対応バイナリワイヤーフォーマット DSL

このスレッドを継続して、Thomas Gazagnaire が発表しました

opam にて ocaml-wire リリース 1.1.0 をお知らせします!

このリリースではいくつかの改善が行われています:

  • 生成された正式検証済みパーサーがクロスコンパイル可能になりました(unikernel への組み込みのための ocaml-freestanding へのコンパイルを含む)。インストールされた C ヘッダーもより小さくなり、安全なエントリポイントのみを公開します。
  • ocaml-wire は uint32 フィールドに [https://github.com/mirage/optint] を使用するようになりました。これにより、生成された OCaml パーサー/シリアライザーを js_of_ocaml/wasm_of_ocaml 上で安全に実行できます(例えば、TCP シーケンス番号を安全にエンコードして wasm でフル TCP/IP スタックを動かす場合などに有用です)。
  • パースエラー(OCaml 側)がより精確になり、コーデック、フィールド名、ストリーム位置が表示されるようになりました。
  • コーデックがドメイン間で安全に共有できるようになりました(各ドメインが独自のスクラッチバッファを持ちます)

完全な変更履歴はこちらでご覧いただけます。

Eio 1.4(エフェクトベース並行処理ライブラリ)

Thomas Leonard が発表しました

Eio 1.4 がリリースされ、opam-repository から入手可能になりました。

Eio について

Eio は OCaml 5 向けにエフェクトベースのダイレクトスタイル IO スタックを提供します。例えば、Eio を使用してファイルの読み書き、ネットワーク接続の作成、CPU 集約計算の実行などを、複数の操作を同時に行いながら実行できます。使いやすく、セキュアで、ドキュメントが充実しており、高速であることを目指しています。汎用のクロスプラットフォーム API は、異なるプラットフォーム向けに最適化されたバックエンドによって実装されています。

Eio は Lwt や Async と同様の機能を実装していますが、モナディック並行処理ではなくエフェクトを使用します。Eio と Lwt のライブラリは lwt_eio を使って自由に混在させることができ、プログラムを段階的に Eio へ移行することが可能です。

チュートリアルについては Eio README をご覧ください。

1.4 リリースのハイライト

  • Eio.Net がソケットオプション(標準の Unix オプションとそれ以外の多数、例えば TCP_KEEPINTVL など)をサポートしました。
  • Eio.Path でより多くのファイルシステム操作(chmodchownread_dir_entrieswith_dir_entries)が利用可能になりました。これらはすべて最新の *at システムコールと RESOLVE_BENEATH を使用しており、パス操作をサブツリーに限定しやすくなっています(Path.with_subtree を参照)。
  • Eio_unix.Pty が疑似端末サポートを追加しました(ターミナルエミュレーター、SSH サーバーなどの実装向け)。

Eio_linux バックエンド(従来の POSIX システムコールではなく io_uring を使用)でも statxfallocatefdatasync がサポートされました。

重要なバグ修正として、特定のデバイスで macOS の poll が失敗する問題の回避策、0 長だが空でないファイル(Linux の /proc 以下に存在)での Path.load の動作修正、FIFO(名前付きパイプ)でのブロッキング動作の改善、FD が読み書き両方に使用された場合に Windows が一部のケースで CPU を 100% 使用する問題の修正が含まれます。

注意: Eio.Net.getaddrinfo は以前、エラー時に [] を返していましたが(Unix.getaddrinfo に倣って)、実際のエラーの詳細を含む例外を送出するようになりました。

変更の完全なリストはリリースノートをご覧ください。

ocaml-sbom 0.1.0

Nicolas Ojeda Bar が発表しました

OPAM ベースのプロジェクト向けにソフトウェア部品表(SBOM)を生成するツール ocaml-sbom の最初の公開リリースをお知らせします。

ソフトウェア部品表は、コンプライアンスとセキュリティが優先されるエンタープライズや規制環境においてますます重要な役割を担っています。これらのレポートを手動で作成するのは現実的ではないため、自動化されたソリューションが必要でした。ocaml-sbom はまさにそれを提供します。

ocaml-sbom は @mjambon が LexiFi との協力のもとで開発しました。未充足のニーズを満たし、より広い OCaml コミュニティに役立つと信じているため、オープンソースとして公開します。

https://github.com/LexiFi/ocaml-sbom/releases

このツールは実行時に opam を呼び出し、OPAM 2.2.0 以降が必要です。インストール方法:

$ opam install ocaml-sbom

プロジェクトの SBOM 生成は2ステップのプロセスです。まず、ocaml-sbom の内部フォーマットで SBOM を生成します(これが時間のかかるステップです)。*.opam ファイルがあるディレクトリからコマンドを実行してください:

$ ocaml-sbom -o myproject.sbom

次に、SBOM をサポートされている標準フォーマットの1つにエクスポートします(このステップは素早く完了します)。現在、CycloneDX 1.6、SPDX 2.3.1、SPDX 3.0 がサポートされています。デフォルトでは ocaml-sbom は CycloneDX にエクスポートします:

$ ocaml-sbom export myproject.sbom -o myproject.cdx

詳細については README または --help 出力をご覧ください。

注意: これは初期リリースであり、そのように扱ってください。ツールはすでに有用であり大きな可能性を示していると考えていますが、本番環境対応と見なす前に実世界での検証がまだ必要です。フィードバックを大歓迎します。

最後に、このツールの開発に携わっていただいた @mjambon に感謝します。

SBOM ライフをお楽しみください!

よろしくお願いします、 Nicolas

Union-find-lattice ライブラリ

Dorian Lesbre が発表しました

union-find-lattice v0.1.0 を opam にリリースしましたのでお知らせします!このライブラリは、2つの union-find インスタンスの join、meet、包含を高速に計算する操作(すなわち、表現される同値関係の連言、選言、含意にそれぞれ対応)を備えた永続的 union-find を提供します。

これらの新しいアルゴリズムは、@Matthieu_Lemerre と共同執筆した SAS 26 論文 A Lattice of Union-Finds で詳しく解説しています。このデータ構造をプログラム解析における変数間の関係表現に使用することを期待していますが、他のユースケースも当然あり得ます。

ライブラリのコアシグネチャは次の functor です:

module UF(Node: NODE) = sig
  type t

  (** ==== Standard union-find operations ========= *)
  val make: int -> t
  val find: t -> Node.t
  val union: t -> Node.t -> Node.t -> t
  (** persistent union-find: union does not modify its argument *)

  val check_related: t -> Node.t -> Node.t -> bool
  (** [check_related t a b] is true IFF [a] and [b] are in the same class *)

  (** ==== Lattice operations ====================== *)
  (** Lattice operands run in O(d*alpha(n)) where 
      - n is the number of nodes
      - d is the difference between both arguments (nodes with different parents)
      - alpha is the inverse Ackermann function *)


  val join: t -> t -> t
  (** [check_related (join u v) a v <=> check_related u a b && check_related v a b] *)

  val meet: t -> t -> t
  (** [check_related (meet u v) a v] is true IFF 
      [a] and [b] are related in the transitive closure of [u] and [v], i.e.
      there exists c1 .. cn, [check_related u a c1 && check_related v c1 c2 && .. && check_related u cn b] *)

  val incl: t -> t -> bool
  (** [incl uf_a uf_b] is lattice inclusion, [uf_a <= uf_b], i.e.
      forall [x] [y], if [check_related uf_b x y] then [check_related uf_a x y] *)
end

このシグネチャの複数の実装を提供しています:

  • 内部的には3種類の基礎データ構造から選択できます: 標準配列(明示的なコピーあり)、永続配列(配列と同速度だがすべてのバージョン切り替えにコストがかかる)、または Patricia treespatricia-tree ライブラリ を使用し、真にイミュータブルだがすべての操作に log(ユニオン数) のコストが加わる)。
  • ラベル付き union-find(親エッジにラベルのグループを付与する拡張で、定数による等価性などより複雑な関係を表現できます。PLDI 25 論文 Relational Abstractions based on Labeled Union-Find を参照)と値付き union-find(各クラスが一意の関連値を持ち、値もラティス構造を持つ)のバリアントも含まれています。

IFS フラクタルと OCaml で Claude の創造性に挑む

Cédric が発表しました

こんにちは、

2010年、関数型プログラミングの授業中に、graphics ライブラリとカオスゲームを使って反復関数系(IFS)でフラクタルを描く小さな OCaml プログラムを書きました。それは私の最も古い生きているリポジトリの一つで、ほとんど変化していませんでした:

https://github.com/cedricbonhomme/iterated-function-systems

各フラクタルは単なるレコードです: 累積重みを持つアフィン変換のリストとビューポート。カオスゲームが残りを担います。Barnsley シダは24個の係数でできています。

先週末、それを引っ張り出して、修正やリファクタリングではなく新しい IFS フラクタルを考案するよう Claude Fable 5 に依頼するという実験をしました。ブログに全経緯を書きましたが、ここで興味を持っていただけそうな部分をご紹介します:

  • リポジトリのフラクタルは11個から16個に増えました。私が最も気に入った新参者は lace(Queen Anne's lace、野生ニンジン)です: 5つの変換が植物全体の縮小回転コピーをドームの縁に配置し、6番目が全体を茎に押しつぶす、傘の傘です。合計36個の数:

    let lace =
    { po = {x= -0.90 ; y= -0.55};
    sz = {x= 1.80 ; y= 2.00};
    lt = [{pb= 0.18; kf= [| 0.2649; 0.1408; -0.7048; -0.1408; 0.2649; 0.38|]};
    {pb= 0.36; kf= [| 0.3493; 0.0871; -0.4302; -0.0871; 0.3493; 0.5013|]};
    {pb= 0.54; kf= [| 0.38; 0.00; 0.00; 0.00; 0.38; 0.55|]};
    {pb= 0.72; kf= [| 0.3493; -0.0871; 0.4302; 0.0871; 0.3493; 0.5013|]};
    {pb= 0.90; kf= [| 0.2649; -0.1408; 0.7048; 0.1408; 0.2649; 0.38|]};
    {pb= 1.00; kf= [| 0.02; 0.00; 0.00; 0.00; 0.55; 0.00|]}]};;
    
  • 2つの変換だけで構築されたひまわり(フィロタクシスに基づく): 一方は黄金角(137.508°)で回転しながら中心に向かって縮小し、もう一方は縁に蕾を植えます。黄金角は「最も無理数的な」角度であるため、蕾は実際の種の頭のようにディスクを均一に埋めます。
  • 楽しい否定的な結果: アイスランドの印章 vegvísir を描くよう依頼しました。厳密には IFS でそれを描くことはできません。アトラクターは単一の自己相似集合であるのに対し、実際の記号の8本の腕にはそれぞれ異なるルーンがあるからです。回避策は非収縮写像を使うことでした。スケール 1.0 での純粋な45°回転で、それ自体は何も描かず、ただポイントを8本の腕に分散させます。他の変換は腕を1本だけ記述すればよいわけです。対称性写像としてこのような測度保存写像を使うことは考えたことがありませんでした。
  • 繰り返し行き着く結論: 植物は単純な局所ルールを繰り返すことで成長するため、その形が文字通りアトラクターになるので IFS との相性が良いのです。設計されたシンボルはそうではありません。誰も成長させていないからです。

すべての画像入りの解説はこちら:

https://www.cedricbonhomme.org/2026/07/27/challenging-claude-with-ifs-fractals/

試してみたい方: opam install graphics ocamlfind を実行後、トップレベルで #use "ifs_fractals.ml";; の後 draw lace 300000;;

IFS で非収縮対称性写像を使った例を他にご存知の方、または追加する価値のある好きなアトラクターをお持ちの方がいれば、ぜひ教えてください。OCaml のコースでこういったおもちゃを書いた記憶のある方の話もぜひ聞かせてください。プルリクエストはもちろん歓迎です!

82d90e9430e26168eb5407d9df00211ad6bbe08a.png

Simple_http 1.1 リリース

Christophe Raffalli が発表しました

Camlers の皆さん、

Simple_httpd 1.1 のお知らせ

パフォーマンスシンプルさ本番利用を強く重視して設計された、OCaml 5 向けの軽量かつ機能豊富な HTTP/HTTPS サーバーライブラリ Simple_httpd 1.1 のリリースをお知らせします。

OCaml 5 のドメインとエフェクトを試すための tiny_httpd のフォークとして始まった Simple_httpd は、実際のウェブサイトのホスティングに使われる堅牢なサーバーへと成熟しました。

ドキュメント: https://raffalli.eu/simple_httpd/simple_httpd/index.html (simple_httpd で提供されており、優れたベンチマークも掲載されています)

Github: https://github.com/craff/simple_httpd

ハイライト

  • 非常に高速: Linux の epolleventfd、OCaml 5 の ドメインエフェクトを中心に構築され、レイテンシとスループットに細心の注意を払っています。ベンチマークでは多くのワークロードで従来のウェブサーバーと競合するか上回る優れたパフォーマンスを示しています。
  • 本番対応済み: サーバーは数ヶ月間実際のウェブサイトを安定して運用しており、日常的な使用でのパフォーマンスと安定性が実証されています。
  • コンパイル済みサーバーサイドテンプレート: .chaml ファイルは PHP の OCaml 版を提供します。ただしテンプレートは解釈ではなくコンパイルされるため、柔軟性とネイティブパフォーマンスを両立します。PHP よりもはるかに高速です。
  • 柔軟なルーティング: リクエストはパスと HTTP メソッドだけでなく、ホスト名、アドレス、ポートによっても振り分けることができ、バーチャルホスティングが簡単になります。
  • 静的リソースと組み込みリソース: ファイルシステムから直接ファイルを配信するか、vfs_pack を使って実行ファイルにパッケージングします。どちらの場合も圧縮がサポートされており、小さなファイルは後者の場合メモリにキャッシュされることもあります。
  • 組み込みモニタリング: 統合ステータスページで CPU 使用率、メモリ消費量、アクティブ接続数、ファイルディスクリプタ、ログを確認でき、デプロイとデバッグが容易になります。サーバー送信イベントと WebSocket もアプリケーションとして完全な機能を持つターミナルとともに提供しています。
  • 最新の HTTP 1.1 機能: HTTPS、クッキー、認証、レベル付きロギング、Caqti によるオプションのデータベース統合がすぐに利用できます。さらに多くの機能(アンチアタック対策など)を予定しています!

Simple_httpd はその元々の哲学を忠実に守っています: 使いやすく拡張しやすく、しかし要求の厳しい本番アプリケーションに十分な高速さを持つウェブサーバーを提供します。

フィードバック、バグ報告、コントリビューションを大歓迎します!

過去の CWN

CWN を見逃した場合は、メッセージを送っていただければメールでお送りします。また、アーカイブRSS フィードもご覧いただけます。

毎週メールで受け取りたい場合は、caml-list を購読してください。