10. Типы передаваемые в Ptr
"Прикрепленные" (pinned):
[+] Можно напрямую передавать во внешний
код(*)
[-] Не перемещаются GC — приводят к
фрагментации памяти
[-] Приводят к повышенному потреблению памяти
"Не прикрепленные" (Unpinned):
[+] перемещаются GC
[-] нельзя напрямую передавать во внешний код(*)
13. Foreign.StablePtr— структура данных
гарантирована не будет удалена, пока не будет
вызвано hs_free_stable_ptr, freeStablePtr
полезен, гарантировать управление памятью из
внешнего языка и удалению без возвращения
исполнения RTS
позволяет сохранять состояние при перезгрузке
ghci/модулей
сохранение функции с C коде для её
последующего запуска
typedef void *HsStablePtr;
15. Для создания Storable структур отвеачающих
структура внешних языков нужна дополнительная
информация, такая как отступы, размеры структур и
другие бонусы.
hsc2hs
Дает использовать макросы
peek,poke,ptr,enum, sizeof
.hsc
build-tool: hsc2hs
достаточно низкоуровневый
20. система должна вести себя так, как будто каждый
Haskell поток реализован потоком OS.
safe вызов блокирует только тот поток, который
выполняет вызов
программист может указывать, что группа вызовов
должна происходить из одного потока OS
Haskell потоки созданные вызовами из внешнего
языка должны быть независимы от времени жизни
вызвавшей их функции
22. Для политики управления потоками RTS, нет разницы
какой способ создания потока использовался.
FORKIO, FORKOS, FORKON
bound-to-
OS
bound-to-
HEC
bound-to-
CPU
forkOS + - *
forkOn - + -qa
forkIO - - -
callback + - *
23. CAPIFFI
Можно импортировать значения:
Происходит проверка типов
Аннотации типов
foreign import capi "pi.h value pi" :: Double
const double pi = 3.14
#define pi 3.14
/tmp/ghc3535_0/ghc_3.c:8:1:
error: too few arguments to function ‘test’
HsInt ghczuwrapperZC0ZCmainZCMainZCtest(HsInt a1) {return test(a1);}
pi.h:7:5:
note: declared here
int test(int,int);
data {# CTYPE "unistd.h" "useconds_t" #} T = ...
26. АВТОМАТИЗАЦИЯ
c2hs
специфический синтаксис
не работает со сложными типами (GADT, Kinds)
периодически проявляются баги на различных
архитектурах
библиотеки автоматической генерации байндингов
inline-c
не аккуратная сборка
использование TH - проблемы с линкером
27. скорее всего, это никогда не понадобится, но хорошо
знать, что оно есть
28. C--
Один из промежуточных языков при компиляции GHC.
https://ghc.haskell.org/trac/ghc/wiki/Commentary/Rts/Cmm
https://ghc.haskell.org/trac/ghc/wiki/Commentary/Compiler/Cm
Но на нём можно писать код!