Using OxCaml to implement type-safe reference counting between OCaml and Python

Bài tóm tắt Jane Street 2026 4. Điều chỉnh Độ khó: Khó

Jane Street · 2026 · 4. Điều chỉnh · Độ khó: Khó — bài gốc

Bối cảnh

  • Jane Street là công ty OCaml, nhưng Python là ngôn ngữ chính thứ hai, công cụ chủ yếu của trader và researcher cho phân tích dữ liệu và ML; hạ tầng phần lớn là OCaml.
  • PyOCaml cho phép tác giả thư viện OCaml mở giao diện Python. Một object Python được bọc thành giá trị OCaml Py.Object.t (custom block 8 byte trên heap toàn cục): bọc thì tăng refcount, chỉ giảm khi GC của OCaml chạy finalizer.
  • Hệ quả: việc giải phóng một data frame nhiều GB (hay bộ nhớ GPU) bị buộc vào lúc GC của OCaml tình cờ chạy. GC lại chỉ thấy 8 byte nên không có lý do gấp. Theo bài, viết Python tránh được chuyện này là có thể về lý thuyết nhưng đòi hỏi độ cẩn thận phi thực tế.

Thay đổi chính

  • Dùng mode của OxCaml để mã hoá quyền sở hữu tham chiếu trong type:
    • Tham số @ local (không thoát khỏi lời gọi): glue code dựng Py.Object.t không tăng refcount, không finalizer, đặt con trỏ về NULL khi hàm trả về. Phần lớn API Python chỉ "mượn" tham số nên đổi được.
    • Kết quả @ unique (handle duy nhất): glue code "lấy" thẳng con trỏ trả cho Python, không tăng refcount; finalizer phải chịu được con trỏ NULL.
    • Từ khoá borrow_ (compiler vừa hỗ trợ) để truyền tạm một giá trị unique vào hàm nhận local mà không mất tính unique.
  • Lối thoát cho quản lý tay: Py.newref (local → unique), Py.decref (tiêu thụ unique). ppx_release (let%release df = …) giải phóng sớm cả khi có exception.

Vì sao

  • Chuyển lỗi giữ object quá lâu từ "phải cẩn thận" sang "không viết ra được": compiler bảo đảm tĩnh rằng Python dùng các API đã chuyển sẽ không bị trễ giải phóng.
  • Theo bài, khác Rust ở chỗ không bắt mọi người dùng API phải theo dõi sở hữu; code thường vẫn để GC lo khi an toàn ("chỉ ở chỗ cần" theo mục tiêu của OxCaml).

Bài học cho SWE

  • Cầu nối giữa hai runtime khác cơ chế bộ nhớ (refcount và tracing GC) sinh ra độ trễ giải phóng mà không bên nào thấy; tài nguyên đắt (GPU, frame lớn) làm nó thành vấn đề thật.
  • Đưa quy ước sở hữu vào type system thay cho tài liệu và review.

Liên quan