Недавно появилась возможность использовать С для написания модулей Erlang систем (это по-моему удобнее любого из предложенных здесь методов). Возможно вы не знали о возможности использовать Haskell в связке с Erlang. Haskell очевидно не панацея и действительно критические участки кода вероятно всё равно придётся переписывать на С, но Haskell предлагает строгую типизацию и сокращение обьёма кода по сравнению с С. Я думаю что проще переписывать код с Erlang на Haskell чем на С, потому что оба языка функциоанльные. Haskell быстрее Erlang благодаря статической типизации и умной системе выведения типов. Предлагаю вашему вниманию вольный перевод статьи о Haskell/Erlang-FFI.
Типы эрланг представлены в хаскеле типом ErlType.
Конвертация типов осуществляется для типов порождённых от стандартных с помощью функции toErlang.
Для создания узла (ноды) с хаскел кодом используется функция createSelf принимающая имя ноды.
Для создания erlang-style процесса (SIP) используется функция createMBox принимающая в качестве параметра узел на котором следует запустить новый процесс.
Для того что бы отослать сообщение используется функция mboxSend принимающая 4 параметра: хаслел процесс который посылает сообщение, «имя» эрланг ноды, pid и само сообщение. Сообщение любой тип эрланг. Структура Pid несколько сложнее: либо Left pid, где pid — это идентификатор эрланг процесса, либо Right name, где name — строка с именем процесса.
С получением сообщений всё проще:
Так же существует возможность более высокоуровневого взаимодействия:
Не сложно догадатся что genCall осуществляет синхронный вызов процесса с gen_server на эрланг ноде, а genCast — асинхронный.
Так же можно синхронно и асинхронно вызывать функции из эрланговских модулей
Не реализованы в данном релизе возможности связывания (linking) процессов, передачи ошибок, регистрации хаскел процессов в Erlang Port Mapper Daemon.
Скачать можно тут hackage.haskell.org/package/erlang.
PS простите что не оформил как перевод.
Типы эрланг представлены в хаскеле типом ErlType.
Конвертация типов осуществляется для типов порождённых от стандартных с помощью функции toErlang.
ghci> toErlang [("a", 1), ("b", 2)]
ErlList [ErlTuple [ErlString "a",ErlBigInt 1],ErlTuple [ErlString "b",ErlBigInt 2]]
ghci> fromErlang $ ErlList [ErlTuple [ErlString "a",ErlBigInt 1],ErlTuple [ErlString "b",ErlBigInt 2]] :: [(String, Int)]
[("a",1),("b",2)]
Для создания узла (ноды) с хаскел кодом используется функция createSelf принимающая имя ноды.
self <- createSelf "haskell@localhost"
Для создания erlang-style процесса (SIP) используется функция createMBox принимающая в качестве параметра узел на котором следует запустить новый процесс.
mbox <- createMBox self
Для того что бы отослать сообщение используется функция mboxSend принимающая 4 параметра: хаслел процесс который посылает сообщение, «имя» эрланг ноды, pid и само сообщение. Сообщение любой тип эрланг. Структура Pid несколько сложнее: либо Left pid, где pid — это идентификатор эрланг процесса, либо Right name, где name — строка с именем процесса.
mboxSend mbox node pid msg
С получением сообщений всё проще:
msg <- mboxRecv mbox
Так же существует возможность более высокоуровневого взаимодействия:
reply <- genCall mbox node pid msg
genCast mbox node pid msg
Не сложно догадатся что genCall осуществляет синхронный вызов процесса с gen_server на эрланг ноде, а genCast — асинхронный.
Так же можно синхронно и асинхронно вызывать функции из эрланговских модулей
reply <- rpcCall mbox node module function arguments
rpcCast mbox node module function arguments
Не реализованы в данном релизе возможности связывания (linking) процессов, передачи ошибок, регистрации хаскел процессов в Erlang Port Mapper Daemon.
Скачать можно тут hackage.haskell.org/package/erlang.
PS простите что не оформил как перевод.