使用Haskell和Hubris加强Ruby(31)

发布于2019-04-21 20:36:25

在Ruby或者Rails应用中嵌入C代码是解决性能瓶颈的办法之一,RubyInline大大简化了这个过程。Ruby社区也紧紧地和其他的函数语言社区联系在一起,包括Erlang、Caml和Haskell:Erlectricity已经成为和Erlang连接的纽带,而rocaml则可以与Objective Caml进行交互。Apache的Thrift则是以另外一种方式(通过PRC和序列化格式)与其他语言交互。

Mark Wotton编写了Hubris,使得在Ruby中调用Haskell代码成为可能。你只需要安装Haskell平台所带的ghc来兼容jhc(John的Haskell编译器),不过你必须注意的是,jhc只能运行在Linux或者Mac平台下。

一旦你有这些需求,你需要首先编写一个Haskell文件,在自定义的函数处添加额外的调用导出命令,例如Test.hs


fibonacci :: Int -> Int
fibonacci n = fibs !! n
  where fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

然后你需要调用jhc_builder.sh Test.hs来创建动态库(libdynhs.so)。

接下来你可以放心大胆地编写Ruby代码,并且使用Ruby/DL加载动态库调用导出的函数了。


require 'dl/import'
 
module HaskyPants
  extend DL::Importable
  dlload "./libdynhs.so"
  extern "int fibonacci_hs(int)"
end
 
puts HaskyPants.fibonacci_hs(12)

Mark将会在九月份举办的rorosyd做一个关于Hubris的讲座。尽管只是初步意向,但是这个讲座肯定会吸引一些Haskell的用户。

查看英文原文:Empower Your Ruby With Haskell And Hubris