Pull to refresh

Ускоряем работу Erlang системы без замедления разработки

Reading time2 min
Views2.2K
Недавно появилась возможность использовать С для написания модулей Erlang систем (это по-моему удобнее любого из предложенных здесь методов). Возможно вы не знали о возможности использовать Haskell в связке с Erlang. Haskell очевидно не панацея и действительно критические участки кода вероятно всё равно придётся переписывать на С, но Haskell предлагает строгую типизацию и сокращение обьёма кода по сравнению с С. Я думаю что проще переписывать код с Erlang на Haskell чем на С, потому что оба языка функциоанльные. Haskell быстрее Erlang благодаря статической типизации и умной системе выведения типов. Предлагаю вашему вниманию вольный перевод статьи о Haskell/Erlang-FFI.


Типы эрланг представлены в хаскеле типом 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 простите что не оформил как перевод.
Tags:
Hubs:
+17
Comments7

Articles

Change theme settings