OCaml Weekly News

先週号 上へ 次週号

こんにちは

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

Table of Contents

http-date v0.2 — OCaml向けゼロ依存HTTPDateパーシング

Bikal Lem が発表しました

RFC 9110 準拠の OCaml 向け HTTP datetime デコーダ/エンコーダである http-date の v0.2 をリリースしました。

これは v0.1 からの大規模な書き直しです。変更点は以下の通りです:

ゼロ依存 — ocamllex/menhir パーサーを手書き実装に置き換え、ptime への依存を完全に削除しました。このライブラリは ocaml と dune のみを必要とします。

新しい型安全な API — パース結果はフォーマット(IMF、RFC850、`ASCTIME)でタグ付けされた多相バリアントになり、どの HTTP date フォーマットがパースされたかが常に分かります。dayname、date、time、datetime 型はすべてパブリック API に公開されています。

本格的なテスト — alcobar によるプロパティベーステストと AFL ファジングテストインフラを追加し、手書きパーサーへの信頼性を高めました。

OCaml で HTTP ヘッダーを扱っている方はぜひ試してみてください:

opam install http-date

https://github.com/bikallem/http-date

Caqti 2.3.0

Petter A. Urkedal が発表しました

Caqti 2.3.0 のリリースをお知らせします。

TL;DR: リンク行に caqti.classic を追加することを検討してください(このバージョンから利用可能)。現時点では caqti ライブラリを再エクスポートするだけですが、Caqti 3 では段階的な移行を可能にするため Caqti 2 API の互換レイヤーに置き換えられる予定です。

リリースノート

このリリースの新機能の一部は、まだ不安定な caqti.template ライブラリを通じてのみアクセス可能であることに注意してください。これは近い将来、Caqti 3 API の一部として安定化される予定です。モジュール名の変更により、caqti.template に切り替えても将来の互換性は保証されません。代わりに、Caqti 3 への移行を容易にするため、新しい caqti.classic を依存関係に追加することをお勧めします。

  • caqti ライブラリのエイリアスとして caqti.classic を追加しました。Caqti 3 がリリースされる際には、現在の Caqti 2 API との互換性を提供するライブラリに変換されます。段階的な移行を可能にするため、2 つの API を並行して使用できます。
  • caqti.template の MariaDB 向けダイアレクト記述子がサーバーバージョンを提供するようになりました。
  • caqti.template ライブラリに Query.parensQuery.litfQuery.varsRow_type.fields を追加しました。
  • パラメトリック型をアプリカティブにインスタンス化できるよう、行型を作成するためのインターフェースを改訂しました。この変更以前は、パラメトリック型を表す関数を適用するたびに、同じ型パラメータ引数に適用されても新しい型 ID が生成されていました。このインターフェースの中心は Caqti_template.Constructor_type モジュールです。
  • リクエストテンプレートに渡されるクエリ関数がメモ化されるようになり、ダイアレクトごとに一度だけ呼び出されます。これは最適化を意図したものですが、ここで副作用を避けるのは依然として良い実践です。
  • 新しい関数 Query.with_pos_of により、クエリジェネレーターが構文ツリーにソース位置を追加できるようになりました。enable_query_annotations が設定されている場合、これはクエリ文字列に SQL コメントとして出力されます。クエリがアプリケーションコードの異なる部分から組み立てられる場合のデバッグが容易になります。
  • まだ不安定な caqti.template ライブラリが、1 つのリクエストテンプレートで複数のステートメントをサポートするようになりました。許可されている場合は、1 つのクエリとして積極的に送信されます。これはまだ実験的です。
  • sqlite3 の shim ルールのパッケージスコープを修正しました(#133、mefyl による)。
  • SQLite3 ドライバーのエラー分類を修正しました(#132)。
  • PostgreSQL の接続断後の再接続を修正しました。

layoutz 0.1.0 🪶 - OCaml アプリ向けゼロ依存 Elm スタイル TUI とターミナルプロット

Matthieu Court が発表しました

皆さん、こんにちは!前回のフィードバックありがとうございます。layoutz に Elm スタイルの TUI ランタイムが追加されました((素晴らしい)Minttea とは精神的にかなり異なります)。また、API が整理され、ターミナルプロットの組み込み機能も追加されました。

フィードバックをお待ちしています!ありがとうございます。

Dune 3.22

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

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

これはバグ修正からなるパッチリリースです。すべての変更点と貢献者への帰属については完全なチェンジログをご覧ください。貢献者の皆さん、ありがとうございます!

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

修正内容

  • --diff-command の動作を 3.21 の挙動に戻しました。存在しないファイルは /dev/null に置き換えられるのではなく、このコマンドに渡されるようになりました(#14098、13891 を修正、@rgrinberg

ptt、unikernel としてのメーリングリストシステム

Calascibetta Romain が発表しました

こんにちは!OCaml unikernel によって完全に動作する新しいメーリングリストを立ち上げました。ウェブサイト(それ自体が unikernel です)は https://mailingl.st にあります。SMTP 関連の unikernel の開発とデプロイに興味がある方は、ptt-subscribe@mailingl.st にメールを送ることで ptt@mailingl.st を購読できます。

注意:これは現時点では公開テストメーリングリストです。長期的には、ptt プロジェクトに焦点を当てる予定です。

SMTP プロトコル:長く曲がりくねった道

  • 始まりはメール

    すべてはMr.MIMEから始まりました。これはメールのデコードとエンコードのためのライブラリです。関連する RFC の集大成ですが、さらに重要なのは、IEEE、EnronKVM、そして最近ではcaml-listからの実際のメールでバトルテスト済みであることです。

    この作業により、Hamletも構築できました。これはファザーを使って生成された有効なランダムメールのデータベースです。

    内部では、Mr.MIME はメール内で見られる最も一般的な形式の値をデコードするためにunstrctrdに依存しており(rosettaによる国際化サポートあり)、SMTP の制約と(コメント)折り返し空白の処理を尊重しながらメールをエンコードするためにprettymを使用しています。

  • 次にプロトコル

    次にcolombeが来ました。これは SMTP プロトコルの OCaml 実装です。STARTTLS のサポートにはocaml-tlsを使用しています。

    プロトコルは「シンプル」とされていますが(インターネットは常に驚きをもたらしますが)、最初から colombe はスケジューラやネットワーク層から独立して設計されました。そのため、unikernel に摩擦なく組み込めます。

  • 最後に、正当性

    これらのコアコンポーネントの上に、いくつかのメールセキュリティレイヤーを構築しました:

    • ocaml-dkim はストリーミング方式でメールの完全性の署名と検証を処理します(検証と署名生成の両方)
    • uspf は送信者の正当性を検証し、私たちのほとんどのライブラリと同様に、スケジューラや DNS 実装から独立しています
    • ocaml-dmarc は DKIM と SPF の検証を自動化し、結果でメールにスタンプを押し、ドメイン名全体のアライメントをチェックします
    • [ocaml-arc](github.com/robur-coop/ocaml-arc) はメールが複数の SMTP サーバーを通過する際(メーリングリストでまさに起こることです)の信頼チェーンを完成させるためにメールを検証・署名します

    これらすべてについての短い記事をこちらに書きました。

すべて unikernel の形で

最初の実験で、MirageOS unikernel でメールを処理できることがすでに示されていました。しかし、メモリリーク、セキュリティの脆弱性、ビルドの問題など、実際の制限にも直面しました。

そこでゼロから再スタートし、OCaml 5 とエフェクトを完全に活用する機会としました。主要な部分を再構築しました:

  • 新しいエフェクトベースのスケジューラ:Miou/Mkernel
  • より完全な TCP/IP スタック:Mnet
  • 新しい FAT32 ファイルシステム:Mfat

ptt はこの新しいスタック上に構築されており、今のところメモリリークは観察されていません(メモリ使用量のトレースにmkernel-memtraceを使用し、memtrace-viewerで閲覧可能)。mirage-tcpip に関連する CVE は mnet の開発中に考慮され、ビルドの仕組みもはるかにシンプルになりました。GitHub action でビルドし、実際に unikernel を実行してテストできます。mnet で確認できます。

このアプローチを使った他の unikernel も利用可能です。興味がある方は、OCaml で unikernel を作成するこのチュートリアルをご覧ください。

デプロイ

ptt はデプロイの問題にも取り組んでいます。ptt の「ステートレス」な側面を紹介する記事があります。また、セキュアな unikernel オーケストレーター[Albatross](github.com/robur-coop/albatross)と、unikernel をデプロイするための web インターフェース(それ自体が unikernel です)Mollymawkを(再)紹介したいと思います。

より広く言えば、これが私たちの協同組合が取り組んでいることです。開発者であれデプロイ者であれ、ユーザーエクスペリエンスを向上させることを本当に望んでいます。私たちの unikernel を実際に開発・デプロイ・使用することが、より広く採用してもらうための唯一の方法だと信じています。ぜひこれらのプロジェクトもフォローしてください!

使い方

この過程で、メールのライフサイクルのすべての段階を追跡できるツールを持つことが非常に役立つことがわかりました。それがblazeが生まれた経緯です:メール処理のためのスイスアーミーナイフです。

まだ実験的ですが、すでに以下のことができます:

  • アーカイブシステムの使用(生成、読み取り、インデックス作成など)
  • mboxmaildir などの他のアーカイブの処理
  • POP3 プロトコルによる通信
  • メールの署名と検証(DKIM と ARC)
  • コマンドラインからのメール構築
  • メールの送信
  • 小さなローカル SMTP サーバーの実行

blaze はライブラリ API を反復し、実装を検証する方法です。実験的ですが、徐々に完全なメールクライアントへと成長しています。

  • アーカイブとインデックス作成

    文書(メールなど)から語幹を抽出し、自然言語の複雑さなしに分析可能なものを得るためにトークン化するstemプロジェクトも紹介したいと思います。このトークン化が私たちの小さなbm25検索エンジンを動かしています。結果はこちらで確認できます。

    これはまた、unikernel として利用可能な caml-list 検索エンジンblameを動かすものでもあります。https://caml-list.robur.coop で試すことができます(vifによって動作)。

    検索以外にも、Message-ID によるメールインデックス作成があります。そのためにbancosを構築しました:OCaml の永続的な基数木で、並列アクセスをサポートします!詳細はこちら

    最後に、インデックスシステムは PACKv2 フォーマット(Git がオブジェクトを格納するために使うものと同じ)を使用しており、cartonライブラリによって実装されています。ocaml-gitプロジェクトを通じてその安定性が証明されたため、メールのアーカイブに再利用することにしました(public-inboxが行ったのと同様ですが、異なる形で)。

結論

このすべての作業のおかげで、OCaml にはメール関連プロジェクトの充実したセットが整いました。この旅は 2016 年に始まり、まだ長い道のりがあります。私たちは常に堅牢でバトルテスト済みのソリューションを提供することを目指しているからです。他の言語のいくつかの実装とは異なり(Rust コミュニティの人々とは議論中ですが)、私たちの実装は実際に標準に準拠しています!

大したことではないように見えるかもしれませんし、単にメールを交換するだけでは大きな違いは感じられないかもしれませんが、このアプローチがより良いインターネットへの道を開くと信じています。unikernel の形で、これは通信手段の真の取り戻しを表しています!

Mollymawk と Albatross によるすべての仮想マシンのオーケストレーション

Hannes Mehnert が発表しました

皆さんへ、

MirageOS unikernel でない仮想マシンをサポートするためにAlbatrossMollymawkの実装とデプロイを完了しました。

理由はシンプルです:メトリクス、コンソール出力、Web UI によるデプロイ、マルチテナント、起動依存関係、失敗時の再起動など、多くの優れた機能を組み込んだため、MirageOS 以外の仮想マシンも同じ仕組みでデプロイし、あちこちにコードを複製しないようにしたかったのです。

現時点では FreeBSD BHyve のみのサポートですが、他の仮想化技術に興味がある方はお知らせください。優先して対応します!

スクリーンショット付きの短いブログ記事も書きました:https://blog.robur.coop/articles/mollymawk-other.html

OUPS ミートアップ 2026年4月

ancolie が発表しました

次回の OUPS ミートアップは2026年4月29日(水曜日)に開催されます。パリの45 rue d'Ulmにて18:30から始まります。Rataud 講堂での開催となります。

:warning: いつものJussieuではなく、ENS Ulm での開催です!場所に不慣れな方は建物の地図をご覧ください。

ピザの注文数を把握するため、できるだけ早くmeetupで登録してください。

詳細はOUPS のウェブサイトをご確認ください。

また、運営チームがOCaml Zulipに移行したことをお知らせします。トークを提案したい場合はそちらからご連絡ください。

今回は以下のトークが予定されています:

When Turing machines meet GADTs – Florian Angeletti

GADT のパターンマッチングで明示的な到達不可能節を書く必要があるのはなぜか、不思議に思ったことはありませんか?あるいは、OCaml の型の中にどれほどの計算を忍び込ませられるか?

このトークでは、GADT、パターンマッチの網羅性チェックの OCaml コンパイラ実装、そしてどうすれば型検査器を騙して BB(3) チャンピオンを自分で見つけさせられるかについて深く掘り下げてこれらの疑問に答えます。

Extending OCaml's pattern matching – Yanni Lefki

パターンマッチングは数十年にわたって研究され、広範な研究と多くの拡張の対象となってきました。それでも、Rust の if-let 構文などの最近の言語機能や、Cheng and Parreaux(OOPSLA 2024)などの最近の研究は、まだ改善の余地があることを示唆しています。我々は、パターンマッチングを条件式の拡張形式と統合するシンプルなアプローチを提案します。

特に、我々のプロトタイプはバインディングブール式を導入します。これにより、パターンガード内、if 条件内(その後 then ブランチで使用可能)、while 条件内(ループ本体で使用可能)で変数をバインドできます。また、スマートデコンストラクタ(スマートコンストラクタの双対)の定義を可能にする Haskell スタイルのビューも組み込まれています。

このトークでは、評価規則、型付け規則、シンプルなコンパイルスキームを備えた ML 風の言語を紹介します。最後に実装のデモを行います:拡張された ML 構文を解析し、(非常に直感的な!)規則に従ってプログラムを型チェックし、(最適化なしの)変換によって正しい OCaml AST に変換する OCaml PPX プロトタイプです。

トークの後、OCaml Software Foundation提供のピザがあり、その後はいつものように近くのパブに移動する予定です。

Stk 0.6 リリース

Zoggy が発表しました

こんにちは、

Stk は SDL ベースのグラフィカルユーザーインターフェースツールキットです。インターフェースは Gtk にインスパイアされており、Lablgtk を使用している開発者には馴染みやすいものになっています。

Stk 0.6 が利用可能になりました。こちらに記載されている変更点の中でも、このリリースではツールチップユーザー設定の処理(ユーザー定義のテーマを含む)が導入されています。

stk* パッケージは私の個人用 opam リポジトリから利用可能です。

opam 2.5.1

Kate が発表しました

皆さん、こんにちは、

opam 2.5.1 が利用可能になりました。このリリースはセキュリティ上の問題(OSEC-2026-03)とその他の軽微な問題を修正しています。この問題を報告してくれた @andrew に感謝します。

できるだけ早く 2.5.1 にアップグレードすることをお勧めします。

お使いのディストリビューションの古い opam パッケージに依存している場合、Debian Stable などのディストリビューションはすでに関連する修正のバックポートを開始しており、パッチ適用済みバージョンがすぐに利用可能になるはずです。

関連リンクと詳細についてはブログ記事をご覧ください。

試してみましょう!

アップグレードの手順は変わっていません:

Unix システムの場合

bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) –version 2.5.1"

Windows システムの PowerShell から

Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.5.1"

問題が発生した場合はバグトラッカーに報告してください。

Happy hacking,

<> <> The opam team <> <> :camel:

OCaml.jp の再始動:OCaml Japan ユーザーグループ

mt_caret が発表しました

OCaml コミュニティの皆さんへ、

OCaml.jphttps://ocaml.jp/)、OCaml Japan ユーザーグループの再スタートをお知らせします!

私たちの目標は、日本の OCaml ユーザーを一堂に集めることで、日本における OCaml コミュニティを成長・活性化させ、OCaml の普及と深い関わりを促進することです。

現在の活動

すでにいくつかの取り組みを開始しています:

  • OCaml Weekly News - 日本語版https://ocaml.jp/cwn-ja/ で OCaml Weekly News の日本語訳を公開しています。日本語話者の方々が OCaml エコシステムの最新情報をより簡単に把握できるようにするためのものです。
  • 東京での OCaml ミートアップ(2026年8月):今年8月に東京で OCaml ミートアップを開催する準備をしています。10年以上ぶりの開催です!詳細は近日公開予定です。ご期待ください!

参加しましょう!

主な連絡手段として Discord を使用しています。日本在住の方、世界中の日本語話者 OCaml 愛好家の方、または単純に日本の OCaml コミュニティとつながりたい方、ぜひご参加ください!

Discord への参加はこちらのリンクから:https://discord.gg/qQTbny8KF4

一緒に活気ある日本の OCaml コミュニティを築いていきましょう。よろしくお願いします!

GitHub でのコードナビゲーションと検索

Pieter Goetschalckx が発表しました

GitHub がコードナビゲーションコード検索tree-sitter-ocamlを使用するようになりました。

  • コードハイライトがより正確になり(古い TextMate グラマーと比較して)、OCaml 5.4 までのすべての機能をサポートしています。
  • 各ファイルにシンボルサイドパネルが表示されます。
  • シンボルをクリックして定義と参照を見つけられます。
  • 定義を検索できます。
  • ネストされた構造のサポートも限定的に提供されています。

数ヶ月前に有効化されていましたが、ここに投稿するのを忘れていました。

コードナビゲーションは常に100%正確ではありませんが、十分役立つ精度です。誤ってハイライトされたコードに問題が見つかった場合、tree-sitter-ocaml の問題である可能性があります。

OCaml 製 SIP サーバー、gRPC、HTTP/2 ライブラリのメンテナー募集

Wojtek Czekalski が発表しました

dialo で OCaml から移行するにあたり、構築したライブラリを適切にメンテナンスしてくれる方々に寄付したいと思います。OCaml を使って高性能な電話システムを構築しましたが、小さなチームでは維持しなければならないソフトウェアが多すぎるという状況になりました。

最初は OCaml で SIP サーバー実装を構築しました。これは完璧な選択でした。次に、言語に依存しない方法でシステムの他の部分に接続する必要がありました。gRPC を選択したところ、そこで困難が始まりました。

小規模ではh2の上に構築した自前のバグのある gRPC 実装で十分でした。その後スケールアップを始め、同時に OCaml 5.0 への移行も行いました。これらの組み合わせにより:

  1. メモリ管理に関するパフォーマンスの低下が 5.0 で発生しました。アプリコード内、SIP スタック内、h2 内のいずれにおいても。
  2. エラーやエッジケースをより適切に処理するために、より堅牢な gRPC 実装が必要になりました。

結果として:

  1. http2 の独自実装を作成しました
  2. スコープを限定するために eio 専用で gRPC ライブラリを書き直し、適切なコード生成と堅牢性を実現しました

そして 2025 年後半に SIP サーバーに新機能を追加する必要が生じ、何かが心の中で壊れました。SIP サーバーは 3.5 年間でかなりのレガシーコードを蓄積していたため、一部を書き直したかったのです。エフェクトを中心とした新しいアーキテクチャを構築することに非常に興奮しましたが、ユーザー空間エフェクトと並行ライブラリがうまく連携しないことが判明しました。コールバックがスコープを失うからです(当然ですが)。それが最後の一押しでした。

Rust と Go でサービスを書き直す 1 週間のスプリントを 2 回実施することにしました。最終的に Rust を選びました。まだ OCaml が恋しいですが、独自の http2/grpc/sip スタックを実装・維持する必要がなくなったのは清々しいです。

そういうわけで、ここに来ました。OCaml をスタックから段階的に削除しているため、以下を寄付したいと思います:

  • ocaml-grpc - 新しいコードは dialo ブランチにあります。現時点では eio のみ対応で、本番でバトルテスト済みです。いくつかのバグはありますが、少なく、かなり安定しています。
  • haha (http2) - 全体的に良いですが、改善の余地があります。ファイバーをキャンセルしすぎており、大幅に高速化できる簡単な改善点があります。
  • SIP スタック — 現時点ではオープンソースではありませんが、適切な人またはチームにはソースコードを共有する用意があります。

私または @adamchol に DM してください。詳細についてお気軽にお聞きください。

ppx_mixins: より洗練された mixin 構文

Sacha Ayoun が発表しました

こんにちは、

ppx_mixins という小さな ppx を作成しました。これを使うと:

type u [@@mixins Map.OrderedType + Printable]

と書けるようになり、以下に脱糖されます:

type u
include Map.OrderedType with type t := u
include Printable with type t := u

たいしたことではありませんが、「mixin」パターンをよく使うコードベースでの可読性が向上します。

型シグネチャの構築

近日公開予定のリリースでは、以下のように書くこともできます:

module type M = [%mixins Map.OrderedType + Printable]
(* desugars to *)
module type M = sig 
   type t 
   include Map.OrderedType with type t := t
   include Printable with type t := t
end

追加機能

他の型をオーバーライドすることもできます。例えば:

type u [@@mixins Mappable(key = int; value := v)]
(* desugars to *)
type u
include Mappable with type t := u and type key = int and type value := v

制限事項

  • パラメトリック型のサポートなし(例:with type 'a u = 'a v
  • タプルおよび関数型のサポートなし(例:with type t = int -> bool

これはプリプロセッサがペイロードを式としてパースするためで、これらは式として綺麗にパースされません。 型パラメータを持つ mixin などのより深いサポートには、おそらく言語レベルのサポートも必要になるでしょう。

経験報告:Dune の依存グラフの改良

Robin Bate Boerop が発表しました

Dune の依存グラフの改良:モジュールごとのライブラリフィルタリング

Dune のライブラリ間依存関係追跡の改善に取り組んでおり、その経験を共有したいと思います。技術的な詳細と、この大規模なオープンソース OCaml プロジェクトへの初回コントリビュータとしての体験の両方を紹介します。

取り組んだ問題

libAlibB に依存している場合、Dune は libA のすべてのモジュールに libB のすべての .cmi ファイルへのグローバルな依存関係を与えます。libB の任意の .cmi が変更されると、libA のすべてのモジュールが再コンパイルされます。たとえ libB を参照しないモジュールであっても。

多くのライブラリを持つプロジェクトでは、これが不必要な再コンパイルの連鎖を生み出します。この問題を追跡している issue #4572 は 2021 年から開いています。

アプローチ

Dune はすでに ocamldep を実行してライブラリ内のモジュール依存関係を計算しています。重要な洞察:同じ出力がエントリモジュール名を通じて各モジュールがどのライブラリを参照しているかを教えてくれます。これを使って、ビルド依存関係と -I~/-H~ コンパイラフラグの両方をモジュールごとにフィルタリングできます。

実装(PR #14116PR #14186)は以下のように動作します:

  1. 各モジュールとそのライブラリ内のトランジティブな依存関係について、ocamldep の出力(.ml.mli の両方)を読み取ります
  2. -open フラグを含む参照されたすべてのモジュール名をユニオンします
  3. それらの名前を Lib_index を通じてライブラリにマッピングします
  4. Lib.closure を通じてフィルタリングされたライブラリセットをトランジティブにクローズします
  5. hidden deps と -I~/-H~ コンパイラフラグの両方に結果を使用し、requires_compile のメンバーシップに基づいて直接(-I 経由で可視)と hidden(-H 経由)に分割します

deps とフラグの両方がフィルタリングされると、モジュールが宣言していないライブラリを参照するとクリーンビルドが失敗します。以前は過度に広い -I フラグがそのようなエラーを隠してしまっていました。

最初の失敗

最初の試み(PR #14021)では、十分なテストカバレッジなしに単一の PR でフィルタリングを実装しようとしました。レビューで、私が予期していなかったエッジケース(特に透過的なモジュールエイリアスと仮想ライブラリ)でアプローチが脆弱であることが判明し、クローズされました。

課題

透過的なモジュールエイリアス。 OCaml のモジュールエイリアスメカニズムにより、ocamldep はモジュールがトランジティブに依存するすべてのライブラリを常に報告するわけではありません。libBmodule M = LibC.Something があり、libA のモジュールが LibB.M を使用している場合、ocamldepLibB を報告しますが LibC は報告しません。修正:Lib.closure を使ってフィルタリングされたライブラリセットをトランジティブにクローズし、コンパイルコンテキストで境界を設けます。

ルートモジュール。 (root_module) スタンザはコンパイルコンテキスト内のすべてのライブラリを暗黙的にエイリアスするモジュールを作成します。ocamldep がルートモジュールへの参照を報告する場合、実際にどの基礎ライブラリが必要かを判断できないため、完全な依存セットにフォールバックします。

仮想ライブラリ。 コンパイルコンテキストに仮想ライブラリの実装が存在する場合、パラメータライブラリが requires_compile に現れないことがあり、フィルタリングでそれらが欠落する可能性があります。これも別のフォールバックケースです。

Menhir で生成されたモジュール。 これらのモックモジュールは ocamldep の依存グラフに含まれないため、それらに対してはフィルタリングをスキップします。

null ビルドのオーバーヘッド。 フィルタリングは .d ファイルを読み取り、モジュールごとにライブラリクロージャを計算します。新しい dune プロセス(メモキャッシュなし)では、これは変更がなかったビルドを含むすべてのビルドで新しい作業になります。これは本物のトレードオフです:null ビルドのオーバーヘッドを代償に、インクリメンタルリビルドのパフォーマンスが向上します。

前提条件のテスト PR

実装 PR の前に、既存の動作を文書化し安全ネットを確立するためにテストのみの PR を 6 つ提出しました:

  • #14017 — 現在のライブラリ間再コンパイル動作を文書化するベースラインテスト
  • #14031 — スタンザとライブラリ間のモジュール名シャドウイングを文書化するテスト
  • #14100 — コンパイルルールとサンドボックスビルドにおけるライブラリファイル依存関係を検証するテスト
  • #14101 — 透過エイリアスのインクリメンタルビルドの安全性を検証するテスト
  • #14129 — エイリアスを再エクスポートするライブラリでのインクリメンタルビルドを検証するテスト
  • #14178 — 透過エイリアスチェーンでの ocamldep の動作を文書化するテスト

これにより実装 PR の diff が実際の変更に集中できるようになり、レビュアーに既存の動作が保持されているという確信を与えました。また、最初の試みでつまずいたエッジケースを理解するのにも役立ちました。

レビュープロセス

Dune のメンテナー(@rgrinberg@art-w)は、徹底的で建設的なレビューを提供してくれました。いくつかのハイライト:

  • 手作りのトランジティブクロージャを既存ライブラリの Lib.closure に置き換える提案 — 私が Dune の内部に慣れ親しんでいなければ見つけられなかったより洗練されたアプローチ
  • インターフェースが実装とは異なるライブラリを参照できるため、.ml.mli の両方の ocamldep 出力を読む必要があるという指摘
  • クリーンビルドをより精密にしキャッシングを改善するモジュールごとの -I~/-H~ フラグフィルタリングの提案
  • すべてのフォールバックケースと特殊なモジュール種類への質問、よりシンプルなコードにつながりました

PR はレビュー中に大幅なリファクタリングが行われました。最終バージョンは最初の提出よりかなりタイトになっています。

改善できること

全体的にこの作業は良い経験でしたが、いくつかの摩擦があった点がありました:

マージ前にベンチマークする方法がない。 null ビルドのオーバーヘッドの問題はプロセスの後半で浮上しました。手動ベンチマークにより、この変更が null ビルド時間を約 70% 増加させることを発見しました。これは重大なリグレッションです。Dune のベンチマーク CI ワークフローは PR ではなく main へのプッシュ時にのみ実行されます。コントリビューターがアクセスできるパフォーマンスツールがあれば、リグレッションがランドする前に検出できるでしょう。

レビューの勢い対リベース。 テスト PR は素早くマージされましたが、実装 PR は数日間にわたって複数のレビューラウンドを必要としました。ラウンドの合間に main が前進し、競合を引き起こす可能性のあるリベースが必要になります。コントリビューターはブランチを新鮮な状態に保つ負担を負います。PR が互いに依存している場合、これはさらに複雑になります。#14116 のすべてのリベースに #14186 のリベースも必要でした。GitHub は PR スタックのファーストクラスサポートを持っていないため、これは手動で誤りが生じやすいです。もちろん、すべての GitHub ホストリポジトリがこの問題を抱えています。

不安定な CI。 私のコードとは無関係なエラーが多くの CI 実行で発生しました。多くの場合、一時的に到達不能または障害が発生した OCaml パッケージの上流プロバイダーが原因でした。これらの問題はしばしば自然に解決されましたが、PR のライフタイムに 1 日遅延を引き起こしました。問題は CI ジョブで何度も繰り返し実行されるセットアップコードに起因しています。

振り返り

Dune コードベースはよく構造化されており、ビルドエンジン、ルール生成、スケジューラが明確に分離されています。品質も高く、品質維持に費やされた時間が価値あるものに感じられます。

cram テストインフラはテストに適していると感じました。各テストシナリオは期待される出力を持つ自己完結したシェルスクリプトであり、正確な再コンパイル動作を文書化・検証しやすくなっています。コードへの信頼感が生まれます。

メンテナーは対応が速く、レビュープロセスは徹底さにより時間がかかりましたが、協力的でプロフェッショナルです。メンテナーの皆さん、ありがとうございます!

Steffen Smolka が返信しました

GitHub has no first-class support for PR stacks

今はサポートされています:https://github.github.com/gh-stack/

OCaml 5.5.0 の最初のベータリリース

octachron が発表しました

ほとんどの開発ツールが利用可能になり、コンパイラの安定性も良好であるため、OCaml 5.5.0 の最初のベータリリースをお知らせします。

最後のアルファと比較して、この新バージョンは ocamlopt のマニュアルページを改善し、以下の問題を修正しています:

  • 2 つのランタイムバグ(ephemeron とバイトコードインタープリタ)
  • 2 つの型システムバグ(クラスとモジュール依存関数)
  • 3 つの警告またはエラーメッセージのバグ

(完全なリストは以下のチェンジログをご参照ください)。

関連するコンパイラツールについては、ほとんどが(少なくともプレビューバージョンとして)すでに利用可能であり、残りについてはパッチが進行中です。最後の更新作業はリリース準備メタ issueで追跡できます。

したがって、最終リリースの準備として、新しい OCaml 5.5.0 バージョンでライブラリやプログラムをテストするのが安全な段階です。すべてが順調に進めば、5月にリリースが見られるかもしれません。

バグを見つけた場合はGitHub issue トラッカーに報告してください。

新機能とバグ修正の完全なリストに興味がある方は、OCaml 5.5.0 のチェンジログが最も最新のリソースです。

Happy hacking, Florian Angeletti(OCaml チームを代表して)

インストール手順

opam 2.1 以降では、以下のコマンドで opam switch としてベースコンパイラをインストールできます:

opam update
opam switch create 5.5.0~beta1

ベータのソースコードは以下のアドレスでも入手できます:

詳細なコンパイラ設定

コンパイラの設定を調整したい場合は、以下でオプションバリアントに切り替えることができます:

opam update
opam switch create <switch_name> ocaml-variants.5.5.0~beta1+options <option_list>

ここで option_listocaml-option-* パッケージのスペース区切りリストです。例えば、flambda と no-flat-float-array の switch の場合:

opam switch create 5.5.0~beta1+flambda+nffa ocaml-variants.5.5.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array

利用可能なすべてのオプションは opam search ocaml-option で一覧表示できます。

最後のアルファからの変更点

  • ドキュメントの更新
    • #14684: ocamlopt のマニュアルページを改善 (Samuel Hym、Florian Angeletti によるレビュー)
  • ランタイムの修正
    • #14644, #14647: バイトコードでの未処理エフェクトに関連するバグを修正。 (Vincent Laviron、Thibaut Mattio による報告、 Nicolás Ojeda Bär、Stephen Dolan、Olivier Nicole によるレビュー)
    • #14349, #14718: ランタイム、ephemeron の orphaning のバグを修正 (Gabriel Scherer、Olivier Nicole と Damien Doligez によるレビュー、 Jan Midtgaard による報告)
  • 型システムの修正
    • #14557, #12150, #14696: クラスの自己型が型制約を通じてエスケープできないことを保証。 (Leo White、Florian Angeletti によるレビュー)
    • #14667: モジュール依存関数に対して適用関連の警告を有効化 (Florian Angeletti、Gabriel Scherer によるレビュー)
  • エラーメッセージと警告の修正
    • #14690: 期待される型がエイリアスの場合の Name_type_mismatch エラーメッセージを修正:等式の右辺に、エイリアスを 2 回ではなく、展開されたパスを表示するようにしました。 (Weixie Cui、Florian Angeletti によるレビュー)
    • #14719, #14721: モジュール依存関数のアリティを正しく計算 (Florian Angeletti、Jeremy Yallop による報告、Stefan Muenzel によるレビュー)
    • #14655, #14691: caml_ba_reshape でのサイズオーバーフローをチェック (Stephen Dolan、Xavier Leroy によるレビュー)

ocgtk 0.1: GTK 4 向け OCaml バインディング(プレビューリリース)

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

ocgtk preview1 リリースが opam に追加されました。

(preview0 は他の Linux ディストリビューションと Mac でビルドするために相当な作業が必要だったため、断念しました。完成まで助けてくれた @jmid に特別な感謝を。)

上記の機能に加えて、以下が含まれています:

  • より多くの GLib 型のサポート拡張。整数プリミティブ(guint8、int16、guint32 など)やリスト(GLib.SList と GLib.List)を含む
  • Gobject インターフェース

上記の組み合わせにより、パラメータや戻り値の型にこれらの型を含む場合に以前は除外されていたより多くのメソッドが生成可能になり、GTK(および関連ライブラリ)の API サーフェスがより広く利用できるようになりました。

次のステップ:現在の焦点はテストをより良く構造化し、gir_gen(GObject コードジェネレーター)を独立した dune プロジェクトに分割するための内部整理とリオーガナイゼーションです。これにより依存関係リストが大幅に削減され、以前の OCaml バージョンをターゲットにできるようになり、また gir_gen に関連するリリースの手間も軽減されます(ocgtk を使用するパッケージには gir_gen は不要です)。

過去の CWN

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

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