FFI exports: GHC native library с C-совместимыми точками входа #6

Closed
opened 2026-06-15 13:22:08 +02:00 by yorunikakeru · 0 comments
Owner

Скомпилировать Haskell ядро в нативную библиотеку и экспортировать функции для Rust.

C-экспорты

-- Planner.FFI
foreign export ccall "hs_planner_init" plannerInit :: IO ()
foreign export ccall "hs_plan" hsPlan
  :: CString  -- IR bytes (JSON)
  -> CInt     -- IR length
  -> CString  -- SystemState bytes (JSON)
  -> CInt     -- SystemState length
  -> Ptr CString  -- out: Plan JSON
  -> Ptr CInt     -- out: Plan length
  -> IO CInt      -- 0 = ok, 1 = error

Сборка

  • cabal target planner-core с ghc-options: -shared
  • nix flake выставляет libHSplanner-core.so как derivation output
  • hs_planner_init вызывает hsInit (обязателен для GHC RTS)

Байты через границу

  • IR передаётся как opaque bytes — Rust не парсит, Haskell десериализует через aeson
  • Plan и ошибка возвращаются как JSON-байты, Rust получает CString
  • Rust владеет памятью после копирования; Haskell не удерживает указатели

Acceptance

  • nm libHSplanner-core.so | grep hs_plan показывает символ
  • Вызов из C-тест программы возвращает корректный Plan JSON
Скомпилировать Haskell ядро в нативную библиотеку и экспортировать функции для Rust. ## C-экспорты ```haskell -- Planner.FFI foreign export ccall "hs_planner_init" plannerInit :: IO () foreign export ccall "hs_plan" hsPlan :: CString -- IR bytes (JSON) -> CInt -- IR length -> CString -- SystemState bytes (JSON) -> CInt -- SystemState length -> Ptr CString -- out: Plan JSON -> Ptr CInt -- out: Plan length -> IO CInt -- 0 = ok, 1 = error ``` ## Сборка - cabal target `planner-core` с `ghc-options: -shared` - nix flake выставляет `libHSplanner-core.so` как derivation output - `hs_planner_init` вызывает `hsInit` (обязателен для GHC RTS) ## Байты через границу - IR передаётся как opaque bytes — Rust не парсит, Haskell десериализует через aeson - Plan и ошибка возвращаются как JSON-байты, Rust получает CString - Rust владеет памятью после копирования; Haskell не удерживает указатели ## Acceptance - `nm libHSplanner-core.so | grep hs_plan` показывает символ - Вызов из C-тест программы возвращает корректный Plan JSON
Sign in to join this conversation.
No labels
core
ffi
haskell
rust
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
FrogOS/Planner#6
No description provided.